Android应用的安装是通过packageinstaller完成. 在源码中, PackageInstaller位于packages/apps/PackageInstaller中. 根据代码量来看并不是太大.
主要是PackageInstallerActivity类, 安装过程中一切状态转换与判断都在这个Activity中进行.
安装流程
先看一下最常见的安装流程.
PackageInstaller中处理安装前的判断与确认操作
首先processPackageUri检测解析Uri. 提取scheme(目前支持file, content, package三种协议, 便于分析只保留了file部分)
可以看出 processPackageUrl调用framework的api获取了apk的权限信息与应用名称与图标.
然后就是判断该包是否允许安装, 如果允许则初始化准备安装. 首先在checkIfAllowedAndInitiateInstall中判断是否是未知来源的应用, 一般是开启允许未知来源的. 直接开启初始化安装
initiateInstall仅仅获取一下本机是否安装了该应用, 如果安装获取到该应用的信息
最后startInstallConfirm()方法中显示了界面中显示的权限列表以及, 确认取消列表. 查看点击OK的事件, 确定安装事件为:
好吧, 安装确认后跳转到安装进度页面, 具体安装过程也在这个界面中.
InstallAppProcess开始安装并处理安装进度
onCreate中, 接参数mAppInfo与mPackageURI
这个handlerThread进行的任务是 doPackageState
结论
PackageInstaller只是在应用安装前进行信息提取, 筛选, 以及apk文件的获取. 最后的安装还是调用Framework的PackageInstaller进行安装.