通俗易懂讲解 PackageManagerService(PMS):Android 系统的 “应用管家”

432 阅读5分钟

一、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> 请求系统权限。
    • 用户点击 “允许 / 拒绝” 权限时,由该模块记录状态,并在应用申请权限时校验。
  • 实例:当你打开相机应用时,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 安装到运行时权限控制,再到组件信息检索,都离不开它。

  • 模块协作示例

    1. 安装新应用时,APK 管理模块触发安装 → 2. 解析 manifest 后,信息模块和组件模块记录数据 → 3. 权限模块记录申请的权限 → 4. 记录存储模块保存安装信息。
  • 重要性:若 PMS 异常,会导致应用无法安装、权限控制失效、组件无法启动等核心问题,系统基本无法正常使用。

后续可深入学习 PMS 的 APK 安装流程、权限管理机制、组件解析原理等,这些都是理解 Android 应用运行机制的关键。