Android 系统应用的运行时权限

9

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


有一些权限是不需要被授予的。请参考此处获取详细信息:http://coderzpassion.com/android-new-runtime-permissions/ - Jagjit Singh
谢谢Jagjit。这是runtime-permissions.xml的一部分,<shared-user name="android.uid.system"> <item name="android.permission.READ_CALENDAR" granted="true" flags="30" /> <item name="android.permission.READ_CALL_LOG" granted="true" flags="30" /> <item name="android.permission.ACCESS_FINE_LOCATION" granted="true" flags="30" /> <item name="android.permission.RECEIVE_WAP_PUSH" granted="true" flags="30" /> <item name="android.permission.RECEIVE_SMS" granted="true" flags="30" /> - user1890874
正如您所看到的,这些权限是危险权限,应在运行时授予。但它们在第一次启动时就被授予了,这很令人困惑。 - user1890874
你将设备从5升级到6了吗? - Ashish Rawat
我的设备是Android 6.0.1。它应该是因为系统在某个地方设置了“android.uid.system”的默认运行时权限吗?因为这是一个特殊的系统UID。 - user1890874
2个回答

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这种情况发生的原因是:

All the default permissions are granted from PackageManagerService, via these two methods:

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

and the above methods internally invoke:

DefaultPermissionPolicy.grantDefaultPermissions();

Have a look at How DefaultPermissionPolicy triggers

And if you see DefaultPermissionPolicy's implementation, it contains all the relevant method to load all type of permissions for System components.

Specifically DefaultPermissionPolicy.grantDefaultPermissions() internally calls

grantPermissionsToSysComponentsAndPrivApps(userId); grantDefaultSystemHandlerPermissions(userId);

and it internally invokes grantRuntimePermissionsLPw(), which performs all the remaining work.


我在RuntimePermissionPersistence类中找到了以下代码,但我没有找到android.uid.system的PermissionState何时被设置为granted。 - user1890874
此外,您可以在AOSP的AndroidManifest.xml中找到“android.permission.WRITE_CALENDAR”的定义,但在默认的runtime-permissions.xml文件中找不到android.uid.system的此权限。这意味着并非所有危险权限都预先授予给android.uid.system。 - user1890874
@user1890874,我已更新答案以回答您的所有疑问,请看一下,它应该足以确定出厂重置后默认系统权限来自何处。 - Shridutt Kothari
1
谢谢Shridutt,这对我非常有用。我查看了源代码,找到了这个:private void grantPermissionsToSysComponentsAndPrivApps(int userId) { Log.i(TAG, "Granting permissions to platform components for user " + userId); 但是在设备启动后,我找不到这个日志。 - user1890874
1
你能帮忙回答另一个问题吗? http://stackoverflow.com/questions/37186761/check-android-process-groups - user1890874
显示剩余6条评论

0

特权权限白名单

设备制造商对于授予特权应用程序哪些签名|特权权限几乎没有控制权。从Android 8.0开始,制造商必须在系统配置XML文件(位于/ etc / permissions目录中)中明确授予特权权限。

Android允许存在于这些目录(system/product/vendor/oem/ | _ext)中的系统应用程序通过编写XML文件来将其权限列入白名单。

  1. XML文件内容: <permissions> <privapp-permissions package="x.y.z"> <permission name="android.permission.PACKAGE_USAGE_STATS" /> </privapp-permissions> </permissions>

  2. Android.bp文件: prebuilt_etc { name: "x.y.z.xml", system_ext_specific: true, src: "x.y.z.xml", sub_dir: "permissions", }

  3. 将'x.y.z.xml'添加到PRODUCT_PACKAGES中,使其成为最终镜像的一部分(与应用程序相同)

  4. 在目标设备上:XML文件可以在'partition/etc/permissions/priv-app'下找到

  5. PackageManager解析所有XML文件,并在启动时安装应用程序时为包名中提到的权限白名单。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接