即使在获得平台签名后也无法读取系统文件

时间:2014-02-12 04:35:35

标签: android android-permissions

我已经构建了一个自定义的Android ROM。我已经使用平台签名对我的应用程序进行了签名,并在清单文件中添加了android:sharedUserId="android.uid.system"。我的应用程序被授予所有“签名”和“系统”级别权限,但不授予对系统文件的访问权。

    Log.w("PC", String.valueOf(checkCallingOrSelfPermission("android.permission.ACCESS_SURFACE_FLINGER")== PackageManager.PERMISSION_GRANTED)); // true
    Log.w("PC", String.valueOf(checkCallingOrSelfPermission("android.permission.READ_FRAME_BUFFER")== PackageManager.PERMISSION_GRANTED));      // true
    Log.w("PC", String.valueOf(checkCallingOrSelfPermission("android.permission.INJECT_EVENTS")== PackageManager.PERMISSION_GRANTED));          // true

    Log.w("PC", String.valueOf(new File("/dev/graphics/fb0").canRead()));                      // false
    Log.w("PC", String.valueOf(new File("/data/misc/wifi/wpa_supplicant.conf").canRead()));   // false

文件的权限是:

ls -l /dev/graphics/fb0
crw-rw---- root     graphics  29,   0 2014-02-12 09:43 fb0

ls -l /data/misc/wifi/wpa_supplicant.conf
-rwxrwx--- wifi     wifi          282 2014-02-11 19:04 wpa_supplicant.conf

有没有办法访问这些文件?

3 个答案:

答案 0 :(得分:5)

我找到了解决方法。除了平台签名和android:sharedUserId="android.uid.system"之外,您还需要在清单文件的android:process="system"部分添加<application />

答案 1 :(得分:1)

每个Android应用都使用独特的Linux UID / GID运行。显然,您不是这些文件的所有者或组。最简单的方法是将文件权限更改为全局可读。不确定该场景中这些文件的安全隐患。你应该能够通过ad在adb shell中做到这一点。永久的方法是在进行构建时更改文件权限。如果您的应用程序是自定义ROM所包含的内容,则可以设置GID。请查看system / core / include / private / android_filesystem_config.h以获取默认的UID / GID权限。

答案 2 :(得分:0)

您的系统用户没有图形/ wifi组权限。系统用户不是超级用户,也有局限性。

我不知道你正在构建什么平台,但在我的平台上,我没有可能默认要求wifi和图形权限。您需要创建权限。

在你的android_filesystem_config.h中你可以看到已经定义了AID_GRAPHICS和AID_WIFI,这意味着已经完成了一半的工作(如果你想创建全新的权限,你必须将它们添加到这个文件中)。 AID定义也映射到&#34;变量&#34;在同一文件中的结构中。 以下是我的代码片段:

static const struct android_id_info android_ids[] = {
{ "root",          AID_ROOT, },

{ "system",        AID_SYSTEM, },

{ "radio",         AID_RADIO, },
{ "bluetooth",     AID_BLUETOOTH, },
{ "graphics",      AID_GRAPHICS, },

第二步是将它们添加到platform.xml。可能是平台相关的,但我可以在/ frameworks / base / data / etc中找到我的platform.xml。 以下是权限定义的示例

<permission name="android.permission.GRAPHICS" >
    <group gid="graphics" />
</permission>

android.permission.GRAPHICS 只是一个例子,您可以随意调用它。 在权限资源内部,您可以定义要为调用此权限的用户提供的gid。您在此处使用的gid需要与android_filesystem_config.h文件中定义的gid相同。

现在您已经创建了权限,您可以在应用程序AndroidManifest.xml中调用它

<uses-permission android:name="android.permission.GRAPHICS" />

您现在应该具有图形组权限,并且能够读取/ dev / graphics / fb0