Android源错误读取SD卡从文件 [英] Android source error reading file from sdcard

查看:285
本文介绍了Android源错误读取SD卡从文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我修改Android源(AOSP)来创建一个文件 / SD卡/ MYFILE 。该文件被正确创建,是可见的,当我做了猫/ SD卡/ MYFILE 亚行外壳。 (从 PackageManagerService 创建的文件,它是应用程序框架层的部分)

然而,当我尝试使用通过code访问该文件新的FileReader(MYFILE)来自同一个包管理器服务code,我得到的以下情况除外:

  java.io.FileNotFoundException:/ SD卡/ MYFILE(权限被拒绝)

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

  ---- rwxr-X系统sdcard_rw 344 2013年3月15日08:39 MYFILE

什么可能我是做错了什么?我检查的文件名是通过登录我试图访问和 ING它的文件名是正确的。

更新

下面是完整的堆栈跟踪:

  W / System.err的(67):java.io.FileNotFoundException:/ SD卡/ MYFILE(权限被拒绝)
W / System.err的(67):在org.apache.harmony.luni.platform.OSFileSystem.open(本机方法)
W / System.err的(67):在dalvik.system.BlockGuard $ WrappedFileSystem.open(BlockGuard.java:232)
W / System.err的(67):在java.io.FileInputStream中的<&初始化GT;(FileInputStream.java:80)。
W / System.err的(67):在java.io.FileInputStream中的<&初始化GT;(FileInputStream.java:132)。
W / System.err的(67):在java.io.FileReader&下;初始化>(FileReader.java:66)。
W / System.err的(67):在org.csrdu.apex.policy.ApexPackagePolicy.getPolicyReader(ApexPackagePolicy.java:224)
W / System.err的(67):在org.csrdu.apex.policy.ApexPackagePolicy.loadPoliciesForPackage(ApexPackagePolicy.java:82)
W / System.err的(67):在org.csrdu.apex.AccessManager.checkExtendedPermissionByPackage(AccessManager.java:56)
W / System.err的(67):在com.android.server.PackageManagerService.checkUidPermission(PackageManagerService.java:1703)
W / System.err的(67):在com.android.server.am.ActivityManagerService.checkComponentPermission(ActivityManagerService.java:4096)
W / System.err的(67):在com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:1960)
W / System.err的(67):在com.android.server.am.ActivityStack.startActivityMayWait(ActivityStack.java:2516)
W / System.err的(67):在com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:2081)
W / System.err的(67):在android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:142)
W / System.err的(67):在com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:1467)
W / System.err的(67):在android.os.Binder.execTransact(Binder.java:320)
W / System.err的(67):在dalvik.system.NativeStart.run(本机方法)


解决方案

为什么亚行外壳可以访问它,而PackageManagerService不能?

该PackageManagerService运行与用户系统。而且它不是在组sdcard_rw运行。所以,根据你提供的权限,权限否定遇到过。然而,由于使用用户亚行外壳亚行外壳可以访问它,,它已被授予访问SD卡(sdcard_rw组内)的许可权。

 <权限名称=android.permission.WRITE_EXTERNAL_STORAG​​E>
    < GID组=sdcard_rw/>
< /许可>
<分配,权限名称=android.permission.WRITE_EXTERNAL_STORAG​​EUID =壳/>

为什么PackageManagerService与用户系统运行?

PackageManagerService开始在SystemServer.java的INIT2方法。

  PM = PackageManagerService.main(背景下,
                !factoryTest = SystemServer.FACTORY_TEST_OFF);

该SystemServer由ZygoteInit.java启动。

 字符串ARGS [] = {
        --setuid = 1000,
        --setgid = 1000,
        --setgroups = 1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,3001,3002,3​​003
        --capabilities = 130104352,130104352
        --runtime-INIT
        --nice名= system_server
        com.android.server.SystemServer
    };
    ....
    / *请求叉系统服务器进程* /
    PID = Zygote.forkSystemServer(
                parsedArgs.uid,parsedArgs.gid,
                parsedArgs.gids,DebugFlags中,空,
                parsedArgs.permittedCapabilities,
                parsedArgs.effectiveCapabilities);

和检查什么的UID值android_filesystem_config.h意味着:

 的#define AID_ROOT 0 / *传统的UNIX root用户* /#定义AID_SYSTEM 1000 / *系统服务器* /#定义AID_RADIO 1001 / *电话子系统,RIL * /
#定义AID_BLUETOOTH 1002 / *蓝牙子系统* /
#定义AID_GRAPHICS 1003 / *图形设备* /
#定义AID_INPUT 1004 / *输入设备* /
#定义AID_AUDIO 1005 / *音频设备* /
#定义AID_CAMERA 1006 / *摄像设备* /
#定义AID_LOG 1007 / *日志设备* /
#定义AID_COMPASS 1008 / *罗盘装置* /
#定义AID_MOUNT 1009 / * mountd的插座* /
#定义AID_WIFI 1010 / *无线子系统* /
#定义AID_ADB 1011 / *的Andr​​oid调试桥(adbd)* /
#定义AID_INSTALL 1012 / *组安装软件包* /
#定义AID_MEDIA 1013 / *媒体服务器进程* /
#定义AID_DHCP 1014 / * DHCP客户端* /
#定义AID_SDCARD_RW 1015 / *外部存储的写入权限* /

所以,系统服务器与用户系统,没有sdcard_rw组运行,所以不PackageManagerService。

为什么仍然允许添加否认后系统sdcard_rw组?

我建立在Linux上的文件:

  ---- ---- RW 1杰梅因 - 开发商0 3月12日23:01一

所以用户开发组可以RW它。

和我通过添加到杰梅因开发商组:

  usermod命令-a -G develoeprs杰梅因 - 

但是,用户杰梅因 - 仍不能访问该文件。 Linux将拒绝来自业主在这种情况下访问而不检查组。

如何解决?

在CHMOD您创建该文件。

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)

解决方案

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.

这篇关于Android源错误读取SD卡从文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆