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

更新 3.KOTLIN 现在正式支持 ANDROID 开发。由谷歌。哎呀呀

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

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


=== 已弃用的内容 下一页 ===

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

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

新千斤顶工具链:
千斤顶 (.java --> .jack --> .dex)

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

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


答案 1

免责声明:我在杰克工作

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


答案 2

@Pavel 杜德卡

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

enter image description here

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

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

就在这时,吉尔开始发挥作用:

enter image description here

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

所以现在让我们退到一边,想想...我们如此沉迷的那些很酷的插件会发生什么?他们都需要.class文件,而Jack编译器不再有这些文件......

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

  • Retrolambda - 不需要。杰克可以正确处理λ
  • 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预览版中的Jack具有注释处理支持,但尚未通过Gradle公开。
  • 不支持在 Java 字节码级别运行的 Lint 检测器。
  • Jacoco不受支持 - 好吧,我个人认为Jacoco值得怀疑(它并没有真正显示你想看到的东西),所以可以完全没有它
  • Dexguard - 目前不支持 Proguard 的企业版

推荐