问题
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)
回答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