一、PMS 是什么?—— 应用的 “户籍管理员”
PMS 是 Android 系统中负责管理应用包(APK)的核心服务,全称 PackageManagerService, nickname “PMS”。
- 位置:运行在
systemserver进程中(和 AMS、WMS 等系统服务同属一个进程)。 - 本质:基于 Binder 机制的服务,为其他进程(如应用)提供包管理功能。
- 核心职责:管理 APK 的安装 / 卸载 / 更新、解析应用信息、权限控制、组件注册等。
二、PMS 管理的对象:APK 的结构与核心文件
PMS 的管理对象是 APK(Android Package) ,本质是一个 ZIP 格式的压缩文件,关键结构包括:
- AndroidManifest.xml:PMS 的 “说明书”,声明应用的四大组件(Activity/Service 等)、权限申请、共享库依赖等。
- classes.dex:编译后的代码文件。
- res/assets:资源文件(图片、布局等)。
- lib/ :包含 So 库(原生代码)。
- META-INF:签名相关文件,确保应用合法性。
AndroidManifest.xml 为何重要?
它就像应用的 “菜单”:
- PMS 通过解析这个文件,才能知道应用包含哪些组件、需要什么权限、依赖哪些库。
- 例如:应用想获取存储权限,必须在 manifest 中用
<uses-permission>声明;想提供某个页面,必须用<activity>声明。
三、PMS 的 “小伙伴”:核心模块分工
PMS 不是孤军奋战,而是通过多个模块协作完成复杂任务,每个模块各司其职:
1. APK 管理模块:根基中的根基
-
职责:APK 的安装、卸载、更新,以及系统启动时扫描所有 APK。
-
关键作用:
- 安装 APK 时,通知其他模块更新数据(如权限、组件信息)。
- 卸载 APK 时,清理所有相关模块的记录。
- 系统启动时扫描 APK,确保所有应用信息被正确解析和记录。
-
类比:像 “快递中转站”,所有 APK 的 “进出” 都要经过它,且触发其他模块的联动。
2. 权限管理模块:应用的 “门禁系统”
-
职责:管理应用声明的权限和请求的权限状态(允许 / 拒绝 / 仅一次)。
-
核心逻辑:
- 应用在 manifest 中用
<permission>声明自定义权限,用<uses-permission>请求系统权限。 - 用户点击 “允许 / 拒绝” 权限时,由该模块记录状态,并在应用申请权限时校验。
- 应用在 manifest 中用
-
实例:当你打开相机应用时,PMS 会检查该应用是否被授予 “相机权限”,未授权则拒绝访问。
3. 共享库模块:应用的 “资源共享站”
-
职责:管理应用依赖的共享库(如 Google 地图库、自定义框架库)。
-
关键概念:
- 声明共享库:系统应用可用
<library>标签声明库(普通应用无权限,避免稳定性问题)。 - 使用共享库:应用用
<uses-library>或<uses-native-library>引用库。
- 声明共享库:系统应用可用
-
作用:避免重复加载库,节省内存(如 framework.jar 被 Zygote 预加载,所有应用可直接使用)。
4. 记录存储模块:应用的 “户籍档案库”
-
职责:将应用信息(安装状态、权限、签名等)记录到文件,供系统重启后恢复数据。
-
核心文件:
/data/system/packages.xml:存储所有安装应用的关键信息(包名、版本、签名等)。
-
类比:类似酒店的入住登记系统,记录每个应用的 “身份信息”,方便查询和恢复。
5. 所有 APK 信息模块:应用的 “信息索引”
- 职责:收集并存储所有已安装 APK 解析后的信息(版本号、包名、组件声明等)。
- 存储结构:用
mPackages字段(键为包名,值为解析后的 AndroidPackage 对象)。 - 用途:供其他服务(如 AMS)查询应用基本信息,例如启动 Activity 前检查应用是否存在。
6. 四大组件模块:组件的 “快速检索器”
-
职责:专门存储所有应用声明的四大组件信息,优化检索效率。
-
为何独立存在? :
- 若从 “所有 APK 信息模块” 检索组件,需先查包名再查组件,流程长。
- 独立模块用
mComponentResolver直接存储组件映射,加速查询(如 AMS 启动 Activity 时快速获取组件信息)。
四、PMS 的启动过程:从初始化到正常工作
PMS 作为 bootstrap services(最高优先级服务),在 SystemServer 启动时最早初始化,关键步骤如下:
1. 共享库模块先启动
- 从系统配置文件中读取所有内置共享库(如 framework.jar),初始化依赖关系。
- 例如:处理 A 库依赖 B 库的情况,确保库加载顺序正确。
2. 记录存储模块读取历史数据
- 从
packages.xml等文件中读取已安装应用的信息(安装状态、权限记录等)。 - 类比:系统重启后 “恢复户籍档案”,避免数据丢失。
3. 权限管理模块初始化
- 根据记录存储模块读取的权限数据,初始化每个应用的权限状态(允许 / 拒绝)。
4. 扫描所有 APK
-
系统启动时扫描所有系统 APK 和用户安装的 APK:
- 解析每个 APK 的 AndroidManifest.xml,获取组件、权限等信息。
- 若 APK 已升级,更新相关模块数据;若发现新 APK,触发安装流程。
-
最终目标:让所有模块(如组件模块、信息模块)同步最新的应用数据。
五、总结:PMS 如何撑起 Android 的应用生态?
-
核心定位:PMS 是 Android 系统管理应用的 “中枢”,从 APK 安装到运行时权限控制,再到组件信息检索,都离不开它。
-
模块协作示例:
- 安装新应用时,APK 管理模块触发安装 → 2. 解析 manifest 后,信息模块和组件模块记录数据 → 3. 权限模块记录申请的权限 → 4. 记录存储模块保存安装信息。
-
重要性:若 PMS 异常,会导致应用无法安装、权限控制失效、组件无法启动等核心问题,系统基本无法正常使用。
后续可深入学习 PMS 的 APK 安装流程、权限管理机制、组件解析原理等,这些都是理解 Android 应用运行机制的关键。