【问题标题】:Android N Java 8 features (Jack compiler) and Kotlin interopAndroid N Java 8 功能(Jack 编译器)和 Kotlin 互操作
【发布时间】:2026-01-20 05:35:01
【问题描述】:

更新 3。 科特林是NOW OFFICIALLY SUPPORTED FOR ANDROID DEVELOPMENT。通过谷歌。啊啊啊啊!

更新 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。一旦他们这样做,我会更新这篇文章。


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

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

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

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

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

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

【问题讨论】:

  • ( kotlin_library(multiple*.kt) => .jar) 然后 Jill (.jar => Jayce) 然后导入到 jack (类似于其他(非 android)(plain java)jars)跨度>
  • 阅读文档:“你不需要做任何不同的事情来使用 Jack — 只需使用你的标准 makefile 命令来编译树或你的项目。Jack 是默认的 Android 构建工具链为 M。” - 来源:source.android.com/source/jack.html 肯定是一个错字,他们的意思是 'N' 而不是 'M'
  • 杰克死了,庆幸:P

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


【解决方案1】:

免责声明:我在 Jack 上工作

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

【讨论】:

  • 你能分享一些细节吗? :)
  • 但是 Kotlin 能否让 Jack 的性能优化受益? (至少一天)因为杰克看起来非常棒(我现在等不及一些基准测试了)
  • 我看过proguard作者的一个基准测试视频演示,用谷歌搜索一下就可以找到它
  • 我们在构建带有 Kotlin 标准库的 Android 项目时遇到了一些困难。看起来像 Jill/Jack 中的错误。你能调查一下吗? code.google.com/p/android/issues/detail?id=196084
  • 这是否意味着 Jill 不接受 Java 8 字节码?库模块呢?如果它们被编译为 .aar 而不是由 Jill 导入,它们是否也无法使用 Java 8? IE。是不是意味着 Java 新特性只对内部项目 .java 源可用?
【解决方案2】:

@Pavel Dudka

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

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

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

这就是吉尔发挥作用的时候:

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

所以现在让我们暂时搁置一会,想一想……那些我们如此沉迷的酷插件会发生什么?他们都需要 .class 文件,而 Jack 编译器不再拥有这些文件了......

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

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

优点:

Jack 支持 Java 编程语言 1.7 并集成了如下所述的附加功能。

  • 预索引

    在生成 JACK 库文件时,会生成库的 .dex 并作为 pre-dex 存储在 .jack 库文件中。编译时,JACK 会重用每个库中的 pre-dex。 所有库均已预先编入索引。

  • 增量编译

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

  • 重新包装

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

  • 多索引支持

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

缺点:

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

【讨论】:

【解决方案3】:

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

Jack 还是 Jill 会更慢还有待商榷。 Android 团队希望 jack 能够比当前的构建过程更快,但现在并非如此

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

【讨论】:

    【解决方案4】:

    更新(2017 年 3 月 16 日)

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


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

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

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

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

    【讨论】:

    • 其实 Kotlin 团队有支持 Jack & Jill 的计划,我在他们的现场活动中听说过,但我更喜欢 JetBrains 的官方帖子,所以我没有回答这个问题。
    • 那太好了,但我听说的唯一支持是通过 Jill。正如我在答案中提到的那样,添加这种支持的方法并不多。
    • 事实上,内存中代码生成有一些东西(以及不太现实的选项,Kotlin -> dex),因此 Kotlin Android 构建也会有显着的加速。
    • 不了解内存代码生成与 Jack 集成的关系。而 Kotlin to dex 编译意味着 JetBrains 需要自己编写和支持类似于 Jack 的工具链。
    • 不知道除了 Kotlin 团队之外的任何人应该说出他们能做什么和不能做什么,或者他们可以做什么或不可以做什么。他们之前已经讨论过这个问题,并且有他们可以提出的计划。
    【解决方案5】:

    正如今天出现的博文 (Kotlin's Android Roadmap) 中所说:

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

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

    【讨论】:

      【解决方案6】:

      根据最新的谷歌公告 -

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

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

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

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

      【讨论】:

        【解决方案7】:

        我已经从 Kotlin 的官方博客中找到了这篇博文::Kotlin’s Android Roadmap

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

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

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

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

        编码愉快。

        【讨论】:

          【解决方案8】:

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

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

          【讨论】: