美文网首页
移动架构----PMS启动流程

移动架构----PMS启动流程

作者: _浮生若梦 | 来源:发表于2020-01-04 15:19 被阅读0次

以下代码基于Android8.0。
PackageManagerService简称为PMS,管理着所有跟package相关的工作,常见的比如安装、卸载应用。

1、启动入口

PMS属于系统服务,启动入口在SystemServer中的main方法

public static void main(String[] args) {
    new SystemServer().run();
}
private void run() {
    ...
        traceBeginAndSlog("StartServices");
        //启动引导服务,PMS的启动包含在此
        startBootstrapServices();
        //启动核心服务
        startCoreServices();
        //启动其他服务
        startOtherServices();
    ...
}
private void startBootstrapServices() {
    ...
    //启动安装服务
    traceBeginAndSlog("StartInstaller");
    Installer installer = mSystemServiceManager.startService(Installer.class);
    traceEnd();
    ...
    //启动PMS
    // Start the package manager.
    if (!mRuntimeRestart) {
        MetricsLogger.histogram(null, "boot_package_manager_init_start",
                (int) SystemClock.elapsedRealtime());
    }
    traceBeginAndSlog("StartPackageManagerService");
    mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
            mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
    mFirstBoot = mPackageManagerService.isFirstBoot();
    mPackageManager = mSystemContext.getPackageManager();
    traceEnd();
    if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {
        MetricsLogger.histogram(null, "boot_package_manager_init_ready",
                (int) SystemClock.elapsedRealtime());
    }
    ...
}

概括来讲,Android系统启动时,会创建SystemServer进程,进程运行会执行SystemServer类中的run方法,在run方法中会启动三类服务,包括引导服务、核心服务和其他服务,PMS包含在引导服务中,在启动引导服务时启动PMS。

2、PMS构造方法

在PMS启动时,会调用PackageManagerService中的main方法,看下main方法做了些啥工作:

public static PackageManagerService main(Context context, Installer installer,
        boolean factoryTest, boolean onlyCore) {
    // Self-check for initial settings.
    PackageManagerServiceCompilerMapping.checkProperties();

    PackageManagerService m = new PackageManagerService(context, installer,
            factoryTest, onlyCore);
    m.enableSystemUserPackages();
    ServiceManager.addService("package", m);
    return m;
}

可以看出,这里其实就是初始化了PMS对象,然后添加到了ServiceManager中,ServerManager即为binder线程池,即PMS注册到了Binder。接下来看下构造方法。
PMS的构造方法比较庞大,总体可以分为五个阶段:

BOOT_PROGRESS_PMS_START
  1. 扫描并解析 ,XML 文件,将其中的信息保存到特定的数据结构中。
  2. 保存installer对象到mInstaller
  3. 创建/system的子目录,比如/system/framework、system/priv-app和/system/app等等
BOOT_PROGRESS_PMS_SYSTEM_SCAN_START
  1. 扫描系统文件,比如/vendor/overlay、/system/framework、/system/app等等目录下的文件,对扫描到的系统文件做后续处理。
  2. /system/frameworks:该目录中的文件都是系统库,例如:framework.jar、services.jar、framework-res.apk。不过 scanDirLI 只扫描APK文件,所以 framework-res.apk 是该目录中唯一“受宠”的文件。
    该目录下全是默认的系统应用,例如:Browser.apk、SettingsProvider.apk 等。
    /vendor/app:该目录中的文件由厂商提供,即厂商特定的 APK 文件,不过目前市面上的厂商都把自己的应用放在 /system/app 目录下。
BOOT_PROGRESS_PMS_DATA_SCAN_START
  1. 扫描/data/app和/data/app-private目录下的文件
  2. 遍历possiblyDeletedUpdatedSystemApps列表,如果这个系统App的包信息不在PMS的变量mPackages中,说明是残留的App信息,后续会删除它的数据。说明是存在于Data分区,不属于系统App,那么移除其系统权限。
  3. 遍历mExpectingBetter列表,根据系统App所在的目录设置扫描的解析参数,内部会将
    packageName对应的包设置数据(PackageSetting)添加到mSettings的mPackages中。扫描系统App的升级包,最后清除mExpectingBetter列表。
BOOT_PROGRESS_PMS_SCAN_END
  1. 如果当前平台SDK版本和上次启动时的SDK版本不同,重新更新APK的授权
  2. 如果是第一次启动或者是Android M升级后的第一次启动,需要初始化所有用户定义的默认首选App。
  3. OTA升级后的第一次启动,会清除代码缓存目录。
  4. 把Settings的内容保存到packages.xml中,这样此后PMS再次创建时会读到此前保存的Settings的内容。
BOOT_PROGRESS_PMS_READY

准备阶段

PMS启动流程图

PMS启动流程.png

内置APP安装流程图

内置APP安装流程.png

相关文章

网友评论

      本文标题:移动架构----PMS启动流程

      本文链接:https://www.haomeiwen.com/subject/xdgxactx.html