4.1 概述
PackageManagerService是本书分析的第一个核心服务,也是Android系统中最常用的服务之一。它负责系统中Package的管理,应用程序的安装、卸载、信息查询等。图4-1展示了PackageManagerService及客户端的类家族。
图 4-1 PackageManagerService及客户端类家族
由图4-1可知:
IPackageManager接口类中定义了服务端和客户端通信的业务函数,还定义了内部类Stub,该类从Binder派生并实现了IPackageManager接口。
PackageManagerService继承自IPackageManager.Stub类,由于Stub类从Binder派生,因此PackageManagerService将作为服务端参与Binder通信。
Stub类中定义了一个内部类Proxy,该类有一个IBinder类型(实际类型为BinderProxy)的成员变量mRemote,根据第2章介绍的Binder系统的知识,mRemote用于和服务端PackageManagerService通信。
IPackageManager接口类中定义了许多业务函数,但是出于安全等方面的考虑,Android对外(即SDK)提供的只是一个子集,该子集被封装在抽象类PackageManager中。客户端一般通过Context的getPackageManager函数返回一个类型为PackageManager的对象,该对象的实际类型是PackageManager的子类ApplicationPackageManager。这种基于接口编程的方式,虽然极大降低了模块之间的耦合性,却给代码分析带来了不小的麻烦。
ApplicationPackageManager类继承自PackageManager类。它并没有直接参与Binder通信,而是通过mPM成员变量指向一个IPackageManager.Stub.Proxy类型的对象。
提示 读者在源码中可能找不到IPackageManager.java文件。该文件在编译过程中是IPackage-Manager.aidl经aidl工具处理后得到的,最终的文件位于Android源码/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/content/pm/目录中。如果读者没有整体编译过源码,也可使用aidl工具单独处理IPackageManager.aidl。
aidl工具生成的结果文件有着相似的代码结构。读者不妨看看下面这个笔者通过编译生成的IPackageManager.java文件。注意,aidl工具生成的结果文件没有格式缩进,所以看起来困难,读者可用Eclipse中的源文件格式化命令处理它。
[—>IPackageManager.java]
public interface IPackageManager extends android.os.IInterface{
//定义内部类Stub,派生自Binder,实现IPackageManager接口
public static abstract class Stub extends android.os.Binder
implements android.content.pm.IPackageManager{
private static final java.lang.String DESCRIPTOR=
"android.content.pm.IPackageManager";
public Stub(){
this.attachInterface(this, DESCRIPTOR);
}
……
//定义Stub的内部类Proxy,实现IPackageManager接口
private static class Proxy implements
android.content.pm.IPackageManager{
//通过mRemote变量和服务端交互
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote){
mRemote=remote;
}
……
}
……
}
接下来分析PackageManagerService,为书写方便,以后将其简称为PKMS。