新闻资讯
AG体育一文带你搞懂APK安装过程(建议收藏)
发布时间:2024-01-15
  |  
阅读量:
字号:
A+ A- A

  AG体育大家好,我是皇叔,最近开了一个安卓进阶涨薪训练营,可以帮助大家突破技术&职场瓶颈,从而度过难关,进入心仪的公司。

  最近在了解插件化技术:把未安装的插件apk 集成到 宿主App中,以取得减少宿主APK包体积等优点。也就是说,一个完整的APK 虽然不经过安装过程,但使用了插件化技术后却可以在宿主中使用其功能。

  那么对应的,一个APK的完整安装过程是怎样的呢?用户通常能体验到的安装过程有两种:

  先下载APK,然后是安装过程,过程中没有跳转到其他页面,可以说是一键安装。

  这种通常是用户下载一个APK文件,然后手动点击,跳转到安装页面,提示这个APK的下载信息等,然后是安装包详情页面,展示 版本号、所需权限 等一些信息,最后是安装中的页面。我使用的是小米手机,对应的Activity信息如下,这其中PermissionInfoActivity是点击“应用权限”的权限详情页面。

  APK包体越大,安装时间就越长,因为需要解析和校验的越多AG体育。无论哪种方式,安装完成后都会通知到 桌面应用Launcher,Launcher在桌面上添加一个App图标。这就是用户感受到的安装过程。

  阅读源码是一件痛苦的事情,一般需要结合其他资料一起理解。并且,重点掌握整体流程即可。

  在平时开发中,我们会需要获取当前已安装的包的相关信息,例如已安装应用列表等,就可以在Activity中这么写:

  那么 PMS 什么时候完成初始化的呢?因为 所有App运行都需要 这些系统服务,所以必然是 系统开机的时候 完成 PMS、AMS这些的初始化:

  在开机系统启动时,zygote 进程会fork一个 SystemServer 进程然后执行上面main方法AG体育,这里进行大量的初始化,其中就包括启动各种服务。这里我们看startBootstrapServices:

  发现这里开启了 AMS、PMS,并且都使用了InstallerAG体育。Installer 看名字像是安装器,后面再做介绍。PMS的main方法内用构造方法创建了PMS实例,而它的构造方法内容特别多,我们关注其中一句调用scanDirTracedLI:

  data/app是用户已安装App所在的目录,另外还有system/app存放 系统App。PMS构造方法中会对 这两个目录在内的多个目录进行扫描,我们这里可以猜想到这是开机时对所有已安装App的初始化。scanDirTracedLI又走到scanDirLI,那么就来详细看看怎么扫描的:

  这里就是解析Application的子节点——四大组件,并把信息存入ParsingPackage实例pkg中,最后转成 ParallelPackageParser.ParseResult。那么再回到 PMS构造方法,解析后调用了 addForInitLI,这个方法逻辑复杂,有很多对系统应用的校验(包名修改、版本升级、签名手收集和校验),但我们只关注下面内容:

  10//添加组件到mComponentResolver:所有的四大组件信息添加到内部数据结构中

  也就是包信息记录在了PMS的属性中。也就是说,系统启动后AG体育,包信息记录在了PMS管理的内存中。

  小结一下,系统启动后创建并启动了PMS,并且PMS完成了对所有存在APK的目录进行了扫描,解析所有APK的AndroidManifest.xml,然后进一步扫描APK 最后提交包扫描结果到 PMS 的属性中。

  以上就是对 开机启动时 APK安装流程 的简单理解。那么,下面就来看看 APK安装普通流程。

  上面提到,普通的应用安装过程 是执行在小米系统miui的com.miui.packageinstaller中,安装过程涉及几个Activity,我们来看看 如何使用代码 安装一个APK文件,以及原生Android系统是哪些Activity。

  15//安装结果监听。在收到安装结果的广播后 会调用此 Observer

  5//解析包 返回最小的细节:pkgName、versionCode、安装所需空间大小、获取安装位置等

  解析包返回最小的细节:pkgName、versionCode、安装所需空间大小;确认包安装位置;校验APK完整性。获取结果mRet。然后就看 handleReturnCode:

  判断mRet,执行apk拷贝,然后执行安装。先看 mArgs.copyApk如何拷贝:

  35//4.提交:提交扫描的包、更新系统状态。这是唯一可以修改系统状态的地方AG体育,并且要对所有可预测的错误进行检测。

  42//安装成功的后续才做:准备app数据、编译布局资源、执行dex优化

  前三步主要是 解析和校验,第四部是把 包信息 提交到 PMS 内存数据结构中。其中解析和提交在上面的PMS初始化中 扫描apk目录后也是同样的过程。这里就不再展开跟踪了。

  19//执行dex优化:dexopt 是对 dex 文件 进行 verification 和 optimization 的操作,其对 dex 文件的优化结果变成了 odex 文件,这个文件和 dex 文件很像,只是使用了一些优化操作码(譬如优化调用虚拟指令等)。

  这两个操作最终都是使用Installer对应的方法来操作。前面介绍 PMS 创建时传入了 Installer 的实例,而 Installer 继承自 SystemService 也是一个系统服务。这里来看下:

  本篇从用户感受的APK安装讲起,分别详细梳理了 包管理器服务——PackageManagerService 的服务开启、初始化扫描过程;然后分析了对应原生系统的安装过程及页面;接着就是详细分析了安装流程,包括创建Session 发送APK、PMS中的APK拷贝操作、包括APK解析校验和dexOpt等具体安装流程;最后是安装结果的发送。

  内容确实很多,但是我们只需要重点了解 PMS的初始化、APK安装 的整体流程即可,无需关注繁杂的细节。

  虽然耗费时不少时间阅读源码、也阅读了一些文章,但不免有错误和遗漏之处。欢迎讨论~