PKMS概述
PKMS指PackageManagerService服务本身以及PackageManagerService服务运作时使用到的各种其他系统服务;是Android系统中的核心服务之一,负责应用程序的安装、卸载以及信息查询等工作;
PKMS主要工作
1.解析AndroidManifest.xml文件,解析清单文件中的所有节点信息;
2.扫描.apk文件,安装系统应用、本地应用等;
3.管理本地应用,主要有安装、卸载、应用信息查询等;
PKMS架构设计
客户端通过拿到ApplicationPackageManager对象,通过binder进行跨进程通信,调用到PackageManagerService中的方法进行apk安装;
PKMS启动流程
startBootstrapServices()
首先启动Installer服务,也就是安装器,随后判断当前的设备是否是出于加密状态。如果是出于加密状态则只是解析核心应用,接着调用PackageManagerService的静态方法main来创建PKMS对象。
startOtherServices()
启动其他服务、对dex进行优化、进行磁盘清理、通知PKMS及其子组件系统已就绪;
PKMS相关方法
PKMS.main
public static PackageManagerService main(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
// Self-check for initial settings.
// (1) 检查Package编译相关系统属性
PackageManagerServiceCompilerMapping.checkProperties();
// (2) 构造PackageManagerService对象
PackageManagerService m = new PackageManagerService(injector, onlyCore, factoryTest);
// 基于用户类型,为所有用户安装/卸载系统应用
m.installWhitelistedSystemPackages();
// 向ServiceManager注册PKMS(启动package服务)
ServiceManager.addService("package", m);
// 构造PackageManagerNative对象
final PackageManagerNative pmn = m.new PackageManagerNative();
// 启动package_native服务
ServiceManager.addService("package_native", pmn);
return m;
}
PKMS构造函数
此函数由两个重要的锁(mInstallLock和mLock)和五个阶段构成。在Android 11.0源码中是由(mInstallLock和mPackages)两个锁
mInstallLock、mLock:用来保护所有安装apk的访问权限,此操作通常涉及繁重的磁盘数据读写等操作。并且是单线程操作,所以有时候会处理很慢。此锁不会在已经持有了mLock锁的情况下加锁,反之,在已经持有mInstallLock锁的情况下,立即获得mLock是安全的。
mPackages(mLock):用来解析内存中所有apk的package信息及相关状态。
PKMS服务也是通过Binder进行通信,IPackageManager.aidl由工具转换后自动生成Binder的服务端IPackageManager.Stub和客户端IPackageManager.Stub.Proxy。
Binder服务端:PackageManagerService继承自IPackageManager.Stub
Binder客户端:ApplicationPackageManager(简称APM)的成员变量mPm继承于IPackageManager.Stub.Proxy。本身APM继承与PackageManager对象。
5个阶段构成:
阶段1:BOOT_PROGRESS_PMS_START 开始阶段
(1) 初始化PMS的各个子组件/子服务以及相关属性;
(2) 解析package.xml,获取已经安装的App信息,存储到Settings的mPackages中;
(3) 创建了后台工作线程及其Handler;
阶段2:BOOT_PROGRESS_PMS_SYSTEM_SCAN_START 系统扫描阶段
(1) 扫描各个系统分区的的App;
(2)解析系统App信息;
(3)把解析结果存储起来,存储在PMS的相关属性和mSettings里;
阶段3:BOOT_PROGRESS_PMS_DATA_SCAN_START Data扫描阶段
(1)这个阶段对/data/app进行了扫描,主要工作与扫描系统App目录是一样的,只是细节处理上有些不同。另外还做了一些扫尾工作。
阶段4:BOOT_PROGRESS_PMS_SCAN_END 扫描结束
(1) 如果SDK版本发生了变化(升级系统),重新对App进行授权;
(2) 为系统核心服务准备存储空间;
(3) 如果是升级后第一次正常启动,需要清除代码缓存,但不是会清除应用的配置文件;
(4) 把更新后的信息写回对应的xml文件中;
阶段5:BOOT_PROGRESS_PMS_READY 就绪阶段
(1)创建PackageInstallerService对象
(2)GC回收内存
小结
PKMS在SystemServer里面创建,并向ServiceManager注册。其创建过程分为五个阶段,在此过程中会从packages.xml等相关文件中读取上次保存的包列表和实时扫描的列表进行比较和更新,处理升级事宜,最后把更新后的包列表重新持久化。
另外,创建完成之后还进行了一些dex优化、磁盘清理等等一些列额外操作。
结语
如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )