深入理解PackageManagerService
- 概述
- 基本了解PackageManagerService
- PKMS的main函数分析
- APK Installation分析
- queryIntentActivities分析
- installd及UserManager分析
概述
PackageManagerService负责系统中Package的管理,应用程序的安装、卸载、信息查询等。
1 . IPackageManager接口类中定义了服务端和客户端通信的业务函数,还定义了内部类Stub,该类从Binder派生并实现了IPackageManager接口;
2 . PackageManagerService继承自IPackageManager.Stub类,由于Stub类从Binder派生,因此PackageManagerService将作为服务端参与Binder通信;
3 . Stub类中定义了一个内部类Proxy,该类有一个IBinder类型(实际类型为BinderProxy)的成员变量mRemote,mRemote用于和服务端PackageManagerService通信;
4 . IPackageManager接口类定义了许多业务函数,但是出于安全等方面的考虑,Android对外提供的只是一个子集,该子集被封装在抽象类PackageManager中。客户端一般通过Context的getPackageManager()方法返回一个类型为PackageManager的对象,该对象的实际类型是PackageManager的子类ApplicationPackageManager。
5 . ApplicationPackageManager类继承自PackageManager类。它并没有直接参与Binder通信,而是通过mPM成员变量指向一个IPackageManager.Stub.Proxy类型的对象。
基本了解PackageManagerService
PackageManagerService(简称PMS)作为系统的核心服务,由SystemServer创建。
以下是SystemServer.java中的代码:
private void run() {
//---;
startBootstrapServices();
//---;
}
private void startBootstrapServices() {
//---;
mPackageManagerService = PackageManagerService.main(mSystemContext, installer, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
mFirstBoot = mPackageManagerService.isFirstBoot();
//---;
}
PKMS的main函数分析
以下是PackageManagerService.java中的代码:
public static PackageManagerService main(Context context, Installer installer, boolean factoryTest, boolean onlyCore) {
// Self-check for initial settings.
PackageManagerServiceCompilerMapping.checkProperties();
PackageManagerService m = new PackageManagerService(context, installer, factoryTest, onlyCore);
m.enableSystemUserPackages();
ServiceManager.addService("package", m);
return m;
}
在main()函数中,去执行了PMS的构造函数,在构造函数中,扫描Android系统中几个目标文件夹中的APK,然后建立合适的数据结构以管理Package信息、四大组件信息、权限信息等各种信息。抽象地看,PMS像一个加工厂,解析实际的物理文件(APK文件)以生成符合自己要求的产品。例如,PMS解析APK包中AndroidManifest.xml,并根据其中声明的Activity标签来创建对此对应的对象并加以保管。
在构造函数中的工作流程大概为下面三个阶段:
1 . 扫描目标文件夹之前的准备工作;
2 . 扫描目标文件夹;
3 . 扫描之后的工作;
构造函数扫描目标文件夹的准备工作
构造函数扫描目标文件夹
构造函数扫描文件夹之后的工作
APK Installation分析
queryIntentActivities分析
installd及UserManager分析
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
------------------------last line for now------------------------