想在 Android 中使用 java8?你可能不再需要 retrolambda 了

2,084 阅读4分钟
原文链接: mp.weixin.qq.com

随着Android N预览版在2016年5月的发布,谷歌同时发布了jack and jill编译工具,jack是Java Android Compiler Kit 的缩写,Jill是jack Intermediate Library Linker的缩写,jack和jill就是用来取代原来javac+dx的编译工具链的。在介绍jack and jill之前,我们先来看一下之前Android的编译是怎样进行的,然后介绍如何把jack用到工程中。

Android 编译过程



首先看下传统的Android编译过程,如下图所示:


我们的代码都是.java文件,然后在编译过程中,首先,源码被java compiler(javac)编译为.class文件,生成了字节码。编译为字节码是java程序运行于JVM之上的基本步骤。但是由于Android程序实际上不是运行于JVM上,而是运行在经过优化更利于移动设备使用的Dalvik(在Android L之后用是ART)。所以如下图所示,字节码需要通过 -dx工具编译成 .dex文件,从而Dalvik(ART)就可以执行 .dex文件了。

工程中如果用到了第三方库,一般第三方库是.jar 或者.aar的形式,.jar文件实际上就是.class经过zip后的文件。当使用 -dx工具时,.jar 或者.aar同样被编译成 .dex文件了。



有时我们使用一些工具去操作字节码(比如使用Proguard 删除一些无用的代码或者对代码进行混淆,或者使用Retrolambda插件从而使用到一些新特性,比如java 8中的lambda表达式和java 7中的方法引用(method Refrence)。这种情况下会把旧的.class 文件转化为新的.class 文件,然后.class文件被编译成.dex文件,过程如下图所示:



jack与 javac + dx的不同之处



jack 把javac +dx的两步操作合并为一步,直接编译出了.dex文件,没有了中间的.class 文件,我们也就不需要.dx工具了


但是第三方库怎么处理呢,它们本身就是.class 文件,我们知道jack本身是不处理.class 文件的。如下图所示,jill可以处理.class文件编译为.jack文件,jack工具可以把jack编译生成.dex文件。


使用jack之后,如何使用Proguard和Retrolambda呢,这些插件都是处理.class文件的,使用jaca工具链之后编译期已经没有.class文件了。其实,jack中已经保留了Proguard,所以关于Proguard的使用无需担心。Retrolambda在使用jack 之后就不需要了,jack可以非常漂亮地处理所有的lambda表达式。
当然,可能使用jack之后没法使用Jacoco这些工具(jacoco需要处理.class文件),不过,Google未来应该会支持的。

使用jack工具链的基本方法



  1. 在build.gradle中设置jack可用:


  1. 设置module级的java 8特性支持


如果想支持注解之类的特性,可以点击this了解。

使用Jack有何优势



Jack最重要的作用当然是支持java 8, jack支持lambda表达式, 方法引用,类型注解。Retrolambda也支持这些特性,但是使用jack编译lambda和方法引用生成的方法数比retrolambda要更少,这对我们保持更少的方法数是很有用的,毕竟一个dex文件中方法数是有上限的。


之前,使用javac工具链,致使Android的编译工具是由Oracle,Eclipse或者OpenJDK等组织实现的,现在,google利用jack就可以全权控制编译链,可以在编译过程中增加一些更方便的工具,比如Proguard就被加入到了jack工具链中。

Jack的缺点



jack不支持Transform API,所以一些第三方发插件如Jacoco目前不支持。

jack目前的编译速度比javac+dx要慢

lint检测由于是处理字节码的,所以在jack编译中不支持lint。

使用jack时不支持instant run。

总结



jack and jill作为google推出的android定制版编译工具链,非常酷,在未来一定会对于android开发来说会产生很大的影响,但是,目前来看jack and jill工具还处于一个比较初级的阶段,需要时间来普及。

本文为译文,原地址The Jack and Jill: Should you use in your next Android Application?

注意: 确定要使用jack jill的同学一定要先看看其缺点(坑),慎用。(目前databinding也不支持)。

关注公众号wutongke,了解更多移动开发前沿技术: