4

ファイルを作成するために Android ソース (AOSP) を変更しています/sdcard/myfile。ファイルは適切に作成され、cat /sdcard/myfilefromを実行すると表示されますadb shell。(ファイルはPackageManagerService、アプリケーション フレームワーク レイヤーの一部から作成されます)

ただし、同じパッケージ マネージャー サービス コードを使用してコードからファイルにアクセスしようとするとnew FileReader(myfile)、次の例外が発生します。

java.io.FileNotFoundException: /sdcard/myfile (Permission denied)

私のファイルのアクセス許可は次のとおりです。

----rwxr-x system   sdcard_rw      344 2013-03-15 08:39 myfile

私は何を間違っているのでしょうか?アクセスしようとしているファイル名をログに記録して、ファイル名が正しいことを確認しましcatた。

更新

完全なスタック トレースは次のとおりです。

W/System.err(   67): java.io.FileNotFoundException: /sdcard/myfile (Permission denied)
W/System.err(   67):    at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
W/System.err(   67):    at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
W/System.err(   67):    at java.io.FileInputStream.<init>(FileInputStream.java:80)
W/System.err(   67):    at java.io.FileInputStream.<init>(FileInputStream.java:132)
W/System.err(   67):    at java.io.FileReader.<init>(FileReader.java:66)
W/System.err(   67):    at org.csrdu.apex.policy.ApexPackagePolicy.getPolicyReader(ApexPackagePolicy.java:224)
W/System.err(   67):    at org.csrdu.apex.policy.ApexPackagePolicy.loadPoliciesForPackage(ApexPackagePolicy.java:82)
W/System.err(   67):    at org.csrdu.apex.AccessManager.checkExtendedPermissionByPackage(AccessManager.java:56)
W/System.err(   67):    at com.android.server.PackageManagerService.checkUidPermission(PackageManagerService.java:1703)
W/System.err(   67):    at com.android.server.am.ActivityManagerService.checkComponentPermission(ActivityManagerService.java:4096)
W/System.err(   67):    at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:1960)
W/System.err(   67):    at com.android.server.am.ActivityStack.startActivityMayWait(ActivityStack.java:2516)
W/System.err(   67):    at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:2081)
W/System.err(   67):    at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:142)
W/System.err(   67):    at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:1467)
W/System.err(   67):    at android.os.Binder.execTransact(Binder.java:320)
W/System.err(   67):    at dalvik.system.NativeStart.run(Native Method)
4

1 に答える 1

6

PackageManagerServiceがアクセスできないのに、なぜadbシェルがアクセスできるのですか?

PackageManagerServiceは、ユーザーとともに実行されますsystem。そしてそれはグループsdcard_rwで実行されません。したがって、提供する権限に応じて、権限の拒否が発生しました。shellただし、 sdcard(sdcard_rwグループ内)へのアクセス許可が付与されているユーザーを使用するadbシェルのため、adbシェルはそれにアクセスできます。

<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
    <group gid="sdcard_rw" />
</permission>
<assign-permission name="android.permission.WRITE_EXTERNAL_STORAGE" uid="shell" />

PackageManagerServiceがユーザーシステムで実行されるのはなぜですか?

PackageManagerServiceは、SystemServer.javaのinit2メソッドで開始されます。

pm = PackageManagerService.main(context,
                factoryTest != SystemServer.FACTORY_TEST_OFF);

SystemServerはZygoteInit.javaによって起動されます。

    String args[] = {
        "--setuid=1000",
        "--setgid=1000",
        "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,3001,3002,3003",
        "--capabilities=130104352,130104352",
        "--runtime-init",
        "--nice-name=system_server",
        "com.android.server.SystemServer",
    };
    ....
    /* Request to fork the system server process */
    pid = Zygote.forkSystemServer(
                parsedArgs.uid, parsedArgs.gid,
                parsedArgs.gids, debugFlags, null,
                parsedArgs.permittedCapabilities,
                parsedArgs.effectiveCapabilities);

そして、それらのuid値がandroid_filesystem_config.hで何を意味するかを確認します。

#define AID_ROOT             0  /* traditional unix root user */

#define AID_SYSTEM        1000  /* system server */

#define AID_RADIO         1001  /* telephony subsystem, RIL */
#define AID_BLUETOOTH     1002  /* bluetooth subsystem */
#define AID_GRAPHICS      1003  /* graphics devices */
#define AID_INPUT         1004  /* input devices */
#define AID_AUDIO         1005  /* audio devices */
#define AID_CAMERA        1006  /* camera devices */
#define AID_LOG           1007  /* log devices */
#define AID_COMPASS       1008  /* compass device */
#define AID_MOUNT         1009  /* mountd socket */
#define AID_WIFI          1010  /* wifi subsystem */
#define AID_ADB           1011  /* android debug bridge (adbd) */
#define AID_INSTALL       1012  /* group for installing packages */
#define AID_MEDIA         1013  /* mediaserver process */
#define AID_DHCP          1014  /* dhcp client */
#define AID_SDCARD_RW     1015  /* external storage write access */

したがって、システムサーバーはsystemsdcard_rwグループなしでuserで実行され、PackageManagerServiceも実行されます。

sdcard_rwグループにシステムを追加した後も許可が拒否されるのはなぜですか?

Linuxでファイルを作成します。

----rw---- 1 jermaine developers 0 Mar 12 23:01 a

したがって、開発者グループのユーザーはそれをrwできます。

そして、次の方法でjermaineを開発者グループに追加します。

usermod -a -G develoeprs jermaine

ただし、ユーザーjermaineは引き続きそのファイルにアクセスできません。この場合、Linuxはグループをチェックせずに所有者からのアクセスを拒否します。

直し方?

そのファイルを作成した後のchmod。

于 2013-03-15T04:20:09.103 に答える