特权应用与白名单配置:privapp 权限与签名
2026/8/9大约 3 分钟系统定制Android 14特权应用白名单定制
特权应用与白名单配置:privapp 权限与签名
上一章看了属性配置。这一章回答:预装系统应用怎么获得特权,privapp 白名单怎么配, 签名怎么选,定制实践有哪些坑?
进入 priv-app 目录不等于自动获权
| 常见误解 | 正确理解 |
|---|---|
| 放 priv-app 就有特权权限 | 还要签名匹配 + 白名单声明 |
| 白名单只写权限名就行 | 包名、权限名、签名三者都要对 |
| 平台签名随便用 | 平台签名是系统身份,泄露即失去安全边界 |
核心结论
- 特权链路:priv-app 目录 → 平台签名 → 白名单声明 → 权限授予。
- 白名单文件按包名声明允许的权限,系统强制校验。
- 平台签名(platform key)是系统应用的共同身份。
- 定制实践:先列权限清单,再签名,再回归验证。
- 白名单遗漏的典型表现:权限不授予、启动告警或失败。
特权配置主链
逐步解释:
- 目录:应用位于系统特权目录。
- 签名:使用平台签名匹配系统身份。
- 白名单:声明所需 privileged 权限。
- 校验:扫描时系统核对三项。
- 授予:通过后授予特权权限。
白名单示例
<privapp-permissions package="com.example.system">
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.MODIFY_PHONE_STATE"/>
</privapp-permissions>文件需放入系统分区权限目录(如 /system/etc/permissions/),并随镜像一起发布。
源码证据
阅读目标:确认白名单校验入口。
正文指针:PackageManagerService.java 中特权权限校验;构建侧 PRODUCT_COPY_FILES 或 Soong 拷贝白名单。
// PackageManagerService.java(伪代码,行号以 r75 为准)
boolean isAllowedByWhitelist(String permission, String packageName) {
// 检查 privapp-permissions
}这段代码证明: 白名单是授予 privileged 权限的前置条件;目录与签名只是前提, 最终以白名单为准。
验证与排障
环境:开发设备或模拟器;以下命令不需要 root。
adb shell dumpsys package <包名> | grep -E "signatures|priv|allowlisted"
adb shell dumpsys package <包名> | grep -A30 "requested permissions"
adb logcat -v threadtime | grep -E "not in privapp-permissions|privileged"先确认签名与目录,再看 requested permissions 与白名单状态。logcat 的 “not in privapp-permissions”是白名单遗漏的直接证据。
常见误区
- “priv-app 自动全权限”:要白名单。
- “白名单只写权限名”:包名、权限名、签名全要对。
- “平台签名随便签”:是系统身份,安全边界所在。
- “改白名单不用重编”:白名单随分区镜像发布。
延伸问题
- privapp-permissions 校验失败的表现有哪些?
- 如何审计预装应用的最小权限清单?
- 厂商签名与 AOSP 平台签名的兼容性如何处理?
- 白名单与 signature 级权限的区别是什么?
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
PackageManagerService.java | 白名单校验 | 特权权限 |
privapp-permissions-*.xml | 权限目录 | 白名单 |
| 平台签名 | 构建产物 | 系统身份 |
| Soong/构建配置 | 文件拷贝 | 发布 |
公共路径:frameworks/base/services/core/java/com/android/server/pm/ 与 system/etc/permissions/。行号以 r75 检索为准。
配置未生效时按 系统定制排障 逐层检查。