android service详解_面试题:讲讲 PackageManagerService运行流程详解

面试官: 讲讲 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,具体关系如图:

e5ec68e369b22e6538a39c73367c6d9f.png
  • 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值