美文网首页
移动架构----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