Android系统服务PKMS(PackageManagerService)

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对象。

3.3权限管理

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值