Android PMS工作原理及启动流程

总结

PackageManagerService是Android系统核心服务之一,在Android中的非常重要,主要负责的功能如下:

  1. 解析 AndroidManifest.xml,主要包括AndroidManifest中节点信息的解析和target-name的分析和提炼
  2. 扫描本地文件,主要针对apk,主要是系统应用、本地安装应用等等。这部分会在下面仔细讲解。
  3. 管理本地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文件。

  1. 按照core app >system app > other app 优先级扫描APK,解析AndroidManifest.xml文件,得到各个标签内容
  2. 解析XML文件得到的信息由 Package 保存。从该类的成员变量可看出,和 Android 四大组件相关的信息分别由 activites、receivers、providers、services 保存。由于一个 APK 可声明多个组件,因此 activites 和 receivers等均声明为 ArrayList。
  3. 在 PackageParser 扫描完一个 APK 后,此时系统已经根据该 APK 中 AndroidManifest.xml,创建了一个完整的 Package 对象,下一步就是将该 Package 加入到系统中
  4. 非系统 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的首字母

posted @ 2022-03-15 19:05  小汀  阅读(546)  评论(0编辑  收藏  举报