1、概述
PKMS全称PackageManagerService,是Android核心服务之一,主要负责功能如下:
- 解析AndroidManifest.xml,主要有AndroidManifest中节点信息的解析和提炼。
- 扫描本地文件,主要针对apk,系统应用、本地安装应用等。
- 管理本地apk,包括安装、删除等。
android 安装系统级服务,Android PKMS服务_KellyFrog的博客-CSDN博客
2、核心源码
/frameworks/base/core/java/android/app/ApplicationPackageManager.java
/frameworks/base/services/java/com/android/server/SystemServer.java
/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
/frameworks/base/services/core/java/com/android/server/pm/PackageDexOptimizer.java
/frameworks/base/services/core/java/com/android/server/pm/Installer.java
/frameworks/base/services/core/java/com/android/server/pm/Settings.java
/frameworks/base/services/core/java/com/android/server/pm/permission/BasePermission.java
/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
/frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
/frameworks/base/core/java/android/content/pm/IPackageManager.aidl
/frameworks/base/core/java/android/content/pm/PackageManager.java
/frameworks/base/core/java/com/android/server/SystemConfig.java
3、PKMS框架
3.1、PKMS启动过程
PKMS服务由SystemServer进行启动,在SystemServer中startBootstrapServices()启动PKMS服务,再调用startOtherServices()进行dex优化,磁盘管理等功能,并让PKMS进入systemready状态。
startBootstrapServices()首先启动Installer服务,也就是安装器,随后判断当前的设备是否处于加密状态,如果是则只是解析核心应用,接着调用PackageManagerService的静态方法main来创建pms对象
(1)启动Installer服务
(2)获取设备是否加密(手机设置密码),如果设备加密了,则只解析"core"应用
(3)调用PKMS main方法初始化PackageManagerService,其中调用PackageManagerService()构造函数创建了PKMS对象
(4)如果设备没有加密,操作它。管理A/B OTA dexopting。
startOtherServices()
说明:
(5)执行 updatePackagesIfNeeded ,完成dex优化;
(6)执行 performFstrimIfNeeded ,完成磁盘维护;
(7)调用systemReady,准备就绪。
PKMS初始化时的核心部分为PackageManagerService()构造函数的内容,由两个重要的锁(mInstallLock、mPackages) 和5个阶段构成:
mInstallLock :用来保护所有安装apk的访问权限,此操作通常涉及繁重的磁盘数据读写等操作,并且是单线程操作,故有时候会处理很慢。
此锁不会在已经持有mPackages锁的情况下火的,反之,在已经持有mInstallLock锁的情况下,立即获取mPackages是安全的。
mPackages:用来解析内存中所有apk的package信息及相关状态。
5个阶段:
- 阶段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
PKMS服务也是通过binder进行通信,IPackageManager.aidl由工具转换后自动生成binder的服务端IPackageManager.Stub和客户端IPackageManager.Stub.Proxy,具体关系如图:
Binder服务端:PackageManagerService继承于IPackageManager.Stub;
Binder客户端:ApplicationPackageManager(简称APM)的成员变量mPM继承于IPackageManager.Stub.Proxy; 本身APM是继承于PackageManager对象。