android pms架构图,Android PMS之启动流程
一、PMS整體的結構圖
PMS是通過Binder機制進行與客戶端的通信,其中:
Binder服務端:即系統服務PackageManagerService extends IPackageManager.Stub
Binder客戶端:即我們應用層經常使用的PackageManager,但實際上PackageManager是一個抽象類,所以實際使用的ApplicationPackageManager
二、PMS的簡單啟動流程
1、PMS是核心系統服務,所以一定是在SystemServer中啟動的
在SystemServer的main()方法->run()方法中會啟動一些系統服務,其中包括PMS。PMS是在startBootstrapServices方法中進行啟動的,這里是優先啟動一些比較重要的系統服務,包括PMS、AMS等
private void run() {
·····
// Start services.
try {
t.traceBegin("StartServices");
startBootstrapServices(t);
startCoreServices(t);
startOtherServices(t);
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
t.traceEnd(); // StartServices
}
·········
}
在startBootstrapServices方法中調用PMS的main方法
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
`````
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();
``````
}
2、PackageManagerService的main方法
main()方法主要檢查一些屬性,然后執行PackageManagerService的構造函數進行初始化。最后在ServiceManager進行注冊”package”和”package_native”
public static PackageManagerService main(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
// Self-check for initial settings.
PackageManagerServiceCompilerMapping.checkProperties();
``````
PackageManagerService m = new PackageManagerService(injector, onlyCore, factoryTest);
m.installWhitelistedSystemPackages();
ServiceManager.addService("package", m);
final PackageManagerNative pmn = m.new PackageManagerNative();
ServiceManager.addService("package_native", pmn);
return m;
}
3、PackageManagerService的構造函數
PackageManagerService構造函數做了pms啟動的主要事情。
主要包含以下五個階段
階段1:BOOT_PROGRESS_PMS_START
階段2:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START
階段3:BOOT_PROGRESS_PMS_DATA_SCAN_START
階段4:BOOT_PROGRESS_PMS_SCAN_END
階段5:BOOT_PROGRESS_PMS_READY
階段1:BOOT_PROGRESS_PMS_START
主要工作:
(1)構造 DisplayMetrics ,保存分辨率等相關信息;
(2)創建Installer對象,與installd交互;
(3)創建mPermissionManager對象,進行權限管理;
(4)構造Settings類,保存安裝包信息,清除路徑不存在的孤立應用,主要涉及/data/system/目錄的packages.xml,packages-backup.xml,packages.list,packages-stopped.xml,packages-stopped-backup.xml等文件。
(5)構造PackageDexOptimizer及DexManager類,處理dex優化;
(6)創建SystemConfig實例,獲取系統配置信息,配置共享lib庫;
(7)創建PackageManager的handler線程,循環處理外部安裝相關消息。
階段2:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START
主要工作:
(1)從init.rc中獲取環境變量BOOTCLASSPATH和SYSTEMSERVERCLASSPATH;
(2)對于舊版本升級的情況,將安裝時獲取權限變更為運行時申請權限;
(3)掃描system/vendor/product/odm/oem等目錄的priv-app、app、overlay包;
(4)清除安裝時臨時文件以及其他不必要的信息。
階段3:BOOT_PROGRESS_PMS_DATA_SCAN_START
主要工作:
(1)處理data目錄的應用信息,及時更新,祛除不必要的數據。
階段4:BOOT_PROGRESS_PMS_SCAN_END
主要工作:
(1)sdk版本變更,更新權限;
(2)OTA升級后首次啟動,清除不必要的緩存數據;
(3)權限等默認項更新完后,清理相關數據;
(4)更新package.xml
階段5:BOOT_PROGRESS_PMS_READY
主要工作:
(1)創建PackageInstallerService對象
(2)GC回收內存
標簽:PackageManagerService,PMS,流程,package,BOOT,PROGRESS,Android,main
來源: https://blog.csdn.net/kh896424665/article/details/111601078
總結
以上是生活随笔為你收集整理的android pms架构图,Android PMS之启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux系统的服务
- 下一篇: android 手势高度,克制的 And