关于 Android 运行时权限的问题。AFAIK,android 在运行时授予危险权限。我重置了我的手机,然后 adb pull /data/system/users/0/runtime-permissions.xml,我发现 android.ui.system 已经授予了许多危险的权限。谁能告诉我它是怎么做的?
1 回答
通过用户确认的对话框将危险的运行时权限插入文件的机制/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()
,它执行所有剩余的工作。