2016年Google大会发布了 Android N与新的编译工具 Jack 和 Jill.
Jack是 Android 的编译器,Jill(Jack Intermediate Library Linker) 目的是替代现有的 javac+dx 工具链.
我们看一下在这之前 Android 是如何进行编译工作,在这之后,以及在这之后如何使用 Jack 在你的 Android 应用项目.
让我们看一下现在 android 编辑过程是如何工作的.
我不会详细描述每一个编译链的组成部分.
自 Android 系统发布以来它的编译过程如下:
我们将我们的 java 代码写在 .java 文件.当我们开始编译我们的应用源代码,它需要两个步骤.首先,使用java 编译器(javac)将源代码编译成.class 字节码文件.这个常见的过程在 JVM 上运行 java 应用.但是,Android 系统没有使用 JVM 来运行应用.它使用Dalvik (Android L 以上版本使用 ART) 高度优化的移动环境.因此,这个编译已经改变了,从源代码生成字节码需要修改.这就是图片中的第二步.在第二步,-Dx 工具得到Java 编译器生成的. class 文件,然后编译到一个.dex 文件.现在,我们的 Dalvik(或 ART)就可以解析和运行.dex 文件.
###你可能会想关于第三方库,包含在我们的项目吗?
这些第三方库来自. jar 或.arr 格式.
这个.jar 文件只不过是压缩的.class文件.
所以,当你编译那些扩展库到你的项目,-Dx 工具将转换它们到.dex 文件.
当我们使用工具操作字节码(如:使用 Proguard 删除没有使用的代码和混淆源文件或 Retrolambda 在 Java7中使用lambda 表达式)它需要输入 .class 文件.修改它们的字节码生成新的.class 文件.之后修改的 class 文件使用-Dx 工具转换到 .dex 文件,产生最终的结果.
Jack 结合上面编译链的两个步骤 (javac+dx) 为 一个步骤,它输入 .java 文件输出 .dex 文件.很酷,哈!!!我们不需要提供.class 中间文件,所以不需要更多的.Dx 工具.
它们都是. class 文件格式.正如我们讨论的,Jack 编辑器不输入.class 文件.在这里将涉及到Jill. Jill 将处理这些 .class 文件,将他们转换成特殊的 .jack 格式. Jack编辑器读取 .jack 文件然后生成 .dex文件.
这些扩展处理 .class 文件.现在使用 Jack工具链将不生成 .class 文件.混淆器在 Jack 工具链内部,所以我们在项目中使用它们,不用担忧.而Retrolambda我们不需要了,Jack 可以完美的处理所有的 lambdas表达式(关于这我非常兴奋).当然,现在你不能使用其他的安全工具,像Jacoco.但是,我不关心它们 :-) . 希望Google在未来可以支持它们.
在你的 module目录下的build.gradle 文件中启动Jack工具链.