系统应用的 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 的一部分,通过用户确认对话框将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 运行时权限的主要内容,如果未能解决你的问题,请参考以下文章