为啥 Kotlin 插件为 Android 项目添加 kotlin-stdlib-jre7(不是 kotlin-stdlib)参考

Posted

技术标签:

【中文标题】为啥 Kotlin 插件为 Android 项目添加 kotlin-stdlib-jre7(不是 kotlin-stdlib)参考【英文标题】:Why Kotlin plugin adds kotlin-stdlib-jre7 (not kotlin-stdlib) reference for Android project为什么 Kotlin 插件为 Android 项目添加 kotlin-stdlib-jre7(不是 kotlin-stdlib)参考 【发布时间】:2018-02-07 20:19:35 【问题描述】:

android Studio 2.3.3; Kotlin 插件:1.1.4; Kotlin 编译器:Kotlin 到 JVM:1.6。

Android Studio > 新建项目 > 在项目操作中配置 Kotlin 添加 kotlin-stdlib-jre7 到 gradle 文件的参考。 我希望 kotlin-stdlib 因为我们的 Kotlin 目标 JVM 是 1.6。

还没有找到好的解释。 例如。 this answer 声明

kotlin-stdlib-jre7 工件不应该在 Android 上运行,Android 目前仅支持 Java 6 平台。面向 Android 时,您应该使用为 JRE 6 构建的 kotlin-stdlib

【问题讨论】:

【参考方案1】:

Android 已经支持 Java 7 好几年了。事实上,对 Java 8 的部分支持正在进行中,一开始是通过Jack toolchain,现在是通过desugaring in the default toolchain。

所以,kotlin-stdlib-jre7 完全没问题。

正如您在this answer 中看到的那样,kotlin-stdlib 在 1.1 中有两个额外的扩展库 kotlin-stdlib-jre7kotlin-stdlib-jre8。该库为 Java 7 和 Java 8 添加了特定功能,并包含 kotlin-stdlib 作为传递依赖项。另见Kotlin 1.1 release notes:

Java 8 标准库支持

现在有不同版本的标准库支持 Java 7 和 8 中添加的新 JDK API。如果您需要访问新 API,请使用 kotlin-stdlib-jre7 和 kotlin-stdlib-jre8 maven artifacts 而不是标准的 kotlin-stdlib。这些工件是 kotlin-stdlib 之上的微小扩展,它们将其作为传递依赖项带到您的项目中。

当前版本的 Android Studio 中的 Kotlin 插件在项目中配置 Kotlin 时添加了 kotlin-stdlib-jre7 作为依赖项,因为自 Android Studio 0.3.2, released in October 2013 以来,Android Studio 和构建工具以向后兼容的方式支持 Java 7。另见Does Android support JDK 6 or 7。具体来说,发行说明指出:

此版本的主要功能是支持 Android KitKat:

支持菱形运算符、multi-catch、try-with-resources、switch 中的字符串等语言功能。 创建新项目时,您可以指定源语言级别:

还有:

请注意,您不仅可以在 Android KitKat 中使用所有这些语言功能,还可以在旧版本的 Android 中使用!有一个例外:try-with-resources,它需要 minSdkVersion 19。

【讨论】:

您说“kotlin-stdlib-jre7 非常好”,上面的答案说“不应该使用 kotlin-stdlib-jre7”。实际上我正在寻找一些参考来解释何时使用 kotlin-stdlib 或 kotlin-stdlib-jre7 的规则 我在我的项目中使用kotlin-stdlib-jre7,这就是为什么我可以确认它有效。话虽如此,我不知道为什么您链接的答案是说 Android 不支持 Java 7。正如我在回答中所说,甚至部分支持 Java 8 测试版(通过“脱糖”过程,其中将 Java 8 语言功能转换为 Java 7)。此外,在这里您还有另一个 SO 问题说它受支持:[***.com/questions/20480090/…Android 支持 JDK 6 或 7)。希望这能让事情更清楚。 kotlin-stdlib 在 1.1 中没有被拆分。这些kotlin-stdlib-jre7-jre8 是包含新API 的附加工件。 上面的 Kotlin 语言文档 sn-p 不是 Android 特定的。文档适用于所有 Kotlin 支持的平台。当您针对 JDK 7 或 JDK 8 时,AFAIU kotlin-stdlib-jre7/kotlin-stdlib-jre8 是正确的选择。我的目标是 Java 6。If you're targeting JDK 7 or JDK 8, you can use extended versions of the Kotlin standard library which contain additional extension functions for APIs added in new JDK versions. Instead of kotlin-stdlib , use one of the following dependencies 是的,我们谈论的是 Android,项目 minSdkVersion 是 21。我的目标是 Java 6 在 Kotlin 方面。项目设置:Kotlin 编译器针对 JVM 版本 1.6。我假设这意味着编译器将生成 Java 6 字节码,而 Java 7 库在这种情况下不适用。真的很感谢你的帮助。我可能不够聪明,无法理解。如果没有其他解释,我会接受你的回答。

以上是关于为啥 Kotlin 插件为 Android 项目添加 kotlin-stdlib-jre7(不是 kotlin-stdlib)参考的主要内容,如果未能解决你的问题,请参考以下文章

为啥 kotlin gradle 插件无法使用 1.8 目标构建?

Kotlin-为Android项目生成Doc文档

Android@Kotlin 在Android studio 中配置Kotlin

如何使用Kotlin进行Android开发

怎么在android上使用kotlin

为啥 kotlin multiplatform 不执行和导出 iOS 框架?