Android PMS(一)-启动流程

原创内容,转载请注明出处,多谢配合。

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

一、ApplicationPackageManager

PMS是系统服务,那么应用层肯定有个PackageManager作为binder call client端来供使用,但是这里要注意,PackageManager是个抽象类,一般使用的是它的实现类:ApplicationPackageManager。

PackageManager提供的功能主要包含如下几点:

  • 提供一个应用程序的所有信息(ApplicationInfo)。
  • 提供四大组件的信息。
  • 查询permission相关信息。
  • 提供包的信息。
  • 安装、卸载APK。
二、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阶段

  • 构造Settings类:这个是Android的全局管理者,用于协助PMS保存所有的安装包信息;
  • 保存Installer对象;
  • 初始化SystemConfig,获取系统配置信息,包括全局属性、groupid以及系统权限。初始化一些功能类,包括:PackageDexOptimizer (dex优化工具类) 、 DexManager(dex管理类)、PackageHandler(建立package相关操作的消息循环)等;
  • 创建data下的各种目录,比如data/app, data/app-private等。

PMS_SYSTEM_SCAN_START阶段

  • 通过scanDirTracedLI扫描系统目录文件,包括:/system/framework 、/system/priv-app 、/system/app 这俩都是放系统app、/vendor/overlay、/vendor/app、oem/app。

PMS_DATA_SCAN_START阶段

  • 通过scanDirTracedLI扫描/data/app和/data/app-private目录下的文件。

PMS_SCAN_END阶段

  • 将上述信息写回/data/system/packages.xml。

PMS_READY阶段

  • 创建服务PackageInstallerService。
三、构造函数中重点??榻馕?/h5>

3.1 Settings

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

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

  • packages.xml 记录所有安装app的信息,当系统进行程序安装、卸载和更新等操作时,均会更新该文件。
  • packages-backup.xml 备份文件
  • packages-stopped.xml 记录被用户强行停止的应用的Package信息
  • packages-stopped-backup.xml 备份文件
  • packages.list 记录非系统自带的APK的数据信息,这些APK有变化时会更新该文件

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(包的数据路径)。

3.2 SystemConfig

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

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

  • /system/etc/sysconfig
  • /system/etc/permissions
  • /odm/etc/sysconfig
  • /odm/etc/permissions
  • /oem/etc/sysconfig
  • /oem/etc/permissions

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

3.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/

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容