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()
、frameworkDir
、partition.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()