跳到主要内容

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/ 目录每个文件单独签名慢(逐文件验证)
V2APK 签名块整个 APK 文件快(整体哈希)
V3APK 签名块支持密钥轮替

V2 不仅验证更快,还保护了 ZIP 文件的所有部分,防止在 META-INF 中插入数据的攻击。

Q2: packages.xml 损坏会怎样?

答案

packages.xml 是 PMS 持久化的核心文件,记录所有安装的包信息。PMS 维护了备份文件 packages-backup.xml,启动时如果主文件损坏会从备份恢复。如果备份也损坏,系统会重新扫描 /data/app//system/app/ 下的所有 APK 重建数据,但用户的权限授予状态等会丢失。

相关链接