2013-03-15 86 views
3

我正在修改Android源代码(AOSP)以创建文件/sdcard/myfile。该文件已正确创建,并且在我从adb shell执行cat /sdcard/myfile时可见。从sdcard读取文件的Android源代码错误

然而,当我试图通过使用new FileReader(myfile)来自同一个包管理服务代码的代码来访问文件(从PackageManagerService这是应用程序框架层的部分中创建的文件),我得到以下异常:

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

我的文件的权限是这样的:

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

什么可能我是做错了什么?我已经通过记录我试图访问的文件名和文件名来检查文件名是否正确。

更新

下面是完整的堆栈跟踪:

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) 
+0

检查您的sdcare安装或未安装? – QuokMoon 2013-03-15 04:15:16

+0

如果可能,请提供错误日志和代码 – cwhsu 2013-03-15 04:15:42

+0

@altaf,是的。我可以通过'adb shell'正确访问它。 @cwhsu提供日志,但我认为只有第一行是相关的。 :( – recluze 2013-03-15 04:18:09

回答

4

为什么亚行外壳,同时PackageManagerService不能访问它?

PackageManagerService与用户system一起运行。它不会在组sdcard_rw中运行。所以根据您提供的权限,遇到了权限拒绝。但是,adb shell可以访问它,因为adb shell使用的用户shell已被授予访问sdcard的权限(在sdcard_rw组中)。

<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 */ 

因此,与用户system系统服务器运行,无需sdcard_rw组,也是如此PackageManagerService。

为什么在将系统添加到sdcard_rw组后仍然会拒绝权限?

我在Linux上建立一个文件:

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

所以用户在开发者群体能RW它。

usermod -a -G develoeprs jermaine 

但是,用户jermaine仍不能访问该文件:

而且我通过添加杰梅因进入开发组。在这种情况下,Linux将拒绝所有者的访问,而不检查组。

如何解决?

chmod创建该文件后。

+0

非常感谢,这非常明显。 ,我在'/ frameworks/base/data/etc/platform.xml'中为'system'添加了'assign-permission',但仍然遇到同样的问题。'cat platform.xml'表明权限确实存在,但是不存在( – recluze 2013-03-15 04:48:55

+0

)对不起,我意识到PackageManager本身使用了assign-permission,所以它不起作用,你可以试试给--setgroups = 1001,1002,1003,1004,1005,1006添加1015, ZygoteInit.java中的1007,1008,1009,1010,3001,3002,3003 @ @luluze – StarPinkER 2013-03-15 04:57:22

+0

已经按照你的建议(2)尝试过了。谢谢:) ..将发布,如果它的作品。 – recluze 2013-03-15 04:59:38