认识 PackageManagerService
PackageManagerService(PMS)和ActivityManagerService(AMS),它俩都是运行在SystemServer进程,App端和AMS、PMS进行交互都是通过Binder跨进程完成。PMS则负责包package 的管理。
Activity中通过getPackageManager()获取已安装应用列表,最后是IPC到了系统进程,在 PMS 中执行。
PackageManagerService何时启动
zygote 进程会fork一个 SystemServer 进程然后执行SystemServer的main方法,这里进行大量的初始化,其中就包括启动各种服务(包括PMS)。
系统启动后创建并启动了PMS,并且PMS完成了对所有存在APK的目录进行了扫描,解析所有APK的AndroidManifest.xml,然后进一步扫描APK 最后提交包扫描结果到 PMS 的属性中。
主要扫描的文件:
packages.xml: 记录系统中 所有安装的应用信息,包括基本信息、签名和权限。
mSettings: 用来保存和PMS相关的一些设置,它保存的内容在解析应用时会用到。
data/app 是用户已安装App所在的目录,另外还有system/app存放 系统App。PMS构造方法中会对 这两个目录在内的多个目录进行扫描,我们这里可以猜想到这是开机时对所有已安装App的初始化。
APK的安装过程总结
1.APK用写入Session且包信息和APK安装操作 都提交到了PMS;
2.PMS中先把APK拷贝到 /data/app,然后使用PackageParser2解析APK 获取 四大组件、搜集签名、PackageSetting等信息,并进行校验确保安装成功;
3.接着提交信息包更新系统状态及PMS的内存数据;
4.然后使用 Installer 准备用户目录/data/user、进行 dexOpt;
5.最后发送安装结果通知UI层。
安装过程分析
安装过程分四个阶段:
准备
分析当前安装状态,解析包 并初始校验: 在 preparePackageLI() 内使用 PackageParser2.parsePackage() 解析AndroidManifest.xml,获取四大组件等信息;使用ParsingPackageUtils.getSigningDetails() 解析签名信息;重命名包最终路径 等。
扫描
根据准备阶段解析的包信息上下文 进一步解析: 确认包名真实;根据解析出的信息校验包有效性(是否有签名信息等);搜集apk信息——PackageSetting、apk的静态库/动态库信息等。
核对
验证扫描后的包信息,确保安装成功:主要就是覆盖安装的签名匹配验证。
提交
提交扫描的包、更新系统状态:添加 PackageSetting 到 PMS 的 mSettings、添加 AndroidPackage 到 PMS 的 mPackages 、添加 秘钥集 到系统、应用的权限添加到 mPermissionManager、四大组件信息添加到 mComponentResolver 。这是唯一可以修改系统状态的地方,并且要对所有可预测的错误进行检测。