应用程序的安装是通过包管理服务PackageManagerService完成的,常见的安装方式有以下几种:
① 内置APP随着系统启动PMS而安装。
② 使用adb install命令安装。
③ 通过系统内置的PackageInstaller应用安装。
④ 在一些手机厂商内置的应用商店下载,然后静默安装。
分析源码之后,会发现,其实只有两种方式,
一是系统内置应用通过PackageManagerService使用scanDirLi扫描指定目录下的apk安装。
二是第三方apk通过PackageManager直接或者间接的调用PMS的installPackageAsUser接口安装。
安装位置有两种:内置存储器和SD卡(Android6.0需要将SD卡转换为内置存储器才行)。
下文将介绍系统应用扫描安装、adb安装到内部存储器、apk安装到SD卡等情况的安装流程。
首先,我们看一下PackageManager的类关系:
PackageManagerService运行在system进程,为使其他进程使用,用到了binder通信,提供PackageManager接口供调用。
然后, 我们看一下系统APP的安装,之前说到系统APP安装是在系统启动PMS的时候,所以我们从SystemServer启动PMS开始看,下面是大概时序图
step2~step10, SystemServer在启动PMS之前,先启动了Installer这个SystemService,Installer新建一个InstallerConnection对象与installd的一个连接,通过socket通信,PMS每次执行安装、dexoat、卸载等操作时,需要调用Installer接口,然后Installer将封装后的命令通过socket发送给installd执行。
step17, 指定目录的路径传递给scanDirLi。
step18, 对目录下的apk文件逐个调用scanPackageLI方法,进行扫描解析。
step19, apk的解析是通过scanPackageLI新建的PackageParser对象完成的。
step20~step26, 主要是对AndroidManifest.xml文件的解析。
step27, 对签名文件的解析。
step28~step41, apk的安装,包含数据目录的创建/data/data/<packagename>,apk的dexopt优化,安装之后将apk的信息记录到packages.xml、packages.list;
接下来,简介adb安装apk到内置存储器的过程:
adb安装apk的主要过程如下