android 权限配置
在AOSP 14的ROM定制中,<exceptions>和<privapp-permissions>是用于管理特权应用权限的两种不同机制,主要区别在于作用范围、配置方式和权限授予逻辑。以下是具体分析:
1. <privapp-permissions> 标签
 
- 作用:
 用于显式声明特权应用(位于/system/priv-app或/vendor/priv-app目录)所需的系统级权限。这些权限通常是signature|privileged或privileged级别的,普通应用无法直接申请。
- 配置方式:
 在/etc/permissions/privapp-permissions-*.xml文件中定义,例如:<permissions><privapp-permissions package="com.example.privilegedapp"><permission name="android.permission.ACCESS_FINE_LOCATION"/><permission name="android.permission.WRITE_SECURE_SETTINGS"/></privapp-permissions> </permissions>
- 特点: - 权限必须显式列出,未声明的权限不会被授予。
- 适用于所有特权应用,无论其签名或分区(/system或/vendor)。
- 是AOSP推荐的标准化方式,兼容性更好。
 
2. <exceptions> 标签
 
- 作用:
 用于定义例外规则,允许或拒绝特定签名或分区的特权应用访问某些权限。通常用于更细粒度的控制,例如允许某些OEM预装应用使用系统级权限,但拒绝其他应用。
- 配置方式:
 在/etc/permissions/privapp-permissions-*.xml文件中通过<exceptions>块定义,例如:<permissions><exceptions><exception package="com.oem.privilegedapp"><permission name="android.permission.PACKAGE_USAGE_STATS" allowed="true"/></exception><exception package="com.malicious.app" signing-key="malicious-key"><permission name="android.permission.WRITE_SECURE_SETTINGS" allowed="false"/></exception></exceptions> </permissions>
- 特点: - 基于签名(signing-key)或包名(package)进行例外控制。
- 可以显式允许或拒绝特定权限,优先级高于默认的<privapp-permissions>。
- 适用于需要动态调整权限的场景(如OEM定制或安全策略)。
 
- 基于签名(
3. 核心区别
| 特性 | <privapp-permissions> | <exceptions> | 
|---|---|---|
| 作用 | 声明特权应用所需的权限 | 定义例外规则,允许或拒绝特定权限 | 
| 配置粒度 | 按包名全局声明权限 | 按包名或签名细化控制权限 | 
| 优先级 | 较低(默认规则) | 较高(例外规则) | 
| 适用场景 | 标准化特权应用权限分配 | OEM定制、安全策略、动态权限控制 | 
| 权限范围 | 仅支持 <permission>标签 | 支持 allowed="true/false"显式控制 | 
4. 使用建议
- 优先使用<privapp-permissions>:
 如果特权应用需要一组固定的权限,直接在<privapp-permissions>中声明即可,清晰且易于维护。
- 使用<exceptions>处理特殊情况:
 如果需要基于签名或包名动态调整权限(例如允许某些OEM应用使用高危权限,但拒绝其他应用),则使用<exceptions>。
- 避免重复配置:
 <exceptions>中的规则会覆盖<privapp-permissions>中的默认规则,因此需谨慎设计。
5. 示例场景
假设需要为OEM预装的系统工具应用(com.oem.systemtool)授予WRITE_SECURE_SETTINGS权限,但拒绝其他应用使用该权限:
<permissions><!-- 默认规则:拒绝所有应用的WRITE_SECURE_SETTINGS --><exceptions><exception package="com.oem.systemtool"><permission name="android.permission.WRITE_SECURE_SETTINGS" allowed="true"/></exception></exceptions><!-- 其他特权应用的权限 --><privapp-permissions package="com.example.app1"><permission name="android.permission.ACCESS_FINE_LOCATION"/></privapp-permissions>
</permissions>
总结
- <privapp-permissions>:标准化权限分配,适用于大多数特权应用。
- <exceptions>:灵活的例外控制,适用于需要动态调整权限的场景。
- 两者结合使用可以平衡安全性和灵活性,但需避免规则冲突。
