Android
再来一张详细的图
aapt打包过程
1. 解析AndroidManifest.xml,创建ResourceTable对象
2. 添加被引用资源包
Android系统定义了一套通用资源,这些资源可以被应用程序引用。例如,我们在XML布局文件中指定一个LinearLayout的android:orientation属性的值为“vertical”时,这个“vertical”实际上就是在系统资源包里面定义的一个值。
3. 收集资源文件
在编译应用程序资源之前,Android资源打包工具aapt会创建一个AaptAssets对象,用来收集当前需要编译的资源文件。这些需要编译的资源文件就保存在AaptAssets类的成员变量mRes中
4. 将收集到的资源增加到资源表
前面收集到的资源只是保存在一个AaptAssets对象中,这一步需要将这些资源同时增加到一个资源表中去,即增加到前面所创建的一个ResourceTable对象中去,因为最后我们需要根据这个ResourceTable来生成资源索引表,即生成resources.arsc文件
5. 编译values类资源
6. 给Bag资源分配ID
类型为values的资源除了是string之外,还有其它很多类型的资源,其中有一些比较特殊,如bag、style、plurals和array类的资源。这些资源会给自己定义一些专用的值,这些带有专用值的资源就统称为Bag资源。例如,Android系统提供的android:orientation属性的取值范围为{“vertical”、“horizontal”},就相当于是定义了vertical和horizontal两个Bag。
7.编译Xml资源文件
7.1 解析Xml文件
7.2 赋予属性名称资源ID
7.3 解析属性值
7.4 压平Xml文件
- 7.4.1 收集有资源ID的属性的名称字符串
- 7.4.2 收集其它字符串
- 7.4.3 写入Xml文件头
- 7.4.4 写入字符串资源池
- 7.4.5 写入资源ID
- 7.4.6 压平Xml文件
8. 生成资源符号
9. 生成资源索引表
9.1 收集类型字符串
9.2 收集资源项名称字符串
9.3 收集资源项值字符串
9.4 生成Package数据块
- 9.4.1 写入Package资源项元信息数据块头部
- 9.4.2 写入类型字符串资源池
在前面的第1个操作中,我们已经将每一个Package用到的类型字符串收集起来了,因此,这里就可以直接将它们写入到Package资源项元信息数据块头部后面的那个数据块去。 - 9.4.3 写入资源项名称字符串资源池
在前面的第2个操作中,我们已经将每一个Package用到的资源项名称字符串收集起来了,这里就可以直接将它们写入到类型字符串资源池后面的那个数据块去。 - 9.4.4 写入类型规范数据块
- 9.4.5 写入类型资源项数据块
- 9.4.6 写入资源项的值字符串资源池
- 9.4.7 写入Package数据块
10. 编译AndroidManifest.xml文件
经过前面的九个步骤之后,应用程序的所有资源项就编译完成了,这时候就开始将应用程序的配置文件AndroidManifest.xml也编译成二进制格式的Xml文件。之所以要在应用程序的所有资源项都编译完成之后,再编译应用程序的配置文件,是因为后者可能会引用到前者。
11. 生成R.java文件
12. 打包APK文件
- assets目录
- res目录,但是不包括res/values目录, 这是因为res/values目录下的资源文件的内容经过编译之后,都直接写入到资源项索引表去了
- 资源项索引文件resources.arsc
- AndroidManifest.xml
- 应用程序代码文件classes.dex
- 应用程序的签名信息的文件