javac和jack,Android编译器的演进

http://taobaofed.org/blog/2016/05/05/new-compiler-for-android/

javac

在没有jack以前,google一直使用的sun/oracle的java编译器javac用作android的官方编译器。
javac是jdk中的java编译器,将java文件编译成class文件,那么我们来看一下之前的Android的java文件是怎么一步一步变成可以在dalvik虚拟机中运行的dex文件的。

 1305996-cb214fafd0c672dd
之前的Android编译流程

我们看到之前的整个流程大致如上图描述的

  • 首先由javac将我们的.java文件编译成java字节码,以.class后缀文件的形式存在gen目录下
  • 然后由proguard把runtime里的Android核心库class和library里的通用库class加上前面javac编译的class文件一同通过proguard的配置文件规定的(我们的混淆配置就在这个时候起作用)编译成各自的优化过后的java字节码
  • 然后由dex工具将这些class文件合并成一个单一的delvik字节码class.dex文件,如果dex中的方法数超过了65536,那么就会被分割成多个dex文件

jack

而我们新的编译的流程直接把之前的javac,proguard工具都摒弃掉,直接用jack把.java文件转成.jack文件再通过pre-dex处理转成.dex文件

而Android库和通用库以及第三方库的.class文件怎么办的,jill工具会把这些class文件和resource文件进行分离,然后把.class文件编译成.jayce文件,再把这个.jayce文件交给jack进行处理。完全跳过了class文件。

那么这样一来我们经常使用那些基于class文件的工具就将无法使用了,比如retrolambda、以及proguard等

但是根据最新版本,jack已经可以处理lambda语法,并且混淆和代码优化也不是问题,以及注解问题也可以很好的处理,具体的问题我们继续保持关注

相比之前的编译方式,这种最新的编译方式首先是google自己的自我保护,拿起枪杆子。其次优势还是很多的,比如采用pre-dex的方式编译,那么久相当于增量编译,只要变化不大,那么编译速度就会有明显的提高。jack文档还申明jack在编译的过程中还会另外开启一个编译器,进行并行编译。

分享到:

发表评论

昵称

沙发空缺中,还不快抢~