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

Tud*_*uca 98 java android kotlin android-jack-and-jill

更新3. KOTLIN 现在正在为ANDROID开发提供正式支持.通过GOOGLE.YAAAAAAAAS!

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

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


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

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

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

新杰克工具链:
杰克(.java- > .jack- > .dex)

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

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

小智 63

免责声明:我在杰克工作

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

  • 你能分享一些细节吗?:) (7认同)

Dha*_*ani 15

@Pavel Dudka

杰克 - 是一个编译器.与javac类似,但它的确略有不同:

在此输入图像描述

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

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

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

在此输入图像描述

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

所以,现在让我们暂时搁置一下,再想一想......我们上瘾的所有酷插件会发生什么?他们都需要.class文件,杰克编译器不再有那些......

幸运的是,Jack提供了一些对我们来说非常重要的功能:

  • Retrolambda - 不需要.杰克可以妥善处理羔羊
  • Proguard - 它现在被烘焙到Jack中,所以你仍然可以使用混淆和最小化

好处:

Jack支持Java编程语言1.7并集成了下面描述的其他功能.

  • Predexing

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

  • 增量编译

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

  • 重新包装

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

  • Multidex支持

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

缺点:

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


Mic*_*ael 7

更新(03/16/2017)

幸运的是,杰克已经死了,所以它不会影响Kotlin的开发者.


如果杰克是未来,那么你将会被Kotlin困在过去.目前,Jack不支持可以将非Java源代码编译为Dalvik字节码的插件.即使它确实如此,JetBrains也需要为Kotlin编译器添加一个新的后端,这不是一项微不足道的任务.所以你必须使用Killlin和Jill,这将是你现在使用的工具链非常相似的东西.

正如您在下图中看到的那样,即使不能明确关闭Jack,您仍然可以将项目转换为库项目以使用Jill.应用程序项目将仅引用此库项目.

杰克和吉尔应用程序构建

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

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

  • 实际上Kotlin团队有计划支持Jack&Jill,我在他们的现场活动中听说过,但我更喜欢JetBrains的官方帖子,所以我没有回答这个问题. (7认同)

Teo*_*ald 7

谷歌不打算将杰克作为默认工具,但是Jack and Jill.
使用Jill将.class文件编译为dex就可以了.否则,你可以告诉jar/aar库.

Jack或Jill是否会变慢还是有争议的.Android团队希望jack会比当前的构建过程更快,但现在情况并非如此

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


hot*_*key 5

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

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

所以Kotlin最终将支持Jack&Jill并从中获益.