Android APK安装流程(涉及PackageManager源码)

认识 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 。这是唯一可以修改系统状态的地方,并且要对所有可预测的错误进行检测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的代码家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值