Android最新编译工具Jack和Jill

来源:互联网 发布:办公室政治 知乎 编辑:程序博客网 时间:2024/05/13 22:14

前几天在编译Android6.0系统的时候,报了一个ERROR: Security problem, see Jack server log的错误,
(解决方法可以参照我另外一篇blog,下面给出传送门:)

http://blog.csdn.net/simon_crystin/article/details/62424488

就顺便查了一些资料,简单了解了一下Jack并总结如下:

介绍Jack之前,我们先了解一下在Jack未诞生之前我们使用的Javac和dx工具:

对于Java(非Android)应用,我们只需要Java编译器(javac)。它可以编译Java源码并生成Java二进制码(*.class文件)。Java二进制码可通过常规的在你机器上运行的JVM执行。

问题是,在Android设备上,我们使用非标准的JVM。我们使用了修改版本,该版本高度又花了手机环境。例如JVM被称为Dalvik(或者ART在更加高效的L+设备上)。

因为修改了JVM,Java二进制码也需要修改,使得Dalvik可执行。这是dx工具的职责 - 它收到Java二进制码(.class文件),并转换成Android二进制文件(*.dx文件)。

值得一提是工程中包含第三方库时 - jar(或者aar)形式 -相反不需要处理,第三方库只是*.class文件的压缩集合。因此第三方库直接输入给dx工具,因为我们不需要编译它。

javac+dx工作原理

Jack (Java Android Compiler Kit)
一.介绍:
我们先看看官方给的解释:

Jack is a new Android toolchain that compiles Java source into Android dx bytecode. It replaces the previous Android toolchain, which consists of multiple tools, such as javac, ProGuard, jarjar, and dx.

Jack编译器工具是一套新的Android编译工具用来将Java代码转换为Android dx字节代码。
Android6.0之前我们使用的是Javac 和dx工具,而Jack(Java Android 编译工具)和Jill(Jack中间库链接器),它们就是替换javac+dx工具集。

二.Jill 工具:
前面提到,Jack是直接将Java文件编译成了dx文件,我们知道,jar包是.class文件压缩来的。那Android编译时怎么处理jar包的呢?这个时候Jill就该登场了。Jill可以处理class文件并转换成特殊的Jayce格式,该格式可用于Jack编译器的输入。

Jack+Jill工作原理

三.Jack的优点
1.适用于AOSP,意思就是说这套编译器是开源的,开发者也可以为其进行完善。
2.Jack server能够减少编译的时间,直接将。Jack直接将Java源码编译成dx文件!我们不在有中间的.class文件。
3.Jack提供了一些实用的功能,实用第三方包不在必要,如:
(1)Retrolambda :Jack可以妥善处理lambda表达式
(2)Proguard :现已合并入Jack中,你仍可以使用混淆和最小化代码。

四.Jack 的缺点:
1.Jack不支持转换API - 无中间Java字节码可修改,所以有些我没有提到的插件将不能工作
2.Jack现在不支持注解处理,因此如果你严重依赖如Dagger,AutoValue等库,切换到Jack需要三思。变更,Jack Wharton指出,N预览版的Jack已经支持注解处理了,但未通过Gradle释放。
3.运行在Java字节码级的Lint检查器不支持。

对于Jack的了解也是基于此了,有什么不对的地方还请指出来,由于目前时间和实力有限,不能写出高质量的blog,但也一直有志于专研Android系统,相信不久的将来会带来更多更好的文章。

                                                         与君共勉                                                          Simon 
1 0
原创粉丝点击