2

在有关权限树的Android 文档中,我找不到任何permission-tree有用的使用场景。

现在我的脑海里有几个问题:

  1. 为什么我们需要permission-tree

  2. 有没有permission-tree必要的真实场景来说明?

  3. 是否有任何示例来演示客户端 App 如何请求permission-tree

4

1 回答 1

0
  1. 为什么我们需要权限树?

当您使用权限树时,您不希望其他应用程序使用与您在权限树中声明的基本名称相同的任何权限。例如,您使用

    <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

所以要小心选择你的权限树名称。

  1. 是否有任何真实场景来说明权限树是必要的?

从新设备的 /data/system/packages.xml 中,我可以看到只有一个谷歌应用程序正在使用权限树。

 <permission-trees>
        <item name="com.google.android.googleapps.permission.GOOGLE_AUTH" package="com.google.android.gsf" />
    </permission-trees>

而且这个应用确实使用了很多自定义的权限,这就是为什么它需要声明权限树并且不允许其他人与之冲突的原因。

  1. 是否有任何示例来演示客户端应用程序如何请求权限树?

这是客户端应用程序如何请求权限树的示例。

    <permission-tree
    android:name="com.example.project.taxes"
    android:label="" />

但我认为客户端应用程序不需要使用权限树,它对系统应用程序更有意义。否则,为权限树使用长名称,确保没有其他人与此名称冲突。

于 2019-09-06T09:20:57.087 回答