【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的启动流程如下图:
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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。