- 为什么我们需要权限树?
当您使用权限树时,您不希望其他应用使用与您在权限树中声明的基本名称相同的任何权限。
例如,您使用
<permission-tree
android:name="com.example.project.taxes"
android:label="" />
这意味着您不希望其他应用使用任何带有“com.example.project.taxes”的权限前缀。
如果在您的应用之前安装了任何具有相同基本名称的应用,则这两个应用的权限均有效。
如果您的应用首先安装,并且另一个应用使用您的基本名称作为权限前缀,则另一个应用的保护级别将自动更改为“签名”,即使它在 AndroidManifest.xml 中声明为“正常”。
当您从设备中提取系统包文件时,可以检查这一点。
adb pull /data/system/packages.xml
普通权限是这样的,
<item name="com.google.android.gms.permission.TRANSFER_WIFI_CREDENTIAL" package="com.google.android.gms" />
如果有冲突,就会变成这样。
<item name="com.google.android.gms.permission.TRANSFER_WIFI_CREDENTIAL" package="com.google.android.gms" protection="2" />
这意味着您将阻止所有未来安装的应用程序以使用您的基本名称获得正常权限。
当某些应用程序尝试使用它时,Logcat 会在应用程序安装时记录一些这样的消息,
PackageManager: Un-granting permission com.example.project.taxes.deductions.MAKE_SOME_UP from package com.others.app
所以要小心选择您的权限树名称。
- 是否有任何真实场景来说明权限树是必要的?
从新设备的 /data/system/packages.xml 中,我可以看到只有一个 google 应用正在使用权限树。
<permission-trees>
<item name="com.google.android.googleapps.permission.GOOGLE_AUTH" package="com.google.android.gsf" />
</permission-trees>
而且这个应用程序确实使用了很多自定义权限,这就是为什么它需要声明权限树并且不允许其他人与之冲突。
- 有没有例子可以说明客户端App如何请求权限树?
这是客户端应用如何请求权限树的示例。
<permission-tree
android:name="com.example.project.taxes"
android:label="" />
但我认为客户端应用程序不需要使用权限树,它对系统应用程序更有意义。否则,为权限树使用长名称,确保没有其他人与此名称冲突。