目录
2.1 SystemServer.startBootstrapServices()
2.2 PackageManagerService.main()
2.3.1 PKMS构造函数BOOT_PROGRESS_PMS_START阶段
2.3.2 PKMS构造函数BOOT_PROGRESS_PMS_SYSTEM_SCAN_START 阶段
2.3.3 PKMS构造函数BOOT_PROGRESS_PMS_DATA_SCAN 阶段
2.3.4 PKMS构造函数BOOT_PROGRESS_PMS_READY阶段
2.4 PKMS.installWhitelistedSystemPackages()
1. PackageManagerService概述
1.1 PackageManagerService职责
PackageManagerService(简称PKMS)的官方解释:随时随地跟踪所有的APKs。主要职责分为:
- 启动过程中扫描App所有安装目录,解析其中的Apk将相关信息加载到PKMS的数据结构中,同时同步到/data/system/packages.xml中;注册APK信息和其四大组件到PKMS中。
- 负责App的安装和卸载。
- 对外提供接口查询App相关信息。
1.2 PKMS内部三把重要的锁
mLock:用来守护内存中解析的package详情和其他相关状态。这是一个细粒度的锁,只应该短暂持有,因为它是系统中竞争最激烈的锁之一。
mInstallLock :用来守护所有对installd的访问,其操作通常涉及到磁盘上应用数据繁重的读写操作。由于installd是单线程,它的操作经常会很慢,因此在持有该锁的情况下不能再获取该锁。相反,在持有该锁时如果短暂获取mLock锁时安全的。(关于installd请参考)
mSnapshotLock : 用来守护对两个snapshot字段的访问:snapshot本身和snapshot 失效标志。当持有mLock锁时不能获取该锁,相反,在持有mSnapshotLock锁时暂时获取mLock锁是安全的。
final PackageManagerTracedLock mLock;
final Object mInstallLock;
private final Object mSnapshotLock = new Object();
1.3 PKMS在SystemServer中全部业务
PKMS在SystemServer.startBootstrapService()中调用PKMS.main()启动PKMS;如果设备没加密,则管理A/B OTA dexopting;
在SystemServer.startOtherServices()中,如果设备没加密,调用PKMS.updatePackagesIfNeeded()完成dex优化;调用PKMS.performFstrimIfNeeded()完成磁盘维护;最后调用PKMS.systemReady()服务启动就绪;最后调用PKMS.waitForAppDataPrepared()等待所有package准备就绪,整个过程如下图所示:

主要涉及的文件有:
/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java,代码参考地址:PackageManagerService.java
/frameworks/native/libs/binder/aidl/android/content/pm/IPackageManagerNative.aidl,代码参考地址:IPackageManagerNative.aidl
/frameworks/base/core/java/android/content/pm/IPackageManager.aidl,代码参考地址:IPackageManager.aidl
2. PKMS的启动
2.1 SystemServer.startBootstrapServices()
public final class SystemServer implements Dumpable {
private PackageManagerService mPackageManagerService;
private PackageMamager mPackageManager;
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
t.traceBegin("StartPackageManagerService");
try {
Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
domainVerificationService, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF,
mOnlyCore);
} finally {
Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");
}
//既然package manager已经启动.注册dex load report来捕获system server加载的dex文件,
//这些dex文件会被BackgroundDexOptService优化.
SystemServerDexLoadReporter.configureSystemServerDexReporter(mPackageManagerService);
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
t.traceEnd();
...
}
}
2.2 PackageManagerService.main()
如果设备加密,则运行core应用,即onlyCore=true,主要工作有:<

PackageManagerService(PKMS)是Android系统中跟踪和管理所有APK的核心服务。它负责启动时扫描APK,解析信息,安装和卸载应用。PKMS有三把关键锁用于同步不同操作。在系统启动过程中,PKMS在不同阶段执行不同任务,如扫描系统和数据分区,处理dex优化和磁盘维护。此外,它还与native层通过AIDL通信。
最低0.47元/天 解锁文章
698

被折叠的 条评论
为什么被折叠?



