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

更新3. KOTLIN 现在正式支持 Android的发展 。 通过GOOGLE。 YAAAAAAAAS!

更新2 :它看起来像JetBrains是真的承诺从长远来看支持Android的Kotlin 。 我是一个快乐的kotlin用户:)。

更新 :JetBrains的Hadi Hariri 提到他们将发布关于这个主题的一些信息 。 一旦他们这样做,我会更新这个post。

===弃置的东西下一个===

Google刚刚发布了即将推出的Android N预览版,其中包括一些有趣的function,其中最引人注目的是部分Java 8语言支持 。 这可能是由于Google正在开发的新Jack工具链造成的。

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

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

我认为谷歌将推动杰克成为Android开发的默认工具链。 更新: 杰克现已被弃用 。 亚斯。

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

免责声明:我在杰克工作

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

@Pavel Dudka

杰克 – 是一个编译器。 类似于javac,但它做了一个稍微不同的事情:

在这里输入图像说明

如您所见,Jack将Java源代码直接编译成Dex文件! 我们没有中间的* .class文件了,所以dx工具是不需要的!

可是等等! 如果我在项目中包含第三方库(作为.class文件的集合),该怎么办?

那就是当吉尔进场时:

在这里输入图像说明

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

所以,现在让我们暂时搁置一会儿,想想……所有那些我们沉迷于这些酷插件的事情将会发生什么? 他们都需要.class文件和杰克编译器不再有这些…

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

  • Retrolambda – 将不需要。 杰克可以正确处理lambda
  • Proguard – 它现在被烤成了Jack,所以你仍然可以使用混淆和最小化

优点:

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

  • Predexing

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

  • 增量编译

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

  • 重新包装

    JACK使用jarjarconfiguration文件来重新打包。

  • Multidex支持

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

缺点:

  • Jack不支持Transform API – 没有可以修改的中间Java字节码,所以我在这里没有提到的一些插件将停止工作
  • Jack现在不支持注释处理,所以如果你非常依赖像Dagger,AutoValue等库,在切换到Jack之前你应该三思。 编辑:正如杰克·沃顿指出的那样,杰克在N Preview中有注解处理的支持,但它并没有通过Gradle公开。
  • 不支持在Java字节码级别上运行的棉绒检测器。
  • 雅科克不支持 – 呃,我个人觉得雅科可疑(它并不真正显示你想看到什么),所以完全可以没有它
  • Dexguard – 当前不支持企业版的Proguard

谷歌不会推动杰克作为默认工具,但Jack and Jill
用Jill编译.class文件到dex是在这里。 否则,你可以告别jar / aar图书馆。

不pipe杰克还是吉尔会慢一点还在争论中。 Android团队希望插孔能够比目前的构build过程更快,但现在情况并非如此

而且,Jack和Dex在开放的时候是可用的,没有什么能够阻止kotlin团队从kotlin源代码编写一个工具发射.jack或者.dex文件。

UPDATE(03/16/2017)

幸运的是,杰克死了,所以不会影响Kotlin的开发者。


如果杰克是未来,那么你会被科特林困在过去。 目前,Jack不支持可以将非Java源代码编译成Dalvik字节码的插件。 即使JetBrains需要添加一个新的后端到Kotlin编译器,这不是一个简单的任务。 所以你将不得不使用Jill的Kotlin,它将会和你现在使用的工具链非常相似。

正如你可以在下面的图片中看到的,即使不可能明确closuresJack,你仍然可以将项目转换为库项目来使用Jill。 而应用程序项目将只引用这个库项目。

杰克和吉尔应用程序构建

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

但是目前我们还不确切知道杰克在发布时会支持什么。 也许事情会发生巨大的变化,增加对杰克的Kotlin支持将成为可能。

正如今天出现的博客文章( Kotlin的Android路线图 )所说:

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

所以Kotlin最终会支持Jack&Jill并从中受益。

根据谷歌最新公告 –

我们决定直接在当前的javac和dx工具集中添加对Java 8语言特性的支持,并且弃用Jack工具链。 有了这个新的方向,依赖于Java类文件格式的现有工具和插件应该继续工作。 outlook未来,Java 8语言function将由Android构build系统本地支持。 我们打算在未来几周内将其作为Android Studio的一部分,我们希望尽早与您分享这一决定。

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

所以我们不用担心jack toolchain成为android开发的默认工具链。 您可以继续使用kotlin或使用正常的javac / dx工具集。

来源: Android的Java 8语言function支持的未来

我已经从Kotlin的官方博客上find了这篇博客: Kotlin的Android路线图

在那里你会发现一个部分,它告诉:

我们计划做的下一件事是改进Android构build性能,并提供与Android新的Jack和Jill工具链的集成。 现在有一些问题阻止了Jack正确处理Kotlin生成的字节码( 196084和203531 ),但我们计划与Google团队合作解决问题或提供解决方法。 完成此操作后,我们将能够在增量编译期间使用Jill只转换已更改的类文件,而不是每次都转换所有类文件(这是旧的Android工具中唯一可能的行为)。

正如@卢卡斯·贝格斯特罗姆所说的,“过去扼杀”不会有任何问题;-)

您还可以检查与此主题相关的Reddit讨论: Kotlin与Jack和Jill的状态是什么?

快乐的编码。

根据Kotlin博客发布的1.1-beta2新function部分:

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