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


98

更新3. KOTLIN 现在正式支持ANDROID开发。由GOOGLE。YAAAAAAAAS!

更新2从长远来看,JetBrains似乎真的致力于支持Android的Kotlin。我是一名快乐的Kotlin用户:)。

更新:来自JetBrains的Hadi Hariri 提到他们将发布有关此主题的一些信息。一旦他们这样做,我将更新此帖子。


===下一个废弃的素材===

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

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

新的Jack工具链:
Jack.java-> .jack-> .dex

我假设Google会努力使Jack成为Android开发的默认工具链。更新:Jack弃用。是的

我的问题是,作为kotlin用户进行Android开发时,这个新的工具链将如何影响我?我会被“卡在过去”吗?


1
(kotlin_library(multiple * .kt)=> .jar)然后Jill(.jar => Jayce)然后导入到jack(类似于其他(非android)(普通Java)jars)
Selvin

阅读文档:“使用Jack无需做任何其他事情-只需使用标准的makefile命令即可编译树或项目。Jack是M的默认Android构建工具链。” -sourcesource.android.com/source/jack.html肯定是错字,它们的意思是“ N”而不是“ M”吗?
马克·基恩

杰克死了,欢欣鼓舞:P
EpicPandaForce'Apr

Answers:


63

免责声明:我在杰克上工作

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


7
您可以分享一些细节吗?:)
Tudor Luca

但是Kotlin能否受益于Jack的性能优化?(至少一天),因为杰克看上去很棒(我现在迫不及待要进行基准测试)
NitroG42,2016年

我看过来自proguard作者的基准测试的视频演示,通过一点点搜索,您就可以找到它
sakis kaliakoudas 2016年

在附加Kotlin stdlib的Android项目上,我们遇到了一些困难。看起来像是Jill / Jack中的错误。你能调查一下吗?code.google.com/p/android/issues/detail?id=196084
yanex

1
这是否意味着Jill不接受Java 8字节码?那库模块呢?如果将它们编译为.aar,然后再由Jill导入,它们是否也无法使用Java 8?即是否意味着Java新功能仅可用于内部项目.java源?
far.be

15

@帕维尔·杜德卡(Pavel Dudka)

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

在此处输入图片说明

如您所见,Jack将Java源代码直接编译为Dex文件!我们不再有中间* .class文件,因此不需要dx工具!

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

这就是吉尔的角色:

在此处输入图片说明

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

因此,现在让我们搁浅一会,再想一想...我们沉迷于这些酷炫的插件会发生什么?他们都需要.class文件,而Jack编译器已经没有了。

幸运的是,Jack开箱即用地提供了一些对我们来说很重要的功能:

  • Retrolambda-不需要。杰克可以正确处理lambda
  • Proguard-现在已放入Jack中,因此您仍然可以使用混淆和最小化

优点:

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

  • 预除糊

    生成JACK库文件时,将生成库的.dex并将其作为pre-dex存储在.jack库文件中。编译时,JACK重用每个库中的pre-dex。所有库都已预先删除。

  • 增量编译

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

  • 重新包装

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

  • Multidex支持

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

缺点:

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

截至2016年9月,“杰克当前不支持注释处理”是否仍然有效?似乎现在已受支持...
ticofab

它受支持,但仍然存在错误:例如,数据绑定尚不起作用:请参阅android#210615
TmTron

请注意,Jack并不完全支持批注处理-它处于与Eclipse编译器相同的递减状态(Jack基于Eclipse编译器)(几种方法实现为占位符,在调用时会引发异常,有许多未解决的bug,在ECJ bugtracker上)。
user1643723 '16

7

Google不会将Jack推为默认工具,而是Jack and Jill
使用Jill将.class文件编译为dex的过程仍然存在。否则,您可以向jar / aar库说再见。

杰克或吉尔会变慢还是有待商debate。Android团队希望jack会比当前的构建过程更快,但目前情况并非如此

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


7

更新(03/16/2017)

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


如果杰克是未来,那么您将陷入Kotlin的过去。目前,杰克不支持可以将非Java源代码编译为Dalvik字节码的插件。即使这样做,JetBrains也需要向Kotlin编译器添加一个新的后端,这并不是一件容易的事。因此,您必须将Kotlin与Jill一起使用,这将与您现在使用的工具链非常相似。

从下图中可以看到,即使无法明确关闭Jack,您仍然可以将项目转换为使用Jill的库项目。应用程序项目将仅引用该库项目。

Jack and Jill应用程序构建

我看到Kotlin如何与Jack一起工作的唯一方法(可能不会实现)是在Kotlin编译器中添加Java后端,即生成Xtend之类的Java代码的后端。在这种情况下,Jack可以像其他任何Java代码一样处理Kotlin编译器生成的代码。

但是目前我们还不知道杰克发行时会支持什么。也许情况会发生巨大变化,并且有可能为Jack增加Kotlin支持。


7
实际上Kotlin团队有支持杰克和吉尔的计划,我在他们的现场活动中听说过,但是我宁愿在这里从JetBrains获得官方职位,所以我没有回答问题。
热键

那太好了,但是我听到的唯一支持是通过Jill。正如我在答案中提到的那样,添加这种支持的方法并不多。
迈克尔

实际上,存在一些关于内存中代码生成的东西(以及不太现实的选择,Kotlin-> dex),因此Kotlin Android构建也将大大提高速度。
热键

不了解内存中代码生成与Jack集成之间的关系。而Kotlin对dex的编译意味着JetBrains需要编写和支持类似于Jack的自己的工具链。
迈克尔

1
除了Kotlin团队外,不确定是否应该说他们可以做什么和不能做什么,或者他们可能做什么或可能不做什么。他们之前已经谈论过这一点,并且有可以提出的计划。
杰森·米纳德

5

正如今天发表的网志文章(Kotlin的Android路线图)所述:

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

因此Kotlin最终将支持Jack&Jill并从中受益。


2

根据最新的Google公告-

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

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

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

来源: Android上Java 8语言功能支持的未来


1

我已经在Kotlin官方博客中找到了该博客文章::Kotlin的Android路线图

在那里,您会找到一个告诉您的部分:

我们计划提高Android构建性能的下一件事是提供与Android的新Jack and Jill工具链的集成。目前,有一些问题使Jack无法正确处理Kotlin生成的字节码(196084203531),但是我们计划与Google团队合作解决问题或提供我们这边的解决方法。完成此操作后,我们将能够在增量编译过程中使用Jill仅翻译更改的类文件,而不是每次都翻译所有类文件(这是旧版Android工具中唯一可能的行为)。

因此,正如@LukasBergstrom所说,“卡在过去”不会有任何问题;-)

您还可以检查Reddit与以下主题关联的讨论:杰克和吉尔与科特林的状态如何?

快乐的编码。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.