APK打包过程

Android

官方配置构建介绍
aapt命令介绍
参考老罗的文章

build-process_2x.png

再来一张详细的图

build.png

aapt打包过程

aapt.jpg

1. 解析AndroidManifest.xml,创建ResourceTable对象

uml.png

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资源文件

xml.jpg
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文件
压平.jpg

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数据块
resources.jpg

10. 编译AndroidManifest.xml文件

经过前面的九个步骤之后,应用程序的所有资源项就编译完成了,这时候就开始将应用程序的配置文件AndroidManifest.xml也编译成二进制格式的Xml文件。之所以要在应用程序的所有资源项都编译完成之后,再编译应用程序的配置文件,是因为后者可能会引用到前者。

11. 生成R.java文件

12. 打包APK文件

  • assets目录
  • res目录,但是不包括res/values目录, 这是因为res/values目录下的资源文件的内容经过编译之后,都直接写入到资源项索引表去了
  • 资源项索引文件resources.arsc
  • AndroidManifest.xml
  • 应用程序代码文件classes.dex
  • 应用程序的签名信息的文件
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Apk的打包,大致就是把代码打成包、把资源打成包、最后对整个Apk文件做一下安全处理和优化操作,Andriod提供...
    蓝灰_q阅读 463评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,332评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,905评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,526评论 25 709
  • 我想起赞琪有一个晚上睡觉想让我陪时,曾跟我说过这样一句话:妈妈,如果你十分钟之内不进来陪我睡,我就离开这个世界。当...
    百思不得其洁阅读 701评论 0 0

友情链接更多精彩内容