PackageManagerService 源码解析——开篇

981 阅读4分钟

Android的知识体系搭建

PMS系列

PMS源码解析——PMS的启动流程

PMS工作原理解析——app目录的解析流程

PMS源码解析——apk的安装流程

一 概述

在 Android 系统中,有着四大组件ActivityServiceBroadcastContentProvider,然而,在我们和这四大组件进行交互的时候,一定有着一个系统服务在后台默默的运行。这个服务就是 PackageManagerService(后续简称 PMS)。

当我们在应用中启动一个 Activity 或者 Service 时,需要 PMS 进行查找,当我们安装新的应用时,PMS 会进行安装,解析,优化等等。可以说,PMS 是我们 Android 中最重要的几个服务之一。

今天,我们就来从源码的角度,看看 PMS 它的工作机制到底是什么样的。

二 PMS 组织架构

虽然我们一直说者 PMS,但是准确来说,它是一个 aidl 的接口实现类。系统为我们提供的,是一个 IPackageManager 的接口。PMS 的组织架构如下。

PMS结构.png

三 PMS 知识体系

PMS 的知识体系大概可以分为三个部分,当然,其他还有一些零零散散的小点,这里就不详细列举了。

  • 一 PMS 的启动流程
  • 二 PMS 解析安装应用,获得四大组件信息的流程
  • 三 应用安装时,PMS 的工作流程

接下来,我就分为三篇文章,分别对这其中的内容进行解析。

四 PMS 的启动流程

PMS 的启动是通过 SystemServer 启动的,在 Android 中,系统的核心服务有两种启动方式。

  1. 通过 rc 文件配置并加载,单独运行在一个进程中(类似 SurfaceFling 服务)
  2. 在 SystemServer 服务进程中启动。

PMS 就是通过第二种方式启动的,PMS 的启动流程大致如下

  • 首先,在 PMS 的 main 函数中,会创建一个很重要的对象 Injector。传入的参数是一堆的生产者的 lambda 表达式。然后还创建了一个 HandlerThread(backgroundThread)。
  • 创建了一个 PMS 对象,并将它发布到 ServiceManager,服务的名字叫 package
  • 创建了一个 PackageManagerNative 对象,并将它发布到 ServiceManager,服务的名字叫 package_native

然后在 PMS 的构造函数中,做了一大堆初始化的逻辑。具体分为 5 个阶段

  1. 初始化了一堆的变量,并创建了 /data/app 的文件目录。
  2. 扫描系统目录文件 /data/system/package_cache 和 /system/framework
  3. 扫描用户的 app 安装目录 /data/app
  4. 根据系统文件的扫描结果,更新用户 app 的依赖,并删掉没用的数据。如果系统版本有更新,也需要处理
  5. 将 dex 从磁盘读到缓存中等

详细请查看PMS源码解析——PMS的启动流程

五 PMS 解析安装应用,获得四大组件信息的流程

PMS 解析安装应用,就是将安装在系统目录 /data/app 下的文件信息,加载到内存中。围绕的问题就是我们写的那些代码文件,PMS 是如何将它变成四大组件启动的?

简单概况就是

  1. PMS 启动的时候会对系统和安装的应用进行扫描
  2. PMS 会对扫描的应用进行解析,把他们的四大组件添加到 ComponentResolver 中对应的集合,后续启动的时候,就会从 ComponentResolver 中获取

今天,我们就带着这两个问题,来了解一下 PMS 启动的,解析应用的原理。

详细请查看PMS工作原理解析——app目录的解析流程

六 APK 的安装流程

PMS 还有一个重要的作用,那就是应用的安装。不论是系统应用还是系统更新的安装,还是我们用户应用的安装,都是通过 PMS 进行的。而 PMS 的安装流程也是及时冗长的。

其中包含了大量安装包的验证,更新的验证,更新失败的回滚,并且也会做 PMS 启动时的那套,应用的扫描与解析。整体的流程很长,大致总结如下。

  1. 首先启动一个安装应用的界面 Activity。用户可用在这个界面选择是否安装,并且这个界面还有此时安装的应用的信息(图标,名字,权限等等)。
  2. 如果用户选择同意,就会通过 PMS 创建一个 session,这个 session 的 id 是系统唯一的。
  3. PMS 会通过 Handler 的消息机制,最后调用到 handleInstall 这个函数,它就是应用安装的开始。
  4. 应用的安装会分为两种,一种是 Stage 为 true,这种会在下次启动启动时安装,一种则是普通应用的安装。
  5. 安装的流程大致分为以下几步
    1. 校验安装包
    2. 拷贝 apk
    3. 扫描 apk 解析安装文件
    4. 对安装包做 dex 优化
    5. 通知观察者。

详细请查看PMS源码解析——apk的安装流程