Android PMS工作原理及启动流程
总结
PackageManagerService是Android系统核心服务之一,在Android中的非常重要,主要负责的功能如下:
- 解析 AndroidManifest.xml,主要包括AndroidManifest中节点信息的解析和target-name的分析和提炼
- 扫描本地文件,主要针对apk,主要是系统应用、本地安装应用等等。这部分会在下面仔细讲解。
- 管理本地apk,主要包括安装、删除等等
启动流程图:
权限扫描管理:
xml解析出来的数据做如下存储:
<group>标签gid属性的值会存放在mGlobalGids数组中;
<permission>标签,解析得到的值会存放在mPermissions集合中;
<assign-permission>标签解析得到的值会存放在mSystemPermissions中;
<split-permission>存储在mSplitPermissions
<library>标签解析得到的值会存放在mSharedLibraries中;
<feature>存储在mAvaliableFeatures
<oem-permission>存储在mOemPermissions
<privapp-permission>会根据不同的存储路径,分别存储在mVendorPrivAppPermissions、mProductPrivAppPermissions、mSystemExtPrivAppPermissions、mPrivAppPermissions
扫描APK目录
PackageManagerService的构造函数中调用了scanDirTracedLI方法来扫描某个目录的apk文件。
- 按照core app >system app > other app 优先级扫描APK,解析AndroidManifest.xml文件,得到各个标签内容
- 解析XML文件得到的信息由 Package 保存。从该类的成员变量可看出,和 Android 四大组件相关的信息分别由 activites、receivers、providers、services 保存。由于一个 APK 可声明多个组件,因此 activites 和 receivers等均声明为 ArrayList。
- 在 PackageParser 扫描完一个 APK 后,此时系统已经根据该 APK 中 AndroidManifest.xml,创建了一个完整的 Package 对象,下一步就是将该 Package 加入到系统中
- 非系统 Package 扫描失败,删除文件
PMS函数真正的实现类和调用类
PMS里关于包安装卸载的很多实现都是调用的Installer类,并通过其中的mInstaller.execute(String)调用到InstallerConnection类(InstallerConnection就是一个连接类,负责连接installd),并在这里通过套接字链接installd守护进程(其拥有root权限,而PMS只拥有system权限)并调用其中cpp函数,调用过程就是传递key字符串,installd.cpp会匹配key对应的cpp函数名字并调用它。
PMS一些必须带锁调用的函数后缀解释
LI、LIF、LPw、LPr的含义
xxxLI() | 必须先持有mInstallLock的锁 |
xxxLP() | 必须先持有mPackage的锁 |
xxxLIF() | 必须先持有mInstallLock的锁,并且正在被修改的包(package) 必须被冻结(be frozen) |
xxxLPr() | 必须先持有mPackages锁,并且只用于读操作 |
xxxLPw() | 必须先持有 mPackage所以,并且只用于写操作 |
简单的总结下就是
上面中的”L”代表lock的首字母L,”I“表示InstallLock的首字母,”P”表示package的首字母,”r”表示read的首字母,”w“表示write的首字母
本文来自博客园,作者:小汀,转载请注明原文链接:https://www.cnblogs.com/1118zjg/p/16009886.html