PMS系列
一 概述
在 Android 系统中,有着四大组件Activity
,Service
,Broadcast
,ContentProvider
,然而,在我们和这四大组件进行交互的时候,一定有着一个系统服务在后台默默的运行。这个服务就是 PackageManagerService(后续简称 PMS)。
当我们在应用中启动一个 Activity 或者 Service 时,需要 PMS 进行查找,当我们安装新的应用时,PMS 会进行安装,解析,优化等等。可以说,PMS 是我们 Android 中最重要的几个服务之一。
今天,我们就来从源码的角度,看看 PMS 它的工作机制到底是什么样的。
二 PMS 组织架构
虽然我们一直说者 PMS,但是准确来说,它是一个 aidl 的接口实现类。系统为我们提供的,是一个 IPackageManager 的接口。PMS 的组织架构如下。
三 PMS 知识体系
PMS 的知识体系大概可以分为三个部分,当然,其他还有一些零零散散的小点,这里就不详细列举了。
- 一 PMS 的启动流程
- 二 PMS 解析安装应用,获得四大组件信息的流程
- 三 应用安装时,PMS 的工作流程
接下来,我就分为三篇文章,分别对这其中的内容进行解析。
四 PMS 的启动流程
PMS 的启动是通过 SystemServer 启动的,在 Android 中,系统的核心服务有两种启动方式。
- 通过 rc 文件配置并加载,单独运行在一个进程中(类似 SurfaceFling 服务)
- 在 SystemServer 服务进程中启动。
PMS 就是通过第二种方式启动的,PMS 的启动流程大致如下
- 首先,在 PMS 的 main 函数中,会创建一个很重要的对象 Injector。传入的参数是一堆的生产者的 lambda 表达式。然后还创建了一个 HandlerThread(backgroundThread)。
- 创建了一个 PMS 对象,并将它发布到 ServiceManager,服务的名字叫 package
- 创建了一个 PackageManagerNative 对象,并将它发布到 ServiceManager,服务的名字叫 package_native
然后在 PMS 的构造函数中,做了一大堆初始化的逻辑。具体分为 5 个阶段
- 初始化了一堆的变量,并创建了 /data/app 的文件目录。
- 扫描系统目录文件 /data/system/package_cache 和 /system/framework
- 扫描用户的 app 安装目录 /data/app
- 根据系统文件的扫描结果,更新用户 app 的依赖,并删掉没用的数据。如果系统版本有更新,也需要处理
- 将 dex 从磁盘读到缓存中等
详细请查看PMS源码解析——PMS的启动流程
五 PMS 解析安装应用,获得四大组件信息的流程
PMS 解析安装应用,就是将安装在系统目录 /data/app 下的文件信息,加载到内存中。围绕的问题就是我们写的那些代码文件,PMS 是如何将它变成四大组件启动的?
简单概况就是
- PMS 启动的时候会对系统和安装的应用进行扫描
- PMS 会对扫描的应用进行解析,把他们的四大组件添加到 ComponentResolver 中对应的集合,后续启动的时候,就会从 ComponentResolver 中获取
今天,我们就带着这两个问题,来了解一下 PMS 启动的,解析应用的原理。
六 APK 的安装流程
PMS 还有一个重要的作用,那就是应用的安装。不论是系统应用还是系统更新的安装,还是我们用户应用的安装,都是通过 PMS 进行的。而 PMS 的安装流程也是及时冗长的。
其中包含了大量安装包的验证,更新的验证,更新失败的回滚,并且也会做 PMS 启动时的那套,应用的扫描与解析。整体的流程很长,大致总结如下。
- 首先启动一个安装应用的界面 Activity。用户可用在这个界面选择是否安装,并且这个界面还有此时安装的应用的信息(图标,名字,权限等等)。
- 如果用户选择同意,就会通过 PMS 创建一个 session,这个 session 的 id 是系统唯一的。
- PMS 会通过 Handler 的消息机制,最后调用到 handleInstall 这个函数,它就是应用安装的开始。
- 应用的安装会分为两种,一种是 Stage 为 true,这种会在下次启动启动时安装,一种则是普通应用的安装。
- 安装的流程大致分为以下几步
- 校验安装包
- 拷贝 apk
- 扫描 apk 解析安装文件
- 对安装包做 dex 优化
- 通知观察者。
详细请查看PMS源码解析——apk的安装流程