Android的编译打包流程详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android的编译打包流程详解相关的知识,希望对你有一定的参考价值。

参考技术A 下图的是官网对于android编译打包流程的介绍。

官方的介绍非常笼统,简而言之,其大致流程就是:
编译-->DEX-->打包-->签名和对齐

(好像什么都没Get到,有一种意犹未尽的感觉……)

来一张外国大神的图片(注:这张图少了签名的步骤)

用文字解释一下上图的流程:

首先,我们整理一下编译的输入部分是什么(图中黄色部分):

接下来的步骤:

好了,编译打包的详细流程说完了,接下来我们看看是否能回答开篇的那些问题。

答:aapt工具对于每个资源文件生成了唯一的ID,这些ID保存在R.java文件中。如下是R.java文件的内容:

资源ID是一个4字节的无符号整数,在R.java文件中用16进制表示。其中,最高的1字节表示Package ID,次高1个字节表示Type ID,最低2字节表示Entry ID。

只有一个ID如何能引用到实际资源呢?实际上aapt工具还生成了一个文件resources.arsc,相当于一个资源索引表,或者你理解成一个map也行,map的key是资源ID,value是资源在apk文件中的路径。resources.arsc里面还有其他信息,这个就不多说了。

通过R.java文件和resources.arsc配合,就能引用到实际的资源文件。

答:第7步已经阐述了对齐所做的工作,为什么要进行对齐,这是为了加快资源的访问速度。如果每个资源的开始位置都是上一个资源之后的 4*n字节,那么访问下一个资源就不用遍历,直接跳到4*n字节处判断是不是一个新的资源即可。

如果举例子,那么对齐有点类似于资源数组化,数组的访问速度当然比链表快。

答:xml里面都是各种字符,不利于快速遍历。编译成二进制文件,用数字替换各种符号,一方面能快速访问,另一方面也能减少大小。

https://developer.android.com/studio/build/index.html
http://www.alittlemadness.com/2010/06/07/understanding-the-android-build-process/
http://blog.csdn.net/luoshengyang/article/details/8744683
https://stackoverflow.com/questions/6517151/how-does-the-mapping-between-android-resources-and-resources-id-work
http://www.jianshu.com/p/eaaddfe34d11

以上是关于Android的编译打包流程详解的主要内容,如果未能解决你的问题,请参考以下文章

熟悉Android打包编译的流程

Android打包流程

字节码插桩Android 打包流程 | Android 中的字节码操作方式 | AOP 面向切面编程 | APT 编译时技术

Android APK打包流程

android app 打包流程

React-Native工程项目打包编译发布过程详解