PackageManagerService的启动过程——Android 12(一)

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

目录

1. PackageManagerService概述

1.1 PackageManagerService职责

1.2 PKMS内部三把重要的锁

1.3 PKMS在SystemServer中全部业务

2. PKMS的启动

2.1 SystemServer.startBootstrapServices()

2.2 PackageManagerService.main()

2.3 PackageManagerService构造函数

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()

2.5 PackageManagerNative类


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,主要工作有:<

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值