ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
PKMS的main函数代码如下: **PackageManagerService.java** ~~~ public static final IPackageManager main(Contextcontext, boolean factoryTest, boolean onlyCore) { //调用PKMS的构造函数,factoryTest和onlyCore的值均为false PackageManagerService m = new PackageManagerService(context, factoryTest, onlyCore); //向ServiceManager注册PKMS ServiceManager.addService("package", m); return m; } ~~~ main函数很简单,只有短短几行代码,执行时间却较长,主要原因是PKMS在其构造函数中做了很多“重体力活”,这也是Android启动速度慢的主要原因之一。在分析该函数前,先简单介绍一下PKMS构造函数的功能。 PKMS构造函数的主要功能是,扫描Android系统中几个目标文件夹中的APK,从而建立合适的数据结构以管理诸如Package信息、四大组件信息、权限信息等各种信息。抽象地看,PKMS像一个加工厂,它解析实际的物理文件(APK文件)以生成符合自己要求的产品。例如,PKMS将解析APK包中的AndroidManifest.xml,并根据其中声明的Activity标签来创建与此对应的对象并加以保管。 PKMS的工作流程相对简单,复杂的是其中用于保存各种信息的数据结构和它们之间的关系,以及影响最终结果的策略控制(例如前面代码中的onlyCore变量,用于判断是否只扫描系统目录)。曾经阅读过PKMS的读者可能会发现,代码中大量不同的数据结构以及它们之间的关系会令人大为头疼。所以,本章除了分析PKMS的工作流程外,也将关注重要的数据结构及它们的作用。 PKMS构造函数的工作流程大体可分三个阶段: - 扫描目标文件夹之前的准备工作。 - 扫描目标文件夹。 - 扫描之后的工作。 该函数涉及到的知识点较多,代码段也较长,因此我们将通过分段讨论的方法,集中解决相关的重点问题。