6.3.8 Kotlin/Native 支持的目标平台和宿主
4 分钟阅读
原文链接: 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 选项:
| |
给库作者的建议
我们不建议库作者测试比 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。