Android应用包的生成/管理/访问
APK编译
APK项目的源文件包括:
- 资源文件
- aidl源文件
- Java源文件
- Java静态库
- Java共享库
- 所需的JNI动态库
Java源码在编译前必须首先获得R.java,R.java是编译系统调用aapt工具从res目录下的资源文件编译而成的。
Java源文件 ----javac----> class文件 ----jar----> jar包 ----dx工具----> dex文件 --aapt--> unsigned.apk --signapk.jar--> signed.apk --zipalign边界对齐--> package.apk
签名的目的不是加密,而是认证。
程序包管理
能够根据intent匹配到具体的四大组件。能够把指定的intent转换成一个具体的包含了程序包名称及具体Component名称的信息,以便Java类加载器加载具体的Component。
安装和卸载程序的操作都是由Pms完成,安装程序的过程包括在程序目录下创建以包名称命令的程序文件、创建程序数据目录,以及把程序信息保存到相关的配置文件pakages.xml中,卸载过程则是相反的。
Intent匹配
按照基本的匹配类型定义几个数据变量,比如action、scheme、mime等, 每个数据变量中保存所有只要满足本条件的Component信息。当传入一个Intent时,将intent-filter分解成这些基本的匹配条件,最终找到不同数据变量匹配结果中的交集,即为满足所有字段的条件。
资源访问
资源常见的值一般为以下几种:
- String/Color/boolean/int类型:res/values/xxx.xml
- Drawable类型:res/drawable/xxx.png
- layout
- style
LayoutInflater在inflater布局时会通过反射去调用View的(Context context, AttributeSet attrs)构造器。自定义View的第三个和第四个构造函数除非显式调用,不然不会通过xml调用。AttributeSet
保存了xml布局文件中View的自定义属性的集合
属性赋值优先级:Xml定义>xml的style定义>defStyleAttr(主题可配置样式)>defStyleRes(默认样式)>NULL(主题中直接指定)。注意,defStyleRes只有在defStyleAttr为0或者主题中没有配置时,才会生效;
APK是一种具有安装格式的文件,安装后将是另一个样子。
一个应用程序的多个ContextImp对象实际共享了一个PakageInfo对象。
Assetmanager并不只是访问项目中的res/assests目录下的资源,而是访问应用程序本身res下所有的资源,以及Framework的资源路径。
系统资源的id值都是以0x01开头,一般的应用程序的资源值是以0x07开头。