6.3.8 Kotlin/Native 支持的目标平台和宿主

原文链接: https://kotlinlang.org/docs/native-target-support.html

6.3.8 Kotlin/Native 支持的目标平台和宿主

本文介绍 Kotlin/Native 编译器支持哪些目标平台和宿主。

提示: 我们会根据需要调整受支持目标平台和宿主的列表、层级数量及其特性。

目标层级

Kotlin/Native 编译器支持许多不同的目标平台,但对它们的支持程度各不相同。为说明这些程度,我们根据编译器对目标平台的支持情况把它们划分为若干层级。

层级表格包含以下列:

  • Gradle 目标名称是在 Kotlin Multiplatform Gradle 插件中用于启用该目标的目标名称。
  • 目标三元组是按照编译器常用的 <architecture>-<vendor>-<system>-<abi> 结构表示的目标名称。
  • 运行测试表示该目标是否允许用户在 Gradle 和 IDE 中开箱即用地运行测试(不要与为目标本身运行的 CI 测试混淆)。

这只能在针对该特定目标的原生宿主上使用。例如,你只能在 macOS ARM64 宿主上运行 macosArm64 和 iosArm64 测试。

第 1 层

  • 该目标会在 CI 中定期测试,以确保能够编译和运行。
  • 我们提供跨编译器版本的源码兼容性和二进制兼容性。

| Gradle 目标名称 | 目标三元组 | 运行测试 | 说明 |

| 仅 Apple macOS 宿主: | | | | | macosArm64 | aarch64-apple-macos | ✅ | Apple 芯片平台上的 Apple macOS 12.0 及更高版本 | | iosSimulatorArm64 | aarch64-apple-ios-simulator | ✅ | Apple 芯片平台上的 Apple iOS 模拟器 15.0 及更高版本 | | iosArm64 | aarch64-apple-ios | | ARM64 平台上的 Apple iOS 和 iPadOS 15.0 及更高版本 |

第 2 层

  • 该目标会在 CI 中定期测试以确保能够编译,但可能不会自动测试能否运行。
  • 我们会尽力提供跨编译器版本的源码兼容性和二进制兼容性。

| Gradle 目标名称 | 目标三元组 | 运行测试 | 说明 |

| linuxX64 | x86_64-unknown-linux-gnu | ✅ | x86_64 平台上的 Linux | | linuxArm64 | aarch64-unknown-linux-gnu | | ARM64 平台上的 Linux | | 仅 Apple macOS 宿主: | | | | | watchosSimulatorArm64 | aarch64-apple-watchos-simulator | ✅ | Apple 芯片平台上的 Apple watchOS 模拟器 8.0 及更高版本 | | watchosArm64 | arm64_32-apple-watchos | | 采用 ILP32 的 ARM64 平台上的 Apple watchOS 8.0 及更高版本 | | tvosSimulatorArm64 | aarch64-apple-tvos-simulator | ✅ | Apple 芯片平台上的 Apple tvOS 模拟器 15.0 及更高版本 | | tvosArm64 | aarch64-apple-tvos | | ARM64 平台上的 Apple tvOS 15.0 及更高版本 |

第 3 层

  • 不保证该目标会在 CI 中被测试。
  • 我们无法承诺跨编译器版本的源码兼容性和二进制兼容性,不过这些目标的此类变化相当罕见。

警告: 第 3 层目标不在积极开发中,可能存在破坏性问题。请谨慎使用。

| Gradle 目标名称 | 目标三元组 | 运行测试 | 说明 |

| androidNativeArm32 | arm-unknown-linux-androideabi | | ARM32 平台上的 Android NDK | | androidNativeArm64 | aarch64-unknown-linux-android | | ARM64 平台上的 Android NDK | | androidNativeX86 | i686-unknown-linux-android | | x86 平台上的 Android NDK | | androidNativeX64 | x86_64-unknown-linux-android | | x86_64 平台上的 Android NDK | | mingwX64 | x86_64-pc-windows-gnu | ✅ | 使用 MinGW 兼容层的 64 位 Windows 10 及更高版本 | | 仅 Apple macOS 宿主: | | | | | watchosDeviceArm64 | aarch64-apple-watchos | | ARM64 平台上的 Apple watchOS 8.0 及更高版本 | | iosX64 | x86_64-apple-ios-simulator | | x86-64 平台上的 Apple iOS 模拟器 15.0 及更高版本 |

已弃用的目标

以下目标已被弃用并计划移除:

| 目标 | 弃用起始版本 | 说明 |

| watchosArm32 | Kotlin 2.4.20 | ARM32 平台上的 Apple watchOS 设备 | | macosX64 | Kotlin 2.3.20 | x86_64 平台上的 Apple macOS | | watchosX64 | Kotlin 2.3.20 | x86_64 平台上的 Apple watchOS 64 位模拟器 | | tvosX64 | Kotlin 2.3.20 | x86_64 平台上的 Apple tvOS 模拟器 | | linuxArm32Hfp | Kotlin 1.8.20 | ARM32 平台上的 Linux |

支持更低的 Apple 目标版本

目前,Apple 目标的默认最低支持版本是:

  • 对于 iOS 和 tvOS,为 15.0。
  • 对于 macOS,为 12.0。
  • 对于 watchOS,为 8.0。

如果你的项目需要支持低于默认值的版本,请在构建文件中使用 freeCompilerArgs 选项:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
kotlin {
    targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget>().configureEach {
        binaries.configureEach {
            freeCompilerArgs += "-Xoverride-konan-properties=minVersion.ios=14.0"
            freeCompilerArgs += "-Xoverride-konan-properties=minVersion.macos=11.0"
            freeCompilerArgs += "-Xoverride-konan-properties=minVersion.tvos=14.0"
            freeCompilerArgs += "-Xoverride-konan-properties=minVersion.watchos=7.0"
        }
    }
}

给库作者的建议

我们不建议库作者测试比 Kotlin/Native 编译器更多的目标,或提供比它更严格的保证。在考虑对原生目标的支持时,你可以采用以下做法:

  • 支持第 1、2、3 层中的所有目标。
  • 定期测试第 1、2 层中支持开箱即用运行测试的那些目标。

Kotlin 团队在官方 Kotlin 库中采用这种做法,例如 kotlinx.coroutines 和 kotlinx.serialization。

宿主

Kotlin/Native 编译器支持以下宿主:

| 宿主操作系统 | 构建最终二进制文件 | 生成 .klib 产物 |

| 采用 Apple 芯片(ARM64)的 macOS | 任何受支持的目标 | 任何受支持的目标 | | 采用 Intel 芯片(x86_64)的 macOS | 任何受支持的目标 | 任何受支持的目标 | | 采用 x86_64 架构的 Linux | 除 Apple 目标之外的任何受支持目标 | 任何受支持的目标,Apple 目标仅在无 cinterop 依赖时可用 | | 采用 x86_64 架构的 Windows(MinGW 工具链) | 除 Apple 目标之外的任何受支持目标 | 任何受支持的目标,Apple 目标仅在无 cinterop 依赖时可用 |

构建最终二进制文件

要生成最终二进制文件,你只能在_受支持的宿主_上为受支持的目标编译。例如,你不能在 FreeBSD 上或在采用 ARM64 架构的 Linux 机器上这样做。

在 Linux 和 Windows 上为 Apple 目标构建最终二进制文件也是不可能的。

生成 .klib 产物

一般来说,Kotlin/Native 允许任何_受支持的宿主_为受支持的目标生成 .klib 产物。

不过,在 Linux 和 Windows 上为 Apple 目标生成产物仍有一些限制。如果你的项目使用 cinterop 依赖(包括 CocoaPods),则必须使用 macOS 宿主。

例如,只有在没有 cinterop 依赖的情况下,你才能在采用 x86_64 架构的 Windows 机器上为 macosArm64 目标生成 .klib。

接下来做什么?