面试官: 讲讲 PackageManagerService运行流程详解
心理分析:PMS与AMS是面试的高发区,面试官通过该问题想了解求职者的android工作年限。一般刚进入android行业 很难弄清楚ams与pms的。而能弄清楚ams与pms工作时间肯定不会短。如何弄清楚pms也成了拿到高薪的一块敲门砖
**求职者:**应该apk安装,apk管理,apk删除讲起,
本文涉及源码基于Android 6.0源码 如需看完本文,需要下载以下源码文件
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.javaframeworks/base/services/core/java/com/android/server/pm/PackageInstallerService.javaframeworks/base/services/core/java/com/android/server/pm/Settings.javaframeworks/base/services/core/java/com/android/server/SystemConfigframeworks/base/core/java/android/content/pm/PackageManager.javaframeworks/base/core/android/java/content/pm/IPackageManager.aidlframeworks/base/core/java/android/content/pm/PackageParser.javaframeworks/base/cmds/pm/src/com/android/commands/pm/Pm.javaframeworks/base/services/core/java/com/android/server/pm/Installer.javaframeworks/base/core/java/com/android/internal/os/InstallerConnection.java
一.概述
PackageManagerService(简称PKMS),是Android系统中核心服务之一,管理着所有跟package相关的工作,常见的比如安装、卸载应用。 PKMS服务也是通过binder进行通信,IPackageManager.aidl由工具转换后自动生成binder的服务端IPackageManager.Stub和客户端IPackageManager.Stub.Proxy,具体关系如图:
- Binder服务端:PackageManagerService继承于IPackageManager.Stub;
- Binder客户端:ApplicationPackageManager(简称APM)的成员变量mPM继承于IPackageManager.Stub.Proxy; 本身APM是继承于PackageManager对象。
Android系统启动过程中,一路启动到SystemServer后,便可以启动framework的各大服务,本文将介绍PKMS的启动过程。
PKMS启动
SystemServer启动过程中涉及到的PKMS如下:
private void startBootstrapServices() { //启动installer服务 Installer installer = mSystemServiceManager.startService(Installer.class); ... //处于加密状态则仅仅解析核心应用 String cryptState = SystemProperties.get("vold.decrypt"); if (ENCRYPTING_STATE.equals(cryptState)) { mOnlyCore = true; // ENCRYPTING_STATE = "trigger_restart_min_framework" } else if (ENCRYPTED_STATE.equals(cryptState)) { mOnlyCore = true; // ENCRYPTED_STATE = "1" } //创建PKMS对象【见小节2.1】 mPackageManagerService = PackageManagerService.main(mSystemContext, installer, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); //PKMS是否首次启动 mFirstBoot = mPackageManagerService.isFirstBoot(); //【见小节3.1】 mPackageManager = mSystemContext.getPackageManager(); ...}
PKMS.main()过程主要是创建PKMS服务,并注册到ServiceManager大管家。
private void startOtherServices() { ... //启动MountService,后续PackageManager会需要使用 mSystemServiceManager.startService(MOUNT_SERVICE_CLASS); //【见小节3.2】 mPackageManagerService.performBootDexOpt(); ... // phase 500 mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); ... //【见小节3.3】 mPackageManagerService.systemReady(); ...}
整个system_server进程启动过程,涉及PKMS服务的主要几个动作如下,接下来分别讲解每个过程
- PKMS.main()
- PKMS.performBootDexOpt
- PKMS.systemReady
二、 PKMS.main
public static PackageManagerService main(Context context, Installer installer, boolean factoryTest, boolean onlyCore) { //初始化PKMS对象 PackageManagerService m = new PackageManagerService(context, installer, factoryTest, onlyCore); //将package服务注册到ServiceManager,这是binder服务的常规注册流程 ServiceManager.addService("package