特许应用是位于系统映像分区的 priv-app
目录中的系统应用。Android 版本使用的分区包括:
- Android 9 及更高版本:
/system, /product, /vendor
- Android 8.1 及更低版本:
/system
过去,设备制造商对哪些签名 | 特许权限可以授予特许应用的控制权很小。从 Android 8.0 开始,制造商可以在 /etc/permissions
目录中的系统配置 XML 文件中显式授予特许权限。从 Android 9 开始,实现者可以显式授予或拒绝所有特许权限。如果未授予特许权限,设备将无法启动。
privapp-permissions.xml
文件只能授予或拒绝同一分区上特许应用的权限。例如,如果 /product
分区上的应用请求特许权限,则该请求只能由 /product
上的 privapp-permissions.xml
文件授予或拒绝。
添加允许列表
应用的权限允许列表可以列在单个 XML 文件中,也可以列在位于 frameworks/base/etc/permissions
目录中的多个 XML 文件中
/etc/permissions/privapp-permissions-OEM_NAME.xml
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
内容组织方式没有严格的规则。设备实现者可以确定内容结构,只要 /system/priv-app
中的所有应用都加入允许列表即可。例如,Google 已为所有特许应用开发了一个单独的允许列表。我们建议采用以下组织方式:
- 已包含在 Android 开源项目 (AOSP) 树中的应用的权限列在
/etc/permissions/privapp-permissions-platform.xml
中。 - 对于其他应用,请使用
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
形式的文件。
自定义允许列表
AOSP 包括一个允许列表实现,可以根据需要进行自定义。
如果必须拒绝权限,请编辑 XML 以使用 deny-permission
标记而不是 permission
标记。例如:
<!-- This XML file declares which signature|privileged permissions to grant to privileged apps that come with the platform --> <permissions> <privapp-permissions package="com.android.backupconfirm"> <permission name="android.permission.BACKUP"/> <permission name="android.permission.CRYPT_KEEPER"/> </privapp-permissions> <privapp-permissions package="com.android.cellbroadcastreceiver"> <!-- Don't allow the application to interact across users --> <deny-permission name="android.permission.INTERACT_ACROSS_USERS"/> <permission name="android.permission.MANAGE_USERS"/> <permission name="android.permission.MODIFY_PHONE_STATE"/> <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/> <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/> </privapp-permissions> ...
查找缺失的权限
要在启动新设备时查找缺失的权限,请启用过渡日志模式
ro.control_privapp_permissions=log
违规行为将在日志文件中报告。非特许权限将被授予。这样做可确保设备保持工作状态,同时仍提供违规行为列表。错误消息格式如下:
PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist
所有违规行为都必须通过将缺失的权限添加到相应的允许列表来解决。请注意,在
- Android 9 及更高版本中,违反特许权限会阻止设备启动。相反,您必须显式允许或拒绝所有特许权限。
- 在 Android 8.0 及更低版本中,尽管受影响的应用位于
priv-app
路径中,但仍不会向其授予缺失的权限。
强制执行允许列表
创建允许列表后,通过设置构建属性 ro.control_privapp_permissions=enforce
来启用运行时强制执行。
仅当应用使用 package="android"
声明权限时,才需要允许列表。ro.control_privapp_permissions
属性状态必须符合兼容性定义文档 (CDD) 中的第 9.1 节 权限。