98

更新 3. KOTLIN 现已正式支持 Android开发。通过谷歌。啊啊啊啊!

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

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


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

Google 刚刚发布了即将推出的 Android N 的预览版,其中包含一些有趣的功能,最值得注意的是部分Java 8 语言支持。这是可能的,因为谷歌正在开发新的Jack 工具链。

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

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

我假设 Google 将推动使Jack成为 Android 开发的默认工具链。更新:Jack现在已弃用。是的。

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

4

8 回答 8

63

免责声明:我在杰克工作

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

于 2016-03-11T01:10:09.480 回答
15

@Pavel Dudka

Jack - 是一个编译器。类似于 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 配置文件进行重新打包。

  • 多索引支持

    由于 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-05-02T14:15:23.117 回答
7

更新(2017 年 3 月 16 日)

幸运的是,Jack 已经死了,所以它不会影响 Kotlin 开发人员。


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

如下图所示,即使无法显式关闭 Jack,您仍然可以将项目转换为库项目以使用 Jill。应用程序项目只会引用这个库项目。

杰克和吉尔应用程序构建

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

但目前我们并不确切知道杰克在发布时会支持什么。也许某些事情会发生巨大变化,并且将 Kotlin 支持添加到 Jack 将成为可能。

于 2016-03-10T18:28:15.510 回答
7

Google 不会将 Jack 作为默认工具,但Jack and Jill.
使用 Jill 将 .class 文件编译为 dex 将继续存在。否则,您可以告别 jar/aar 库。

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

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

于 2016-03-10T23:37:18.987 回答
5

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

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

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

于 2016-03-30T12:50:42.437 回答
2

根据最新的谷歌公告 -

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

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

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

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

于 2017-03-25T04:21:42.327 回答
1

I've already found this blog post from the official Kotlin's blog: : Kotlin’s Android Roadmap

There you would find a part which tells that:

The next thing we plan to do to improve Android build performance is providing an integration with Android’s new Jack and Jill toolchain. Right now there are some issues that prevent Jack from handling Kotlin-generated bytecode correctly (196084 and 203531), but we plan to work together with the Google team to either resolve the issues or provide workarounds on our side. Once this is done, we’ll be able to translate only changed class files using Jill during incremental compilation, as opposed to translating all class files every time (which is the only possible behavior in the old Android tooling).

So as @LukasBergstrom said, there won't be any problem with "stucking in the past" ;-)

You can also check Reddit discussion linked with this topic: What is the status of Kotlin with Jack and Jill?

Happy coding.

于 2016-08-17T11:31:16.557 回答
0

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

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

于 2017-02-08T20:05:48.087 回答