前言
Linus Benedict Torvalds : RTFSC – Read The Funning Source Code
概述
Android 构建系统编译应用资源和源代码,然后将它们打包成可供您测试、部署、签署和分发的 APK。Android Studio 使用 Gradle 这一高级构建工具包来自动化执行和管理构建流程,同时也允许您定义灵活的自定义构建配置。每个构建配置均可自行定义一组代码和资源,同时对所有应用版本共有的部分加以重复利用。Android Plugin for Gradle 与这个构建工具包协作,共同提供专用于构建和测试 Android 应用的流程和可配置设置。
我们先来看一张完整的构建图:
两张流程图,一张是简图帮助理解,一张是完整图。
在理解构建流程之前,我们首先要了解构建过程中各个工具的意义和主要功能。
工具
名字 | 功能 | 详细介绍 |
---|---|---|
aapt | Android资源打包工具 | 可以查看,创建, 更新ZIP格式的文档附件(zip, jar, apk)。也可将资源文件编译成二进制文件。 |
aidl | Android接口描述语言转化为.java文件的工具 | 将android中我们用到的接口类描述语言,例如跨进程的aidl文件转化为java文件。 |
javac | Java Compiler | java语言编程编译器。全称javacompilation。javac工具读由java语言编写的类和接口的定义,并将它们编译成字节代码的class文件。javac 可以隐式编译一些没有在命令行中提及的源文件。 |
dex | 转化.class文件为Davik VM能识别的.dex文件 | 把所有的字节码文件转成Android DEX文件(classes.dex)。它是Android平台上可执行文件的类型。dx工具的主要工作是将Java字节码转成成Dalvik字节码、压缩常量池、消除冗余信息等。 |
apkbuilder | 生成apk包 | 将所有没有编译的资源(如images等)、编译过的资源和.dex文件都会打包到最终的.apk文件中。 |
jarsigner | jar文件的签名工具 | 工具利用密钥仓库中的信息来产生或校验 Java 存档 (JAR) 文件的数字签名 |
zipalign | 字节码对齐工具 | 它能够对打包的应用程序进行优化。 |
具体流程
Step 1.
使用aapt工具生成R.java文件
将Resource文件(就是工程中res中的文件)、Assets文件(相当于另外一种资源,这种资源Android系统并不像对res中的文件那样优化它)、AndroidManifest.xml文件(包名就是从这里读取的,因为生成R.java文件需要包名)、Android基础类库(Android.jar文件)打包成资源(一般在Android工程的bin目录可以看到一个叫resources.ap_的文件就是它了)、R.java文件(在gen目录中,大家应该很熟悉了)。
Step 2.
处理AIDL文件,生成对应的.java文件
将源码文件、aidl文件、framework.aidl等应用到aidl的描述语言文件转化为java文件。
Step 3.
编译Java文件,生成对应的.class文件
将源码文件(包括R.java和AIDL生成的.java文件)、库文件(.jar文件)编译为.class文件。
Step 4.
把.class文件转化成Davik VM支持的.dex文件
将任何第三方的libraries和.class文件都会被转换成.dex文件。dex工具生成可供Android系统Dalvik虚拟机执行的classes.dex文件。
Step 5.
打包生成APK文件
所有没有编译的资源(如images等)、编译过的资源和.dex文件都会被apkbuilder工具打包到最终的.apk文件中。
Step 6.
对APK文件进行签名
一旦APK文件生成,它必须被签名才能被安装在设备上。在开发过程中,主要用到的就是两种签名的keystore。一种是用于调试的debug.keystore,它主要用于调试,在Eclipse或者Android Studio中直接run以后跑在手机上的就是使用的debug.keystore。另一种就是用于发布正式版本的keystore。
Step 7.
对签名后的APK文件进行对齐处理
如果你发布的apk是正式版的话,就必须用到的工具zipalign对APK进行对齐处理。对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。对齐的作用就是减少运行时内存的使用。