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>
:灵活的例外控制,适用于需要动态调整权限的场景。- 两者结合使用可以平衡安全性和灵活性,但需避免规则冲突。