Android source error reading file from sdcard

android, android-sdcard, android-source

Solution

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.

Problem

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 `cat`ing 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) ```

Original source