
一、PMS整体的结构图
二、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回收内存
以上是内存溢出为你收集整理的Android PMS之启动流程全部内容,希望文章能够帮你解决Android PMS之启动流程所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)