2016年Google大会发布了 Android N与新的编译工具 Jack 和 Jill.

Jack和Jill(Jack Intermediate Library Linker) 是 Android 的编译器,目的是替代现有的 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 有什么不同的?

Jack 结合上面编译链的两个步骤 (javac+dx) 为 一个步骤,它输入 .java 文件输出 .dex 文件.很酷,哈!!!我们不需要提供.class 中间文件,所以不需要更多的.Dx 工具.

关于第三方扩展?

它们都是. class 文件格式.正如我们讨论的,Jack 编辑器不输入.class 文件.在这里将涉及到Jill. Jill 将处理这些 .class 文件,将他们转换成特殊的 .jack 格式. Jack编辑器读取 .jack 文件然后生成 .dex文件.

Proguard 和 Retrolambda 工具将如何工作?

这些扩展处理 .class 文件.现在使用 Jack工具链将不生成 .class 文件.混淆器在 Jack 工具链内部,所以我们在项目中使用它们,不用担忧.而Retrolambda我们不需要了,Jack 可以完美的处理所有的 lambdas表达式(关于这我非常兴奋).当然,现在你不能使用其他的安全工具,像Jacoco.但是,我不关心它们 :-) . 希望Google在未来可以支持它们.

如何在你的项目中启用Jack?

在你的 module目录下的build.gradle 文件中启动Jack工具链.

1
2
3
4
5
6
7
8
9
10
android {
buildToolsVersion ‘21.1.2’//Use the latest version at the time.
defaultConfig {
// Enable the experimental Jack build tools.
jackOptions {
enabled true
}
}
...
}

添加下面代码到你 module 的 build.gradle 文件启用支持 Java8 特性

1
2
3
4
5
6
7
8
9
10
11
12
13
android {
defaultConfig {
jackOptions {
enabled true
}
}
//Add support for java 8 features.
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}

如果你需要启用更多特性像注释处理访问这里.

我们获得了什么?

弃用javac+dx使用 Jack 编译器的最大好处是能够处理 java8 表达式.Jack 支持 lambda 表达式,方法引用.你可能想使用Retrolambda的特性. 但是使用Jack生成的 lambda 表达式的方法数比Retrolambda 少很多.对于我们需要保持方法数不能超过64K是一个很大的好处.

以前,使用javac 编译链,意味着 Android 编译受Oracle,Eclipse或OpenJDK 这样的团体的控制.现在由于新的 Jack工具链,Google 已经控制了所有的编译工具.他们可以添加一些特性到工具链.(Proguard可在默认的Jack工具链中获得).

它的缺点是什么?

Jack 编辑器不支持转变 APIs.所以一些第三方像 Jacoco 当前不支持 Jack 工具链.Jack 现在比 javac+dx 慢一些.在字节码级别的 Lint 提示将不能工作,当你使用Jack 后将不会生成(.class)字节码文件.在 Android Studio2.0和以上版本的 Instant Run 将不能工作,当使用Jack 时将被禁用.

结论:

Jack 和 Jill 工具链Google 提供的安卓系统特定的编译工具,在未来在 Android 开发会有很大的影响.但,现在是非常早期的阶段,它将用时间来取得更高的声望.

原文链接: The Jack and Jill: Should you use in your next Android Application?