Android source error reading file from sdcard

爷,独闯天下 提交于 2019-12-12 14:35:22

问题


I'm modifying the Android source (AOSP) to create a file /sdcard/myfile. The file is created properly and is visible when I do a cat /sdcard/myfile from adb shell. (The file is created from PackageManagerService which is part of the application framework layer)

However, when I try to access the file through code using new FileReader(myfile) from the same package manager service code, I get the following exception:

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

The permissions on my file are this:

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

What might I be doing wrong? I've checked that the filename is correct by logging the filename I'm trying to access and cating it.

Update:

Here's the complete stack trace:

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)

回答1:


Why adb shell can access it while PackageManagerService cannot?

The PackageManagerService runs with the user system. And it it not run in the group sdcard_rw. So according to the permissions your provide, a permission denial encountered. However, adb shell could access it, because adb shell using the user shell, which has been granted the permission to access sdcard(within sdcard_rw group).

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

Why PackageManagerService runs with the user system?

PackageManagerService is started in the init2 method of SystemServer.java.

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

The SystemServer is started by 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);

And check what those uid values mean in 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 */

So system server run with user system, without sdcard_rw group, so does PackageManagerService.

Why still permission deny after add system to sdcard_rw group?

I create a file on Linux:

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

So user in developers group can rw it.

And I add jermaine into the developers group by:

usermod -a -G develoeprs jermaine

However, the user jermaine can still not access that file. Linux will deny the access from owner in this case without checking the group.

How to fix?

chmod after your create that file.



来源:https://stackoverflow.com/questions/15424603/android-source-error-reading-file-from-sdcard

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!