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相关的学习。