Android N Java 8功能(Jack编译器)和Kotlin互操作

时间:2016-03-10 14:52:29

标签: java android kotlin android-jack-and-jill

更新3。 KOTLIN是NOW OFFICIALLY SUPPORTED FOR ANDROID DEVELOPMENT。通过GOOGLE。 YAAAAAAAAS!

更新2 :看起来像JetBrains is really committed to supporting Kotlin for Android in the long run。我是一个快乐的kotlin用户:)。

更新:来自JetBrains的Hadi Hariri mentioned they're going to release some info on this topic。我会在发布后更新这篇文章。


===下一个被弃用的东西===

谷歌刚刚发布了即将推出的Android N的预览版,其中包含一些有趣的功能,其中最引人注目的是部分Java 8 language support。这可能是由于Google正在研究新的Jack toolchain

使用 javac kotlinc 的当前工具链:
javac .java - > .class) - > dx .class - > .dex
kotlinc .kt - > .class) - > dx .class - > .dex

新杰克工具链:
杰克.java - > .jack - > .dex

我假设Google将推动 Jack 成为Android开发的默认工具链。 更新:杰克现在是deprecated。亚斯。

我的问题是这个新工具链将来会如何影响我作为Android开发的 kotlin 用户?我会“陷入困境”吗?

8 个答案:

答案 0 :(得分:62)

免责声明:我在杰克工作

这不会影响你。 Kotlin的编译器生成Java 6字节码,Jack / Jill可以很好地导入它。

答案 1 :(得分:15)

@Pavel Dudka

杰克 - 是一个编译器。与javac类似,但它的确略有不同:

enter image description here

正如您所看到的,Jack将Java源代码直接编译为Dex文件!我们不再有中间* .class文件了,所以不需要dx工具!

但是等等!如果我在项目中包含第三方库(作为.class文件的集合)会怎样?

这就是吉尔进场的时候:

enter image description here

Jill可以处理类文件并将它们转换为特殊的Jayce格式,可以用作Jack编译器的输入。

所以现在让我们暂时停下来思考......我们上瘾的所有酷插件会发生什么?他们都需要.class文件,杰克编译器不再有那些......

幸运的是,杰克提供了一些对我们开箱即用的重要功能:

  • Retrolambda - 不需要。杰克可以妥善处理lambdas
  • Proguard - 它现在被烘焙到Jack中,所以你仍然可以使用混淆和最小化

优点:

Jack支持Java编程语言1.7并集成了下面描述的其他功能。

  • <强> Predexing

    生成JACK库文件时,会生成库的.dex并将其作为pre-dex存储在.jack库文件中。编译时,JACK重用每个库中的pre-dex。 所有图书馆都是预先设定的。

  • 增量编译

    增量编译意味着只重新编译自上次编译以来触及的组件及其依赖项。当更改仅限于一组有限的组件时,增量编译可能比完整编译快得多。

  • <强>重新包装

    JACK使用jarjar配置文件进行重新打包。

  • Multidex支持

    由于dex文件限制为65K方法,因此必须将具有65K以上方法的应用程序拆分为多个dex文件。 (有关multidex的详细信息,请参阅“使用超过65K方法构建应用程序”。)

缺点:

  • Jack不支持转换API - 您无法修改中间Java字节码,因此我在此未提及的某些插件将停止工作
  • Jack目前不支持注释处理,因此如果您严重依赖Dagger,AutoValue等库,则在切换到Jack之前应该三思而后行。编辑:正如Jake Wharton所指出的,Jack in N Preview有注释处理支持,但它尚未通过Gradle公开。
  • 不支持在Java字节码级别上运行的Lint检测器。
  • Jacoco不受支持 - 好吧,我个人觉得Jacoco有问题(它并没有真正展示你想看到的东西),所以没有它可以完全生存
  • Dexguard - 目前不支持企业版Proguard

答案 2 :(得分:7)

更新(03/16/2017)

幸运的是,杰克已经死了,因此不会影响科特林开发商。

如果杰克是未来,那么你将会被Kotlin困在过去。目前,Jack不支持可以将非Java源代码编译为Dalvik字节码的插件。即使它确实如此,JetBrains也需要为Kotlin编译器添加一个新的后端,这不是一项微不足道的任务。所以你必须使用Killlin和Jill,它将与你现在使用的工具链非常相似。

正如您在下图中所见,即使不能明确关闭Jack,您仍然可以将项目转换为库项目以使用Jill。应用程序项目将仅引用此库项目。

Jack and Jill Application Build

我看到Kotlin如何与Jack一起工作的唯一方法就是向Kotlin编译器添加一个Java后端,即后端生成像Xtend这样的Java代码。在这种情况下,Kotlin编译器生成的代码可以像任何其他Java代码一样由Jack处理。

但目前我们还不知道杰克在发布时会支持什么。也许某些事情会发生巨大变化,并且可以为杰克增加Kotlin支持。

答案 3 :(得分:7)

Google不会将Jack作为默认工具,而是Jack and Jill 使用Jill将.class文件编译为dex就可以了。否则,你可以告诉jar / aar库。

Jack或Jill是否会变慢仍然需要辩论。 Android团队希望jack会比当前的构建过程更快,但现在情况并非如此

此外,Jack和Dex可以公开使用,没有什么能阻止kotlin团队编写从kotlin源代码发出.jack或.dex文件的工具。

答案 4 :(得分:5)

正如今天出现的博客文章(Kotlin's Android Roadmap)所述:

  

现在有一些问题阻止Jack正确处理Kotlin生成的字节码(196084203531),但我们计划与Google团队合作解决问题或提供我们方面的解决方法。完成后,我们将能够在增量编译期间仅使用Jill 转换已更改的类文件,而不是每次都转换所有类文件(这是旧Android工具中唯一可能的行为) )。

所以Kotlin最终会支持Jack&amp;吉尔并从中受益。

答案 5 :(得分:2)

根据最新的谷歌公告 -

  

我们决定直接在当前的javac和dx工具集中添加对Java 8语言功能的支持,并弃用Jack工具链。有了这个新方向,依赖于Java类文件格式的现有工具和插件应该继续工作。展望未来,Android构建系统将本身支持Java 8语言功能。我们的目标是在未来几周内将其作为Android Studio的一部分推出,我们希望尽早与您分享此决定。

     

我们最初测试通过Jack工具链添加Java 8支持。随着时间的推移,当我们考虑注释处理器,字节码分析器和重写器受到影响时,我们意识到切换到Jack的成本对于我们的社区来说太高了。感谢您尝试Jack工具链并给予我们很好的反馈。您可以继续使用Jack构建Java 8代码,直到我们发布新的支持。从杰克迁移应该很少或根本不需要工作。

所以我们不必担心杰克工具链成为Android开发的默认工具链。您可以继续使用kotlin或使用普通的javac / dx工具集。

来源:Future of Java 8 Language Feature Support on Android

答案 6 :(得分:1)

我已经从Kotlin官方博客上发现了这篇博文:Kotlin’s Android Roadmap

在那里你会找到一个告诉我们的部分:

  

我们计划做的下一件事是提高Android构建性能   提供与Android新Jack and Jill toolchain的集成。   现在有一些问题阻止杰克处理   Kotlin生成的字节码正确(196084203531),但我们计划   与Google团队合作解决问题或   提供我们方面的解决方法。一旦完成,我们将能够   在增量期间仅使用Jill翻译已更改的类文件   编译,而不是每次都翻译所有类文件   (这是旧Android工具中唯一可能的行为)。

正如@LukasBergstrom所说,过去并没有出现任何问题&#34; ; - )

您还可以查看与此主题相关的Reddit讨论:What is the status of Kotlin with Jack and Jill?

快乐的编码。

答案 7 :(得分:0)

根据Kotlin blog,发布1.1-beta2新功能部分:

  

支持在启用Jack工具链时构建Android项目(jackOptions {true});