【Android】【PMS】PackageManagerService的启动流程

本片文章的主要内容如下:

  • 1、PackageManagerService的启动概述
  • 2、PackageManagerService的启动之SystemServer部分
  • 3、PackageManagerService的启动之PackageManagerService部分
  • 4、PackageManagerService#scanDirLI(File dir, final int parseFlags, int scanFlags, long currentTime)方法解析

一、PackageManagerService的启动概述

PackageManager在启动时会扫描所有的APK文件和jar包,然后把他们的信息读取出来,保存在内存中,这样系统运行时就能迅速找到各种应用和组件的信息。扫描中如果遇到没有优化过的文件还要进行优化工作(dex格式转换成oat格式(Android 5.0以前是odex)),优化后的文件放在/data/dalvik-cache/下面

PackageManagerService的启动流程如下图:

 

【Android】【PMS】PackageManagerService的启动流程

PackageManagerService的启动.png

我把PackageManagerService分为两个部分:

  • 1、SystemServer部分
  • 2、PackageManagerService部分

二、PackageManagerService的启动之SystemServer部分

在Android系统开机启动的时候会调用SystemServer的main方法

1、SystemServer#main(String[])方法

4、SystemServer的startBootstrapServices方法

代码在SystemServer.java 322行

有必要先讲解**释,翻译如下:

开启一小戳重要的系统服务,因为这些系统服务相互之前有这个强耦合性,这就是我们在一个地方初始化的原因。如果你的服务和这些系统没有非常强的依赖性,建议应该在其他方法里面进行初始化。

我将startBootstrapServices方法里面的主要内容分为9块,如下图:

  • 第一块:开启Installer这个Service
  • 第二块:开启ActivityManagerService(Activity管理)这个Service
  • 第三块:开启PowerManagerService(电力管理)这个Service
  • 第四块:开启LightsService(灯光管理)这个Service
  • 第五块:开启DisplayManagerService(显示器管理)这个Service
  • 第六块:开启PackageManagerService(包管理)这个Service
  • 第七块:SystemManager添加UserManagerService(用户管理)
  • 第八块:给mActivityManagerService设置为系统进程
  • 第九块:开启SensorService(传感器管理)这个Service

这里我们重点看下PackageManagerService的启动流程,如下:

启动PackageManagerService,我将其又分为两步

  • 第一步:获取mOnlyCore,mOnlyCore表示仅仅是核心,因为如果我们在加密设备的时候,仅仅能跑"核心"程序。
  • 第二步:调用PackageManagerService的静态main方法,这里注意传入的mOnlyCore是true。

那我们就继续看下PackageManagerService的main方法具体实现

 

启动PackageManagerService,我将其又分为两步

  • 第一步:获取mOnlyCore,mOnlyCore表示仅仅是核心,因为如果我们在加密设备的时候,仅仅能跑"核心"程序。
  • 第二步:调用PackageManagerService的静态main方法,这里注意传入的mOnlyCore是true。

那我们就继续看下PackageManagerService的main方法具体实现



作者:隔壁老李头
链接:https://www.jianshu.com/p/8e2831428110
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。