PKMS,即PackageManagerService。是安卓framework中另一个重要的服务,在安卓APP开发时,我们可以用PKMS获取应用包名,版本号(code/name)与查询应用图标等。
之所以叫PKMS而非PMS是因为在安卓中有太多“PMS”了,例如PowerManagerService。

要了解PKMS的启动流程,关注以下几个类。

  • frameworks/base/services/java/com/android/server/SystemServer.java
  • frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
  • frameworks/base/services/core/java/com/android/server/pm/Settings.java
  • frameworks/base/core/java/android/content/pm/PackageParser.java
  • frameworks/base/core/java/android/content/res/AssetManager.java

1、System_server启动PKMS

frameworks/base/services/java/com/android/server/SystemServer.javaprivate void startBootstrapServices() {...// Start the package manager.traceBeginAndSlog("StartPackageManagerService");try {Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");mPackageManagerService = PackageManagerService.main(mSystemContext, installer,mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);} finally {Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");}mPackageManager = mSystemContext.getPackageManager();traceEnd();
}
...

可以看到,System_server调用 PackageManagerService.main()方法启动了PKMS。
此main方法非常简单,就是new了一个PKMS对象,然后调用ServiceManager.addService()方法将其注册到ServiceManager中。
PKMS启动的关键也是在其构造函数new方法中。

 frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.javapublic static PackageManagerService main(Context context, Installer installer,boolean factoryTest, boolean onlyCore) {// Self-check for initial settings.PackageManagerServiceCompilerMapping.checkProperties();PackageManagerService m = new PackageManagerService(context, installer,factoryTest, onlyCore);m.enableSystemUserPackages();ServiceManager.addService("package", m);final PackageManagerNative pmn = m.new PackageManagerNative();ServiceManager.addService("package_native", pmn);return m;}

启动PMS过程中,主要就是执行PMS的构造函数。

2、PMS的构造函数

在PMS构造阶段,有EventLog输出明显区分为5个阶段:

  1.     EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,SystemClock.uptimeMillis());
    
  2.      EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SYSTEM_SCAN_START,startTime);
    
  3.      EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,SystemClock.uptimeMillis());
    
  4.      EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END,SystemClock.uptimeMillis())
    
  5.      EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_READY,SystemClock.uptimeMillis());
    

2.1 BOOT_PROGRESS_PMS_START

public PackageManagerService(Injector injector, boolean onlyCore, boolean factoryTest) {...
//准备一些成员变量,其中Injector对象实在PMS.main()方法中初始化然后传过来的。
//Injector对象中包含了context,该context为SystemServer的mSystemContext。
//onlyCore标记是否只加载核心服务,正常开机启动过程此变量为false。mContext = injector.getContext();mFactoryTest = factoryTest;mOnlyCore = onlyCore;mMetrics = new DisplayMetrics();mInstaller = injector.getInstaller();// 公开供系统组件使用的私有服务,系统组件只需要在LocalServices中找PMS使用即可,不需要在servicemanager中findService()。//类似的在其他系统服务中也会有对应的Internal对象,如:ActivityManagerInternal。mPmInternal = new PackageManagerInternalImpl();LocalServices.addService(PackageManagerInternal.class, mPmInternal);//创建Setting对象,Setting对象是可以用于全局存储的对象。在创建此Setting的过程中,//也会/data/system目录下的文件,如:packages.xml,packages.list等mSettings = injector.getSettings();//往Setting中添加shareUserIdt.traceBegin("addSharedUsers");mSettings.addSharedUserLPw("android.uid.system", Process.SYSTEM_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);mSettings.addSharedUserLPw("android.uid.phone", RADIO_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);mSettings.addSharedUserLPw("android.uid.log", LOG_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);mSettings.addSharedUserLPw("android.uid.nfc", NFC_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);mSettings.addSharedUserLPw("android.uid.bluetooth", BLUETOOTH_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);mSettings.addSharedUserLPw("android.uid.shell", SHELL_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);mSettings.addSharedUserLPw("android.uid.se", SE_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);mSettings.addSharedUserLPw("android.uid.networkstack", NETWORKSTACK_UID,ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);t.traceEnd();//获取系统配置信息t.traceBegin("get system config");SystemConfig systemConfig = SystemConfig.getInstance();mAvailableFeatures = systemConfig.getAvailableFeatures();ApplicationPackageManager.invalidateHasSystemFeatureCache();t.traceEnd();// writersynchronized (mLock) {//PMS Looper initmHandlerThread = new ServiceThread(TAG,Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);mHandlerThread.start();//PMS Handler initmHandler = new PackageHandler(mHandlerThread.getLooper());//addWatchdog.getInstance().addThread(mHandler, WATCHDOG_TIMEOUT);...

待续…

【安卓开机启动】PKMS启动流程(writing)相关推荐

  1. Android高工必备:说说从手机开机到APP启动FrameWork层的整体执行流程

    引言 本文讲解从开机到app显示画面的流程,但不分析源码,如果想阅读源码请到参考文章中查阅. 纸上说来终觉浅,建议有时间的小伙伴去我的B站观看视频讲解:Android进阶:手机开机到APP启动中间Fr ...

  2. Android系统开机到Launcher启动流程分析

    本文基于Android10.0的源码. 由于google团队在对framework层代码进行大量重构,所以代码变动还是挺大的. 常见基础问题: SystemServer系统服务进程是如何创建的?Lau ...

  3. oracle10g启动顺序,oracle 10g rac维护:开机 关机顺序,流程

    维护oracle rac的时候,可能需要关闭数据库,甚至关闭服务器. 具体的开机关机顺序如下:(oracle 用户下) 1.关机顺序 (1)关闭集群oem emctl stop dbconsole - ...

  4. Android 开机动画(bootanimation)启动

    Android 开机动画(bootanimation)启动 Android 开机动画启动 前言 一.简单的对话 二.过程 总结 前言 开机动画应该算是我接触的第一个AOSP的Native程序,网上讲解 ...

  5. Android程序包管理(1)--PKMS启动过程

    一.PKMS启动过程 1.重要文件目录介绍 1.目录: /system/ect/permissions/xxx.xml:加载系统feature /system/ect/permissions/plat ...

  6. Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

  7. rhel系统启动过程_技术|Linux 开机引导和启动过程详解

    你是否曾经对操作系统为何能够执行应用程序而感到疑惑?那么本文将为你揭开操作系统引导与启动的面纱. 理解操作系统开机引导和启动过程对于配置操作系统和解决相关启动问题是至关重要的.该文章陈述了 GRUB2 ...

  8. 安卓性能优化之启动优化

    安卓性能优化之启动优化 两个定律 2-5-8原则 八秒定律 启动方式 冷启动 热启动 温启动 启动耗时统计 系统日志 adb命令 启动耗时分析 CPU Profile 工具介绍 使用方式 数据分析 C ...

  9. 安卓桌面软件_银河麒麟即时通讯工具教程02:安卓应用安装、启动和卸载

    <银河麒麟即时通讯工具安装和使用>系列教程,将为大家介绍银河麒麟系统上即时通讯工具(微信.QQ.LinuxQQ.麒麟传书)安装.使用.卸载,包括桌面版工具及安卓兼容Kydroid版两类方式 ...

最新文章

  1. matlab中用colfilt实现非线性滤波(图片版)
  2. ubuntu安装docker下载慢,运行hello-world超时
  3. WPF xml配置文件里面的大于小于号转义
  4. 使用Github Actions构建、发布和部署NuGet软件包
  5. idea 查询项目代码行数_程序员的福利,四个技巧,让OneNote支持代码高亮
  6. c语言饭卡管理系统_C语言饭卡管理系统毕业设计(含毕业论文、程序源码)论文字数:15422字 C0004-C语言毕业设计下载-华软网...
  7. mysql语法检查工具_sql语法分析器(sql语法分析工具)
  8. 图解机器学习算法(10) | XGBoost模型最全解析(机器学习通关指南·完结)
  9. android pin码解锁,解锁三星的3种方法:SIM网络解锁PIN码
  10. STM32CUBEMX_定时器控制LED闪烁
  11. Linux学习系列 --awk命令学习
  12. 用go编写区块链系列之7--网络
  13. c语言大作业成绩分析问题,河南科技大学c语言课程设计-综合排序设计报告-成绩分析问题.doc...
  14. 无限宝无法连接服务器是什么问题,无限宝客户端安装问题
  15. java环境的搭建及环境变量的配置
  16. 手提电脑windows8.1 置 android手机usb连接,[Notes] Android手机轻松显示win10笔记本电脑而无需应用程序和USB连接...
  17. 知乎、B站为何成「中国社区」概念股?
  18. Windows环境db2start报错:依赖服务或组无法启动
  19. 将Excel文件另存为制定格式的DBF-做了一半
  20. ❤️ 跟我一起用python追到女朋友!❤️

热门文章

  1. chromium相关问题集合--持续更新中
  2. 苹果照片丢失,别着急!跟我一步步操作,轻松找回!
  3. idea中安装redis插件以及使用指南
  4. 指标的统一管理和分析平台
  5. 网络安全学习篇35_第二阶段_lnmp、Nginx简单配置+安装报错:C compiler cc is not found缺少环境解决、安装php5.3.28
  6. Web3社交=身份系统(DID)+数据系统
  7. 2020年加密货币领域的5大做市商,都有谁?
  8. [数组]买股票的最佳时机[亚马逊、远景能源]
  9. 国际城市解决交通系统运行问题的经验及启示
  10. 统计一个英文文本文件中26个英文字母出现次数并按英文字母序输出统计结果,查找并替换此英文文本文件中某字符串。