android pms架构图,Android PMS之启动流程
一、PMS整體的結(jié)構(gòu)圖
PMS是通過Binder機(jī)制進(jìn)行與客戶端的通信,其中:
Binder服務(wù)端:即系統(tǒng)服務(wù)PackageManagerService extends IPackageManager.Stub
Binder客戶端:即我們應(yīng)用層經(jīng)常使用的PackageManager,但實(shí)際上PackageManager是一個(gè)抽象類,所以實(shí)際使用的ApplicationPackageManager
二、PMS的簡(jiǎn)單啟動(dòng)流程
1、PMS是核心系統(tǒng)服務(wù),所以一定是在SystemServer中啟動(dòng)的
在SystemServer的main()方法->run()方法中會(huì)啟動(dòng)一些系統(tǒng)服務(wù),其中包括PMS。PMS是在startBootstrapServices方法中進(jìn)行啟動(dòng)的,這里是優(yōu)先啟動(dòng)一些比較重要的系統(tǒng)服務(wù),包括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方法中調(diào)用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()方法主要檢查一些屬性,然后執(zhí)行PackageManagerService的構(gòu)造函數(shù)進(jìn)行初始化。最后在ServiceManager進(jìn)行注冊(cè)”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的構(gòu)造函數(shù)
PackageManagerService構(gòu)造函數(shù)做了pms啟動(dòng)的主要事情。
主要包含以下五個(gè)階段
階段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)構(gòu)造 DisplayMetrics ,保存分辨率等相關(guān)信息;
(2)創(chuàng)建Installer對(duì)象,與installd交互;
(3)創(chuàng)建mPermissionManager對(duì)象,進(jìn)行權(quán)限管理;
(4)構(gòu)造Settings類,保存安裝包信息,清除路徑不存在的孤立應(yīng)用,主要涉及/data/system/目錄的packages.xml,packages-backup.xml,packages.list,packages-stopped.xml,packages-stopped-backup.xml等文件。
(5)構(gòu)造PackageDexOptimizer及DexManager類,處理dex優(yōu)化;
(6)創(chuàng)建SystemConfig實(shí)例,獲取系統(tǒng)配置信息,配置共享lib庫(kù);
(7)創(chuàng)建PackageManager的handler線程,循環(huán)處理外部安裝相關(guān)消息。
階段2:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START
主要工作:
(1)從init.rc中獲取環(huán)境變量BOOTCLASSPATH和SYSTEMSERVERCLASSPATH;
(2)對(duì)于舊版本升級(jí)的情況,將安裝時(shí)獲取權(quán)限變更為運(yùn)行時(shí)申請(qǐng)權(quán)限;
(3)掃描system/vendor/product/odm/oem等目錄的priv-app、app、overlay包;
(4)清除安裝時(shí)臨時(shí)文件以及其他不必要的信息。
階段3:BOOT_PROGRESS_PMS_DATA_SCAN_START
主要工作:
(1)處理data目錄的應(yīng)用信息,及時(shí)更新,祛除不必要的數(shù)據(jù)。
階段4:BOOT_PROGRESS_PMS_SCAN_END
主要工作:
(1)sdk版本變更,更新權(quán)限;
(2)OTA升級(jí)后首次啟動(dòng),清除不必要的緩存數(shù)據(jù);
(3)權(quán)限等默認(rèn)項(xiàng)更新完后,清理相關(guān)數(shù)據(jù);
(4)更新package.xml
階段5:BOOT_PROGRESS_PMS_READY
主要工作:
(1)創(chuàng)建PackageInstallerService對(duì)象
(2)GC回收內(nèi)存
標(biāo)簽:PackageManagerService,PMS,流程,package,BOOT,PROGRESS,Android,main
來源: https://blog.csdn.net/kh896424665/article/details/111601078
總結(jié)
以上是生活随笔為你收集整理的android pms架构图,Android PMS之启动流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux系统的服务
- 下一篇: android sina oauth2.