PKMS核心分析(一)
简单来需知:PKMS 与 AMS 一样,也是Android系统核心服务之一,非常非常的重要,主要完成以下核 心功能:
1.解析AndroidNanifest.xml清单文件,解析清单文件中的所有节点信息
2.扫描.apk文件,安装系统应用,安装本地应用等
3.管理本地应用,主要有, 安装,卸载,应用信息查询 等
自我总结:PKMS是属于Binder机制的服务端角色
PKMS启动过程描述:
SystemServer启动PKMS: 先是在SystemServer.startBootstrapServices()函数中启动PKMS服务,
再调用startOtherServices()函数中对dex优化,磁盘管理功能,让PKMS进入systemReady状态。
七步走,文字不如画图:
第一步 到 第四步:
startBootstrapServices()首先启动Installer服务,也就是安装器,随后判断当前的设备是否处于加密状态,如果是则只是解析核心应用,接着调用PackageManagerService的静态方法main来创建pms对象
第一步: 启动Installer服务
第二步:获取设备是否加密(手机设置密码),如果设备加密了,则只解析"core"应用
第三步: 调用PKMS main方法初始化PackageManagerService,其中调用PackageManagerService() 构造函数创建了PKMS对象
第四步: 如果设备没有加密,操作它。管理A/B OTA dexopting。
第五步,第六步,第七步:
startOtherServices
第五步: 执行 updatePackagesIfNeeded ,完成dex优化;
第六步: 执行 performFstrimIfNeeded ,完成磁盘维护;
第七步: 调用systemReady,准备就绪。
第三步细节:PKMS.main() main函数主要工作:
- 检查Package编译相关系统属性
- 调用PackageManagerService构造方法
- 启用部分应用服务于多用户场景
- 往ServiceManager中注册”package”和”package_native”。
public static PackageManagerService main(Context context, Installer installer,boolean factoryTest, boolean onlyCore) {// (1)检查Package编译相关系统属性PackageManagerServiceCompilerMapping.checkProperties();//(2)调用PackageManagerService构造方法PackageManagerService m = new PackageManagerService(context, installer,factoryTest, onlyCore);//(3)启用部分应用服务于多用户场景m.enableSystemUserPackages();//(4)往ServiceManager中注册”package”和”package_native”。ServiceManager.addService("package", m);final PackageManagerNative pmn = m.new PackageManagerNative();ServiceManager.addService("package_native", pmn);return m;
}
【PKMS构造方法】:
PKMS构造方法,整体描述图: