接着上一章《Zygote进程讲解》,我们已经知道Zygote进程加载system_server进程,然后由system_server进程来启动PMS、AMS等服务,那本章就讲解下PMS,通过源码了解下它的作用以及原理。
1.概念
当我们在Android系统中安装或卸载应用程序时,都需要经过一个名为PMS(Package Manager Service)的系统服务来处理。PMS是Android系统中的一个重要组件,它负责管理应用程序的安装、卸载、更新、权限分配等相关操作。它的作用主要包括:
1)应用程序的安装、卸载和更新管理:PMS负责将应用程序的安装包进行解析,并将应用程序安装到系统中。在卸载应用程序时,PMS会清理应用程序的相关信息和数据,并从系统中删除应用程序。
2)应用程序的权限管理:Android系统采用的是一种基于权限的安全模型,每个应用程序只能访问其被授权的资源和权限。PMS负责管理应用程序的权限,并在应用程序安装时为其分配权限。
3)应用程序的组件管理:Android系统中的应用程序由多个组件构成,例如Activity、Service、Broadcast Receiver和Content Provider等。PMS负责管理应用程序中的组件,并根据应用程序的启动请求启动相应的组件。
4)应用程序的版本管理:当应用程序发布新的版本时,PMS负责检查更新并升级应用程序。
2.源码分析
上面提到PMS负责安装包解析,其实就是解析apk中的Manifest.xml文件,然后将解析的数据放到内存中供AMS调用。那我们接下来就从源码角度看下PMS是如何一步步解析apk的。
图片看不清的话保存后放大看,画的有点复杂,其实对照着源码看就清晰了,源码是基于sdk 32的。绿色部分是最终解析到的内容mPackages对象。我就不贴源码了,要不然篇幅太多了,也没有必要,各个类跳来跳去,我怕写的太乱,大家直接在AndroidStudio中就可以先打开SystemServer.java源码,然后一步步的查看。
其实总结下PMS就是遍历data/app目录,然后解压apk,然后dom解析Manifest.xml文件,并将解析好的数据存放在内存中。
等我们后面讲解完AMS我们会发现,PMS实际上起到的作用就是“索引”的作用,也就是它记录了系统中所有应用的各组件(包括四大组件)信息,以及应用的位置、权限等信息,当要打开一个新的页面或者打开一个新的app,AMS从PMS中拿到目标页面或app的信息,然后初始化后并打开。
上面介绍的主要是开机PMS启动后解析应用程序安装包的过程。
接下来介绍下比如我们从应用市场下载的新的应用是如何安装到手机上的,是否也用到了PMS呢?
当我们从应用市场下载了一个应用后会跳转到一个安装页面,这个安装页面实际上也是一个应用,我们叫它“安装器”,源码位于:frameworks/base/packages/PackageInstaller。下面要验证的是,是否新安装的应用也是最终会走PMS的包解析的整个全过程呢?接下来我还是用一个流程图来讲解下应用安装的全过程。
大家对照着源码,从InstallStart类开始看起,然后一步步的跟下去,会发现同开机后PMS的执行流程一样都会走到PackageParse2.parsePackage()。
其实总结下新应用的安装主要就两步,第一步是拷贝文件到data/app目录,接下来就是解析apk文件并缓存起来,以便后面AMS用到。