PackageManagerService启动

news/2025/7/8 15:46:54

PackageManagerService启动

android11-release

SystemServer 启动 PackageManagerService

在 startBootstrapServices 中启动 PackageManagerService

  • PackageManagerService.main() 过程主要是创建PKMS服务,并注册到ServiceManager
  • Installer 连接 “installd” 服务,正干活的是installd守护进程
  • mOnlyCore 只有在加密设备时只运行“核心”应用程序,创建一个极简的启动环境。读取"vold.decrypt"属性,值为"trigger_restart_min_framework""1"时为true
  • mFirstBoot 是否首次启动,后面WMS创建时所需要的参数。
  • mPackageManager 创建ApplicationPackageManager转化成父类PackageManager。
  • SystemServerDexLoadReporter 捕获系统服务加载的任何dex文件。
        // Wait for installd to finish starting up so that it has a chance to// create critical directories such as /data/user with the appropriate// permissions.  We need this to complete before we initialize other services.t.traceBegin("StartInstaller");Installer installer = mSystemServiceManager.startService(Installer.class);t.traceEnd();
//... ... ... ...// Only run "core" apps if we're encrypting the device.String cryptState = VoldProperties.decrypt().orElse("");if (ENCRYPTING_STATE.equals(cryptState)) {Slog.w(TAG, "Detected encryption in progress - only parsing core apps");mOnlyCore = true;} else if (ENCRYPTED_STATE.equals(cryptState)) {Slog.w(TAG, "Device encrypted - only parsing core apps");mOnlyCore = true;}// Start the package manager.if (!mRuntimeRestart) {FrameworkStatsLog.write(FrameworkStatsLog.BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED,FrameworkStatsLog.BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__PACKAGE_MANAGER_INIT_START,SystemClock.elapsedRealtime());}t.traceBegin("StartPackageManagerService");try {Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");mPackageManagerService = PackageManagerService.main(mSystemContext, installer,mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);} finally {Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");}// Now that the package manager has started, register the dex load reporter to capture any// dex files loaded by system server.// These dex files will be optimized by the BackgroundDexOptService.SystemServerDexLoadReporter.configureSystemServerDexReporter(mPackageManagerService);mFirstBoot = mPackageManagerService.isFirstBoot();mPackageManager = mSystemContext.getPackageManager();t.traceEnd();

PackageManagerService.main()

创建PKMS服务package和服务package_native并注册到ServiceManager

    public static PackageManagerService main(Context context, Installer installer,boolean factoryTest, boolean onlyCore) {// ... ...PackageManagerService m = new PackageManagerService(injector, onlyCore, factoryTest);t.traceEnd(); // "create package manager"// ... ..m.installWhitelistedSystemPackages();ServiceManager.addService("package", m);final PackageManagerNative pmn = m.new PackageManagerNative();ServiceManager.addService("package_native", pmn);return m;}

查看相应的EventLog输出分如下阶段:

  • BOOT_PROGRESS_PMS_START(开始阶段)
  • BOOT_PROGRESS_PMS_SYSTEM_SCAN_START(扫描系统阶段)
  • BOOT_PROGRESS_PMS_DATA_SCAN_START(扫描Data分区阶段)
  • BOOT_PROGRESS_PMS_SCAN_END(扫描结束阶段)
  • BOOT_PROGRESS_PMS_READY(准备阶段)

BOOT_PROGRESS_PMS_START

EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START, SystemClock.uptimeMillis());在PackageManagerService初始化中,mInstallLock、mLock两把锁前后

  • 创建提供服务/数据的子组件。这里的秩序很重要。
    在这里插入图片描述
  • 添加system, phone, log, nfc, bluetooth, shell, se, networkstack 这八种shareUserId到mSettings
    在这里插入图片描述
  • 创建Dex优化相关类
    在这里插入图片描述
  • 获取系统配置信息
    在这里插入图片描述
  • 各种扫描的目录mDirsToScanAsSystem
    在这里插入图片描述
  • 创建名为“PackageManager”的ServiceThread线程,创建PackageHandler绑定到ServiceThread的消息队列,并将PackageHandler添加到Watchdog的检测集中;mInstallLock、mLock两把锁
    在这里插入图片描述
  • 获取共享库
    在这里插入图片描述
  • !mOnlyCore和第一次启动执行requestCopyPreoptedFiles()
    在这里插入图片描述

BOOT_PROGRESS_PMS_SYSTEM_SCAN_START

EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SYSTEM_SCAN_START, startTime);在PackageManagerService初始化中,mInstallLock、mLock两把锁中

  • scanDirTracedLI扫描目录partition.getOverlayFolder()frameworkDirpartition.getPrivAppFolder()partition.getAppFolder()
    在这里插入图片描述
  • !mOnlyCore执行
    在这里插入图片描述

BOOT_PROGRESS_PMS_DATA_SCAN_START

EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START, SystemClock.uptimeMillis());在PackageManagerService初始化中,mInstallLock、mLock两把锁中

  • scanDirTracedLI扫描目录sAppInstallDir
    在这里插入图片描述

BOOT_PROGRESS_PMS_SCAN_END

EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END, SystemClock.uptimeMillis());在PackageManagerService初始化中,mInstallLock、mLock两把锁中

  • 当sdk版本不一致时,需要更新权限
    在这里插入图片描述
  • 初始化所有用户定义的默认首选App
    在这里插入图片描述
  • OTA后的第一次启动,会清除代码缓存目录
    在这里插入图片描述
  • 将现有(安装在Q之前)的非系统应用程序隐藏在launcher中的图标。
    在这里插入图片描述
  • 把Settings的信息写回到packages.xml中
    在这里插入图片描述

BOOT_PROGRESS_PMS_READY

EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_READY, SystemClock.uptimeMillis());在PackageManagerService初始化中,mInstallLock、mLock两把锁中

  • 创建 PackageInstallerService 是用于管理安装会话的服务,它会为每次安装过程分配一个SessionId
    在这里插入图片描述

SystemServer 启动 A/B OTA选择服务

在这里插入图片描述

startOtherServices中PackageManagerService.systemReady()

SystemServer 在 startBootstrapServices 中

  • updatePackagesIfNeeded、performFstrimIfNeeded
    在这里插入图片描述
  • mPackageManagerService.systemReady()
    在这里插入图片描述

PackageManagerService启动时序图

在这里插入图片描述


https://dhexx.cn/news/show-591697.html

相关文章

L2权重衰减就是L2正则化 的 代码实现

本文以Paddle为例,torch操作也差不多 我在5年前管这个限制参数过大的东西叫正则化,结果现在叫权重衰减了hhh 有点儿跟不上潮流了,我还以以为这个权重衰减是每次迭代给权重乘以一个0.99999,让他进行衰减呢(这样操作也衰减的太快了…

【转载】 HDU 动态规划46题【只提供思路与状态转移方程】

1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总的概率以为是抢N家银行的概率之和… 把状态转移方程写成了f[j]max{f[j],f[j-q[i].v]q…

JavaFX: HTML编辑器和加载

JavaFX: HTML编辑器和加载 Module javafx.web HTMLEditor javafx.scene.web.HTMLEditor <VBox alignment"CENTER" spacing"20.0" xmlns:fx"http://javafx.com/fxml"fx:controller"org.xhbruce.xhnote.HtmlController"><…

Jmeter+Ant+Jenkins搭建持续集成的接口测试

2019独角兽企业重金招聘Python工程师标准>>> 目录[-] 一、Jmeterant二、JmeterantJenkins三、Tomcat配置虚拟目录一、Jmeterant 1、首先我们默认Jmeter脚本已经录制好了&#xff0c;并测试通过&#xff0c;存在&#xff08;查询模块.jmx&#xff09;脚本 2、将JMet…

MarkDown语法备忘

MarkDown语法备忘 markdown - 百度百科&#xff0c;Markdown是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;英语&#xff1a;John Gruber&#xff09;。也就是Markdown是一个标准&#xff0c;按照标准有.md或.markdown扩展名文本文件。 Markdown备忘表-Mar…

JavaFX:集成MarkDown

JavaFX:集成MarkDown 相关软件&#xff1a;Typora、Atom文本编辑器、MWeb、Quiver 相关网址&#xff1a;Markdown 中文网、Markdown 教程 相关开源项目&#xff1a;Editor.md&#xff1a;开源在线 Markdown 编辑器、yanxingang / MarkDown笔记本、lcpsky / note、MarkDown工具…

0524删除文件夹的方法

<?phpfunction deldir($dirname) {if(!file_exists($dirname)) {die("文件夹不存在!");}//如果是文件&#xff0c;就可以直接删除if(is_file($dirname)) {unlink($dirname);exit();}//打开目录资源$dir opendir($dirname);while($filename readdir($dir)) …

LeetCode 二分法查找

704. 二分法查找 整数除法&#xff0c;小数部分强制转换为整数&#xff1b;需要注意最后结束和最后前后坐标比较 class Solution {public int search(int[] nums, int target) {int max nums.length - 1;int min 0;int mid max / 2;while (max > min) {//System.out.pri…

Servlet再度学习

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载注明出处http://blog.csdn.net/u013142781 目录(?)[] 虽然Servlet已经使用很多了&#xff0c;但是一直都仅局限在其使用操作上。 最近有空想对它进行一个相对全面的了解。 下面是博主整理的一篇博文。 一、Servlet简介…

LeetCode 第一个错误的版本

278. 第一个错误的版本 可以利用二分法 LeetCode 二分法查找 /* The isBadVersion API is defined in the parent class VersionControl.boolean isBadVersion(int version); */public class Solution extends VersionControl {public int firstBadVersion(int n) {int left 1…