Jimmy Chen

A Programmer

(原创)PackageManagerService启动流程分析(上)

略久没有写自己写博客了,现在要重新抓起来。最近对Android Framework的内容感兴趣,所以接下来可能会阅读下Framework部分的代码,Android系统部分的代码有机会也会分析分析。今天就先来看看PackageManager和PackageManagerService好了。

一. 简述

  PackageManagerService(PKMS)和PackageManger(PKM)的关系如下图,PKMS是Android系统中核心服务之一,负责package的相关工作,例如安装,卸载以及查询等。

《(原创)PackageManagerService启动流程分析(上)》

  根据博主之前关于Binder部分的博客和上面的图片可以看出,PackageManger继承于IPackageManager.Stub.Porxy,而PackageManagerService则继承于IPackageManager.Stub。相关的父类则是有IPackageManager.aidl编译生成。下面来看PackageManagerService的启动过程。

二. Android启动过程中PKMS所完成的动作

  在之前讲述Android启动流程时有提到,在启动Android过程中会先启动一些重要的service,这里面就包括PKMS,下面我们来看看PKMS启动的代码。

  从上面的代码总结Android启动过程,PKMS所执行的主要操作如下:

  • PackageManagerService.main
  • mPackageManagerService.updatePackagesIfNeeded
  • mPackageManagerService.performFstrimIfNeeded
  • mPackageManagerService.systemReady
  • mPackageManagerService.waitForAppDataPrepared

所以按照上面的执行过程一步一步看代码分析。

2.1 PackageManagerService.main

  main方法的主要动作就是调用PackageManagerService的构造函数,进行初始化并将其添加到ServiceManager中

PackageManagerService构造函数

  PackageManagerService的构造函数可以分成5个阶段进行分析,分阶段的过程主要是按照写EventLog的时间进行区分。PKMS的构造函数

  • EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,SystemClock.uptimeMillis());
  • EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SYSTEM_SCAN_START,startTime);
  • EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,SystemClock.uptimeMillis());
  • EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END,SystemClock.uptimeMillis());
  • EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_READY,SystemClock.uptimeMillis());

2.1.1. BOOT_PROGRESS_PMS_START

  上面的内容我们主要分析其中的两部分,一是创建配置settings的对象,二是创建配置systemConfig对象。

创建settings对象

  接下来直接看settings对象创建的相关内容。

  上面读取的5个文件所包含的内容如下表

《(原创)PackageManagerService启动流程分析(上)》

SystemConfig对象

  readPermissions会读取对应目录下所有的xml文件,根据xml文件对应的节点对libs、features和apps等内容进行配置。查找读取的xml文件路径如下:

  • /system/etc/sysconfig
  • /system/etc/permissions
  • /vendor/etc/sysconfig
  • /vendor/etc/permissions
  • /odm/etc/sysconfig
  • /odm/etc/permissions
  • /oem/etc/sysconfig
  • /oem/etc/permissions

  readPermissions代码如下所示:

  上面的代码比较好理解,这里不做过多解释了。

2.1.2 BOOT_PROGRESS_PMS_SYSTEM_SCAN_START

  接下来看第二个Eventlog前的内容

  BOOTCLASSPATH和SYSTEMSERVERCLASSPATH的值可以通过adb shell env进行查看,查看的结果如下图所示:

《(原创)PackageManagerService启动流程分析(上)》

《(原创)PackageManagerService启动流程分析(上)》

scanDirTracedLI会扫描指定目录下的package,最终调用PackageParser.parseBaseApk来完成AndroidManifest.xml文件的解析,生成Application, activity,service,broadcast, provider等信息。

2.1.3 BOOT_PROGRESS_PMS_SCAN_END

  这里主要是更新非系统package的信息,主要处在/data/app和/data/priv-app路径下面,下面继续往下看

2.1.4 BOOT_PROGRESS_PMS_READY

2.1.5 BOOT_PROGRESS_PMS_READY

上面这最后的部分有点难啊,看不出来做了什么操作,先留着,以后再分析吧。现在主要看的是上面会创建一个PackageInstallerService服务,我们接下来分析这个服务

2.1.6 创建PackageInstallerService

  真不容易,这PackageManagerService的第一部分就先分析到这里,到现在我们才主要分析了PKMS启动的第一个部分:PackageManagerService.main,下面列出的部分我们再下一篇再做分析。

  • mPackageManagerService.updatePackagesIfNeeded
  • mPackageManagerService.performFstrimIfNeeded
  • mPackageManagerService.systemReady
  • mPackageManagerService.waitForAppDataPrepared

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注