一、PKMS 模块全景:各司其职的 “应用管理天团”
PKMS(PackageManagerService)是 Android 系统管理应用的 “总指挥”,但它的能力来自多个模块的协作。我们可以把它想象成一个公司,每个模块就是不同的部门:
1. 核心模块分工速览
- APK 管理模块:公司 “前台”,负责 APK 的安装、卸载、扫描,是所有操作的入口。
- 权限管理模块:公司 “安保”,管理应用权限的申请、授权状态。
- 共享库模块:公司 “资源库”,管理应用共享的代码库(如 Google 地图库)。
- 记录存储模块:公司 “档案室”,将应用信息(安装状态、权限)写入文件,防止系统重启后数据丢失。
- 所有 APK 信息模块:公司 “数据库”,内存中存储所有应用的 Manifest 解析结果(版本、组件等)。
- 四大组件模块:公司 “快速检索系统”,专门存储组件信息,加速查询(如 Activity 位置)。
- 快照管理模块:公司 “缓存系统”,复制数据快照,避免频繁加锁影响查询速度。
2. 快照管理模块:为什么需要 “数据快照”?
- 场景:当多个应用同时查询 PKMS 数据时,直接访问原始数据需要加锁,影响速度。
- 解决方案:每个模块维护一份数据快照(副本),查询时直接读快照,无需等待锁。
- 类比:图书馆的书籍复印件,读者直接看复印件,原件留在仓库避免混乱。
二、PKMS 启动:模块如何 “热身” 准备工作?
PKMS 启动是系统启动的关键环节,模块按顺序初始化,就像乐队演奏前的调音:
1. 启动流程关键步骤
-
共享库模块先启动
- 加载系统内置共享库(如 framework.jar),处理库依赖关系(如 A 库依赖 B 库)。
- 目的:扫描 APK 时,若应用使用了内置库,可直接从共享库模块获取信息。
-
记录存储模块读取历史数据
- 从
/data/system/packages.xml读取已安装应用的信息(包名、版本、签名)。 - 类比:图书馆开门前,先从档案柜取出已登记的书籍清单。
- 从
-
权限管理模块初始化
- 根据记录存储模块的数据,初始化每个应用的权限状态(允许 / 拒绝)。
-
扫描所有 APK:PKMS 的 “灵魂操作”
- 系统 APK 扫描:解析 system 分区等路径下的 APK,获取 Manifest 信息,若 APK 已存在则升级,不存在则安装。
- 普通 APK 扫描:解析 data/app 下的用户应用,检查共享库和权限变化。
- 核心作用:将所有应用信息解析后存入 “所有 APK 信息模块” 和 “四大组件模块”。
-
共享库模块二次初始化
- 补全系统 APK 使用的共享库信息(如某系统 APK 依赖的共享库可能在后续扫描中才被发现)。
三、模块协作:如何守护 APK 安装与应用运行?
1. APK 安装:模块间的 “流水线作业”
当安装一个 APK 时,模块协作如下:
-
APK 管理模块:解析 APK 的 Manifest,验证签名和版本。
-
记录存储模块:创建
PackageSetting记录安装信息(包名、路径、权限),写入文件。 -
所有 APK 信息模块:存储解析后的 APK 信息(版本、组件)。
-
四大组件模块:存储 APK 声明的 Activity/Service 等组件。
-
权限管理模块:记录 APK 声明的权限和申请的权限状态。
-
共享库模块:若 APK 使用共享库,查询并关联库信息。
类比:安装 APK 就像新员工入职,
- 前台(APK 管理)审核资料,
- 档案室(记录存储)登记信息,
- 数据库(APK 信息模块)录入资料,
- 各部门(组件 / 权限模块)更新对应记录。
2. 应用运行:模块如何 “快速响应” 启动请求?
以启动 Activity 为例:
-
快照管理模块:接收查询请求(如 “com.example.app.MainActivity” 在哪)。
-
四大组件模块:根据 ComponentName 快速找到 Activity 信息(如类名、权限)。
-
所有 APK 信息模块:获取应用的基本信息(包路径、共享库)。
-
记录存储模块:补充共享库路径、数据目录等运行时必需信息。
关键逻辑:
- 若四大组件模块查不到 Activity 信息,启动失败(如 APK 未安装或组件未声明)。
- 若获取不到 ApplicationInfo(包含运行时路径等),应用无法加载代码和资源。
四、核心问题解析:为什么这些模块必须协作?
-
数据一致性问题:
- 安装 APK 时,若只更新记录存储模块,不更新组件模块,会导致启动 Activity 时查不到组件。
- 解决方案:安装流程中,模块按顺序更新,确保数据一致。
-
性能优化需求:
- 快照管理模块用 “空间换时间”,避免大量查询时的锁竞争(如多个应用同时查权限)。
- 四大组件模块独立存储,避免从全量 APK 信息中层层查询,加速组件检索。
-
系统重启恢复:
- 记录存储模块将数据写入文件,系统重启后,PMS 通过读取文件恢复所有应用信息,避免 “失忆”。
五、总结:PKMS 如何撑起 Android 的应用生态?
-
核心定位:PKMS 是 Android 应用管理的 “大脑”,通过模块协作完成从 APK 安装到运行的全流程控制。
-
模块协作本质:
- 安装时:APK 管理模块触发,各模块记录和存储对应数据。
- 运行时:快照和组件模块加速查询,确保应用快速启动。
-
类比总结:
PKMS 就像一个大型图书馆,-
APK 管理模块负责书籍入库(安装)和出库(卸载),
-
记录存储模块记录书籍清单,
-
组件模块像分类索引卡,让读者(应用)快速找到 “书”(组件),
-
快照模块则是热门书籍的复印件,避免多人借阅时排队等待。
-
理解 PKMS 的模块协作,不仅能深入掌握 Android 系统原理,还能在应用开发中解决如 “组件未找到”“权限异常” 等问题,是进阶 Framework 开发的关键一步。