系统应用的 Android 运行时权限

Posted

技术标签:

【中文标题】系统应用的 Android 运行时权限【英文标题】:Android runtime permission for system apps 【发布时间】:2016-09-04 23:28:02 【问题描述】:

关于 android 运行时权限的问题。 AFAIK,android 在运行时授予危险权限。我重置了我的手机,然后 adb pull /data/system/users/0/runtime-permissions.xml,我发现 android.ui.system 已经授予了许多危险的权限。谁能告诉我它是怎么做的?

【问题讨论】:

有些权限是不需要授予的,详情请看这里:-coderzpassion.com/android-new-runtime-permissions 感谢贾吉特。这是 runtime-permissions.xml 的一部分, 如您所见,这些权限是危险的权限,应该在运行时授予。但是他们在第一次启动时已经被授予,很困惑。 您的设备从 5 升级到 6 了吗? 我的设备是 Android 6.0.1。应该是因为系统在某处为“android.uid.system”设置了默认运行时权限吗?因为这是一个特殊的系统 uid。 【参考方案1】:

通过用户确认对话框将dangerous runtime permissions 插入/data/system/users/0/runtime-permissions.xml 文件的机制仅适用于第三方应用程序,与内置应用程序无关。

对于内置/系统应用程序和框架组件,所有 默认情况下,在创建新用户或创建新用户时授予权限 当设备启动并触发 systemReady 事件时

您可以从 AOSP 看到AndroidManifest.xml,其中为系统组件编写了所有类型的所需权限。

对于第三方应用程序,当用户授予任何运行时权限时,它会被添加到文件/data/system/users/0/runtime-permissions.xml 中。当用户从任何第三方应用程序中撤消权限时,该权限将从文件中删除。在完全恢复出厂设置的情况下,所有第三方应用的运行时权限都会被删除,因为/data/system/users/0/runtime-permissions.xml 会被删除(数据分区擦除)。

但即使在恢复出厂设置后,/data/system/users/0/runtime-permissions.xml 仍包含系统应用程序的运行时权限(甚至是危险的),请参阅默认权限:runtime-permissions.xml。

它的发生是因为:

所有默认权限均来自 PackageManagerService,通过这两种方式:

newUserCreated() //this get called when new user is created   
systemReady() //this get called when device is booted

上述方法内部调用:

DefaultPermissionPolicy.grantDefaultPermissions();

Have a look at How DefaultPermissionPolicy triggers

如果你看到DefaultPermissionPolicy's implementation,它 包含加载所有类型权限的所有相关方法 系统组件。

特别是DefaultPermissionPolicy.grantDefaultPermissions() 内部调用

grantPermissionsToSysComponentsAndPrivApps(userId); grantDefaultSystemHandlerPermissions(userId);

它在内部调用grantRuntimePermissionsLPw()、which performs all the remaining work.

【讨论】:

感谢 shridutt kothari。一开始没有runtime-permissions.xml,然后PackageManagerService启动并生成runtime-permissions.xml。为了更清楚地理解这一点,您能否帮助指出授予 android.uid.system 的运行时权限,如 runtime-permissions.xml 文件中所示。 我在 RuntimePermissionPersistence 类中找到了下面的代码。但我没有找到 android.uid.system 的 PermissionState 设置为授予的位置。 final int sharedUserCount = permissionsForSharedUser.size(); for (int i = 0; i permissionStates = permissionsForSharedUser.valueAt(i); serializer.startTag(null, TAG_SHARED_USER); serializer.attribute(null, ATTR_NAME, packageName); writePermissions(序列化程序,permissionStates); serializer.endTag(null, TAG_SHARED_USER); 感谢 Shridutt,它对我非常有用。我查看了源代码,找到了这个, private void grantPermissionsToSysComponentsAndPrivApps(int userId) Log.i(TAG, "Granting permissions to platform components for user " + userId);但是设备启动后我找不到这个日志。 你能帮忙回答另一个问题吗? ***.com/questions/37186761/…

以上是关于系统应用的 Android 运行时权限的主要内容,如果未能解决你的问题,请参考以下文章

运行时权限

Android应用申请运行时权限(Permission)示例

聊聊Android6.0 以上系统权限

Android6.0运行时权限

Android 6.0 运行时权限处理

请求运行时权限时检查 Android 版本