1. PackageManager概述:它到底是什么?
说实话,我刚接触Android系统时,对PackageManager的理解特别肤浅。以为它就是个「装应用的管家」。后来啃了源码才发现——这玩意儿远比想象中复杂。
PackageManager,说白了就是Android系统里管理所有「包」的核心服务。你手机上每安装一个App,背后都是它在干活。我习惯把它理解成「应用大总管」——从安装、卸载到权限管理,全归它管。
1.1 核心职责:它到底管哪些事?
我总结了一下,PackageManager主要干这几件事:
- 应用安装与卸载:你点「安装」按钮那一刻,它就启动了。解析APK、校验签名、分配UID、写入数据……一套流程走下来,App才能出现在桌面上。
- 组件信息管理:每个App里有哪些Activity、Service、BroadcastReceiver,它都记在小本本上。你调用startActivity()时,系统就是通过它找到目标组件的。
- 权限管理:哪个App申请了哪些权限,用户是否授权了,这些数据全在PackageManager手里。我记得有一次排查权限问题,发现某个App明明申请了定位权限却拿不到位置,最后查出来是PackageManager里权限状态没更新——坑啊。
- 包信息查询:getPackageInfo()、getInstalledApplications()这些API,背后都是它在干活。说白了,它就是App信息的「数据库」。
- 资源与签名管理:每个APK的签名信息、资源路径,它都得管。特别是签名校验,这一步出问题,App根本装不上。
重点来了:PackageManager不是一个简单的类,而是一整套服务架构。它分为客户端(Client)和服务端(Service),中间通过Binder通信。你平时调用的getPackageManager(),拿到的其实是一个代理对象。
1.2 系统架构中的位置:它坐在哪?
要理解PackageManager的位置,得先看看Android系统的分层结构。我画了个简图帮你理解:
| 层级 | 组件 | 说明 |
|---|---|---|
| 应用层 | Launcher、设置App | 用户直接接触的界面 |
| Framework层 | PackageManager、ActivityManager | 核心服务,管理应用生命周期 |
| Native层 | installd、dex2oat | 底层安装、优化工作 |
| 内核层 | 文件系统、驱动 | 存储APK、数据目录 |
PackageManager位于Framework层,但它跟上下层都有紧密联系。往上,它给应用提供API;往下,它通过installd这个守护进程操作文件系统。
你想想看,安装一个APK时,PackageManager要做多少事:
- 解析APK文件,读取AndroidManifest.xml
- 校验签名,确保APK没被篡改
- 分配Linux UID,每个App一个独立身份
- 创建数据目录,比如/data/data/包名
- 优化Dex文件,生成OAT文件
- 更新系统内的包信息数据库
- 通知Launcher更新桌面图标
这一套流程走下来,涉及了Framework、Native、内核三层。PackageManager就是那个「总调度」。
我个人习惯:看源码时,先搞清楚PackageManagerService(简称PMS)的启动流程。它是在SystemServer里启动的,时机很早——系统还没完全起来,PMS就已经开始扫描已安装应用了。
1.3 为什么需要理解它?
我曾经遇到过一个线上问题:某款手机升级系统后,大量第三方应用闪退。排查了半天,发现是PMS在扫描应用时,某个预装应用的签名校验逻辑出了bug,导致整个安装流程卡住了。
你看,不懂PackageManager的底层逻辑,这种问题根本无从下手。说白了,它是Android系统的基石之一。你做的任何跟应用管理相关的功能——静默安装、应用市场、权限管理——都绕不开它。
嗯,这里要注意一点:PackageManager和ActivityManager经常被混淆。简单区分一下——PackageManager管「安装和卸载」,ActivityManager管「运行和调度」。两者配合工作,但职责不同。
避坑指南:我曾经在项目里直接调用PackageManager的installPackage()方法做静默安装,结果发现系统签名权限不够,直接抛SecurityException。后来才明白——普通App根本拿不到INSTALL_PACKAGES权限,只有系统级应用才能调用。
好了,这一章我们搞清楚了PackageManager是什么、管什么、在哪。下一章,我会带你深入PMS的启动流程——看看系统开机时,它是怎么把成千上万个应用扫描进来的。