本片文章主要内容如下:
为了让后面大家更好的理解安装流程,本片文章先预热下,说到安装就不能不说下AndroidManifest.xml文件,因为咱们APK的的核心东西都在里面,但是它是一个"xml"文件,在安装的时候,必然会把它序列化掉,那序列化后对应的都是什么对象?为了便于理解,我从网站"借"了一张AndroidManifest.xml文件节点的说明图:
AndroidManifest文件节点.png
下面我们根据上面的那张图来依次把涉及到的类都详细说明下:
该类包含了从AndroidManifest.xml文件中收集的所有信息。 PackageInfo.java源码地址 通过源码我们知道PackageInfo是实现Parcelable接口,所以它可以在进程间传递
PackageItemInfo类:它是AndroidManifest.xml文件中所有节点的基类,代表一个应用包内所有组件和通用信息的基类。该类提供最基本的属性集合,如:label、icon、meta等。一般不会直接用这个类,设计它的目的就是为包内其他基本组件提供统一的基础定义。它没有实现接口Parcelable,但它提供了传Parcel型的构造函数,以及writeToParcel()方法给它的子类来实现PackageItemInfo内部的成员Parcel化。
ApplicationInfo类:它继承自PackageItemInfo并实现了Parcelable 接口,它对应manifest里面的<application>节点的信息
ComponentInfo,它代表一个应用内部的组件(如ActivityInfo、ServiceInfo、ProviderInfo),一般不会直接使用这个类,它被设计出来是为了不同应用的组件共享统一的定义。它继承与PackageItemInfo,但它不像ApplicationInfo一样实现了Parcelable接口。它是没有实现Parcelable接口,但是它提供了入参是Parcel的构造函数,以及writeToParcel()方法给它的子类来实现ComponentInfo内部这部分的成员的Parcel化。
ActivityInfol类 ApplicationInfo类:它继承自ComponentInfo并实现了Parcelable 接口,它对应manifest里面的<activity>或者<receiver>节点的信息。我们可以通过它来设置我们的任何属性,包括theme、launchMode等,常用方法继承至PackageItemInfo类中的loadIcon()和loadLabel()
ServiceInfo类,它继承自ComponentInfo并实现了Parcelable接口,它对应manifest里面的<service>节点的信息。
方法很少且很简单,这里就不讲解了
ProviderInfo类,它继承自ComponentInfo并实现了Parcelable接口,它对应manifest里面的<provider>节点的信息。
方法很少且很简单,这里就不讲解了
ResolveInfo就是解析 intent过程返回的信息,也是通过解析一个IntentFilter相对应的intent得到的信息。它部分的对应位于AndroidManifest.xml的<intent>标签收集到的信息,ResolveInfo实现了Parcelable接口。
PermissionInfo,它代表一个应用的权限描述,它既是权限信息的记录,也是权限的级别保护,在Android系统中,做任何操作都要申请权限,但是如果你的级别不够,有些权限不是你在代码中写了申请就能获取的。在使用PermissionInfo来指定一个权限的基本信息时,需要指定protectedLevel,并指定所属的group信息。PermissionInfo继承自PackageItemInfo,并实现了Parcelable接口。
PermissionGroupInfo类,它表示一个权限组的概念,Android系统内部定了很多权限组,比如android.permission-group.CONTACTS表示联系人相关权限组。PermissionGroupInfo继承自PackageItemInfo,并实现了Parcelable接口。
关于主要成员就介绍到这里,看下他们对应的关系,如下图:
对应关系1.png
对应关系2.png