APK的安装过程分析(PackageManagerService启动过程)

时序图

步骤说明

1.pkms的main函数入口

2.加入android.uid.system,android.uid.phone等一些系统的shareUserId,保存到SharedUserSetting数据结构

3.保存shareUserId到Uid的数据结构中

4.从system/etc/permissions目录的xml读取权限,这些xml文件是编译完成后烧写进手机的。

5.将xml的内容保存到特定的数据结构。

6.解析data/system/目录下packages.xml,packages-backup.xml,packages.list,packages-stopped.xml,packages-stopped-backup.xml的信息

7.读取packages.xml文件中package标签信息

8.保存xml信息到PackageSetting的数据结构

9.保存pakage到应用对应的uid数据结构,和3步骤相似

10.读取packages.xml文件中shared-user标签信息

11.保存xml信息到SharedUserSetting的数据结构

12.保存shareUserId到应用对应的uid数据结构,和3,9步骤相似

13.开始扫描package,此函数会调用多次,从而扫描不同目录下的apk文件,比如系统的apk默认路径有system/framework,system/app,system/vendor/app这三个,非系统apk安装路径为data/app,data/app-private

14.对每个apk文件执行scanPackageLI操作

15.PackageParser解析apk(即解析AndroidManifest.xml文件中的各个标签,主要通过AssetManager来取出apk中的AndroidManifest.xml文件)并返回Package对象

16.生成Package对象

17.返回Package对象并传入第二个scanPackageLI函数的参数中

18.开始第二个scanPackageLI函数,这个函数做的事情比较多,比如将apk里的lib文件夹的动态库so文件解压出来

19.获取一个pkg的setting信息

20.获取一个pkg的setting信息

21.为解析得到的pkg分配linux 的uid

22.获取pkg的setting信息结束(后面还会把这个信息保存到mSettings变量里)

23.这一步之前还会循环遍历所有四大组件的信息并保存到成员变量中,

24.汇总并更新权限相关信息

25.授予权限

26.将应用的安装信息保存到data/system/目录下的package.xml,package.list等本地文件之中

27.结束pkms的构造函数

后续计划,permission,assetmanager和resource相关的学习。