PMS 包管理服务
问题
PMS(PackageManagerService)的职责是什么?APK 的安装流程是怎样的?
答案
PMS 核心职责
| 职责 | 说明 |
|---|---|
| APK 安装/卸载 | 解析 APK、拷贝文件、dex 优化 |
| 权限管理 | 权限声明、授予、检查 |
| 包信息查询 | getPackageInfo()、resolveActivity() |
| Intent 解析 | 根据 Intent Filter 匹配目标组件 |
| 签名验证 | APK 签名校验、V1/V2/V3 签名 |
APK 安装流程
APK 关键路径
| 路径 | 说明 |
|---|---|
/data/app/<pkg>/ | APK 安装目录 |
/data/data/<pkg>/ | 应用数据目录 |
/data/dalvik-cache/ | dex 优化缓存 |
/data/system/packages.xml | 所有包信息数据库 |
权限检查
// 运行时检查权限
val result = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
if (result == PackageManager.PERMISSION_GRANTED) {
// 已授权
} else {
ActivityCompat.requestPermissions(activity,
arrayOf(Manifest.permission.CAMERA), REQUEST_CODE)
}
底层调用链:checkSelfPermission() → PackageManager.checkPermission() → PMS 在 packages.xml 中查找该应用的权限授予状态。
常见面试问题
Q1: V1/V2/V3 签名的区别?
答案:
| 签名方案 | 位置 | 保护范围 | 验证速度 |
|---|---|---|---|
| V1 (JAR) | META-INF/ 目录 | 每个文件单独签名 | 慢(逐文件验证) |
| V2 | APK 签名块 | 整个 APK 文件 | 快(整体哈希) |
| V3 | APK 签名块 | 支持密钥轮替 | 快 |
V2 不仅验证更快,还保护了 ZIP 文件的所有部分,防止在 META-INF 中插入数据的攻击。
Q2: packages.xml 损坏会怎样?
答案:
packages.xml 是 PMS 持久化的核心文件,记录所有安装的包信息。PMS 维护了备份文件 packages-backup.xml,启动时如果主文件损坏会从备份恢复。如果备份也损坏,系统会重新扫描 /data/app/ 和 /system/app/ 下的所有 APK 重建数据,但用户的权限授予状态等会丢失。