这一过程中使用到的工具是aidl.exe,位于android-sdk/tools目录下。 Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。
这个阶段处理.aidl文件,生成对应的.java文件。如果在项目没有使用到aidl文件。
3、javac:生成.class文件
通过Java Compiler 编译项目中所有的Java代码,包括R.java、.aidl文件生成的.java文件、Java源文件,生成.class文件。在对应的build下可以找到相关的代码。
4、dex:转化.class成dex文件
dx工具位于android-sdk/tools 目录下,通过它生成可供Android系统虚拟机执行的classes.dex文件。在build下可以找到相应的代码,直接使用dex命令来进行转化。这个阶段任何第三方的libraries和.class文件都会被转换成.dex文件。dx工具的主要工作是将Java字节码转成成Dalvik字节码、压缩常量池、消除冗余信息等。
//D:\test.dex 是dex文件输出目录
//D:\test是存放class文件目录dx --dex --output=D:\test.dex D:\test
复制代码
5、apkbuilder:生成apk包
打包的工具apkbuilder位于 android-sdk/tools目录下。apkbuilder为一个脚本文件,实际调用的是android-sdk/tools/lib/sdklib.jar文件中的com.android.sdklib.build.ApkbuilderMain类。所有没有编译的资源(如 res/raw、images等)、Other Resources(assets文件)、编译过的资源 、.dex文件 、resources.arsc 和 AndroidManifest.xml 都会被apkbuilder工具打包到最终的.apk文件中。
6、jarsigner:对APK进行签名
一旦apk文件生成,它必须被签名才能被安装在设备上。在开发过程中,主要用到的就是两种签名的keystore。一种是用于调试的debug.keystore,它主要用于调试。另一种就是用于发布正式版本的keystore。
7、zipalign:签名对齐
如果你发布的apk是正式版的话,就必须对APK进行对齐处理,用到的工具是zipalign,它位于android-sdk/tools目录下。
Zipalign是一个android平台上整理APK文件的工具,它对apk中未压缩的数据进行4字节对齐,对齐的主要过程是将APK包中所有的资源文件距离文件起始偏移为4字节整数倍,对齐后就可以使用mmap函数读取文件,可以像读取内存一样对普通文件进行操作。如果没有4字节对齐,就必须显式的读取,这样比较缓慢并且会耗费额外的内存。
GradleTask
我们点击Run‘app’时gradle是如何工作的,在Build窗口可以看到详细的Task日志,主要的作用也是处理上述的7个打包流程中的每一步。在窗口的日志中我们可以看到熟悉的关键字比如第二行的compileDevDebugAidl从名字上我们可以知道是处理Aidl。还有generateDevDeubgBuildConfig是生成BuildConfig文件。我们常用的BuildConfig.isDebug就是这个Task中处理生成的。当然每个Gradle Task都是上述7个打包步骤流程的细化处理。我把整个系统中用到的Task和实现类列了出来感兴趣的小伙伴可以研究下源码。我们先简单分析下GenerateBuildConfig Task的源码,源码基于com.android.tools.build:gradle:4.1.0Kotlin版本。
abstract class GenerateBuildConfig : NonIncrementalTask(){
//版本名称
@get:Input
@get:Optional
abstract val versionName: Property<String?>
//版本号
@get:Input
@get:Optionalabstract
abstract val versionCode: Property<Int?>
//父类NonIncrementalTask的唯一抽象方法,也就是BuildConfig的主要逻辑处理方法
override fun doTaskAction() {
//获取类里面的属性包括一些自定义的属性
val buildConfigData = BuildConfigData.Builder()<