Android系统方面那些事Android基础知识安卓

Android PMS(一)-启动流程

2019-07-17  本文已影响9人  Stan_Z

PackageManagerService(简称 PMS),是 Android 系统核心服务之一,处理包管理相关的工作,常见的比如安装、卸载应用等。这个系列文章就简单了解下PMS,只简单梳理流程,不抠代码细节,文章牵涉到的源码来自Android 8.0。

一、PMS初始化

PMS作为系统服务,自然还是在SystemServer中启动:

frameworks/base/services/java/com/android/server/SystemServer.java

private void startBootstrapServices() {
    …
    //启动installer服务
   Installer installer = mSystemServiceManager.startService(Installer.class);
    …
    //启动PMS服务
   mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
           mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
    ...
}
private void startOtherServices() {
...
mPackageManagerService.systemReady();
…
}

Installer是一个负责package安装、删除、迁移、更新的系统服务。

PMS的main方法:

public static PackageManagerService main(Context context, Installer installer,
       boolean factoryTest, boolean onlyCore) {
   // Self-check for initial settings.
   PackageManagerServiceCompilerMapping.checkProperties();
    //初始化PMS
   PackageManagerService m = new PackageManagerService(context, installer,
           factoryTest, onlyCore);
   m.enableSystemUserPackages();
    //向ServiceManager注册服务,将service写入/dev/binder中
   ServiceManager.addService("package", m);
   return m;
}

接下来看看PMS的构造方法,这部分代码非常多,主要分5个阶段:

PMS_START阶段

PMS_SYSTEM_SCAN_START阶段

PMS_DATA_SCAN_START阶段

PMS_SCAN_END阶段

PMS_READY阶段

二、构造函数中重点模块解析

2.1 Settings

frameworks/base/services/core/java/com/android/server/pm/Settings.java

Settings的构造函数主要用于创建”data/system”目录和一些xml文件,并配置相应的权限,其中:

readLPw()函数
从/data/system/packages.xml或packages-backup.xml文件中获得packages、permissions相关信息,添加到相关内存列表中。packages.xml文件记录了系统的permisssions以及每个APK的name、codePath、flags、version等信息这些信息主要通过APK的AndroidManifest.xml解析获取,解析完APK后将更新信息写入这个文件,下次开机直接从里面读取相关信息添加到内存相关结构中。当有APK升级、安装或删除时会更新这个文件。

writeLPr函数
将解析出的每个APK的配置信息(mSetting.mPackages)保存到packages.xml和packages.list文件。packages.list记录了如下数据:pkgName, userId, debugFlag, dataPath(包的数据路径)。

2.2 SystemConfig

frameworks/base/services/core/java/com/android/server/SystemConfig.java

通过readPermissions解析指定目录下的xml文件:

readPermissions函数最终会调用readPermissionsFromXml()使用XMLPullParser的方式解析这些XML文件,然后把解析出来的数据结构保存到PMS中。

2.3 scanDirTracedLI

这里就是Apk的解析流程,针对的是系统开机时安装系统应用的场景,遍历对应目录下的所有apk。解析出包信息保存到Package中。

最后总结整个启动过程:

参考:
http://liuwangshu.cn/tags/Android%E5%8C%85%E7%AE%A1%E7%90%86%E6%9C%BA%E5%88%B6/
https://maoao530.github.io/2017/01/10/packagemanager/

上一篇 下一篇

猜你喜欢

热点阅读