9

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

4

1 回答 1

25

通过用户确认的对话框将危险的运行时权限插入文件的机制/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();

看看 DefaultPermissionPolicy 如何触发

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

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

grantPermissionsToSysComponentsAndPrivApps(userId); grantDefaultSystemHandlerPermissions(userId);

它在内部调用grantRuntimePermissionsLPw()它执行所有剩余的工作。

于 2016-05-10T07:12:23.493 回答