此页面详细介绍了 Kotlin Gradle 插件如何处理多平台和原生编译。它解释了架构、任务、配置选项以及对 iOS、macOS、Linux 和 Windows 等原生平台 的专门支持。有关 Kotlin Gradle 插件通用架构 的信息,请参阅Kotlin 编译器和工具概览。
Kotlin Multiplatform (KMP) 允许开发者在需要时编写特定平台的实现,从而跨多个平台共享代码。Kotlin/Native 是一项技术,它使 Kotlin 代码能够在没有 JVM 的平台上运行,生成可以运行在 iOS、macOS、Windows、Linux 和其他平台上的原生二进制文件。
来源
Kotlin/Native 目标代表您的代码可以编译到的平台。每个目标对应一个特定的平台(例如,iOS、macOS、Linux)和架构(例如,x64、arm64)。
原生二进制文件通过原生目标中的 binaries 容器进行配置。每个二进制文件都与一个构建类型(DEBUG 或 RELEASE)相关联,并有一个输出类型,用于确定生成的原生工件的类型。
Kotlin/Native 可以生成多种类型的二进制文件
| 二进制类型 | 描述 | 主要用例 |
|---|---|---|
| 可执行文件 | 独立程序 | 命令行应用程序 |
| 动态库 | 共享库(.so, .dll, .dylib) | 应用程序之间共享的库 |
| 静态库 | 静态库(.a) | 嵌入到应用程序中的库 |
| 框架 | Apple 框架(.framework) | iOS/macOS 库 |
| 测试可执行文件 | 带有测试框架的可执行文件 | 运行测试 |
来源
原生编译过程通过一系列任务将 Kotlin 源代码转换为原生二进制文件。
KotlinNativeCompile 任务将 Kotlin 源代码编译为 Kotlin 库格式(.klib)。此任务:
主要属性
compilation:正在构建的编译outputKind:通常是此任务的 LIBRARYkonanTarget:原生目标(例如,iosArm64、linuxX64)libraries:编译所需的依赖项KotlinNativeLink 任务接收 KotlinNativeCompile 生成的 .klib,并将其链接为原生二进制文件。此任务:
主要属性
binary:正在构建的原生二进制文件outputKind:输出类型(EXECUTABLE, FRAMEWORK 等)target:原生目标平台optimized 和 debuggable:控制优化和调试信息linkerOpts:传递给原生链接器的附加选项来源
Commonizer 通过创建可以在不同平台使用的“commonized”库,实现多个原生目标之间的代码共享。
Commonizer 在两个主要区域工作
原生分发 Commonization:为不同的原生目标组合(例如,iOS arm64 + x64)创建 Kotlin/Native 标准库和平台库的 commonized 版本。
C 互操作 Commonization:为可在多个平台上使用的 C 库创建通用的接口,允许通用 Kotlin 代码使用这些 C 库。
关键任务
commonizeNativeDistribution:Commonize Kotlin/Native 标准库和平台库commonizeCInterop:Commonize C 互操作库配置属性
kotlin.mpp.enableCInteropCommonization:启用/禁用 C 互操作 Commonizationkotlin.native.ignoreDisabledTargets:抑制有关已禁用原生目标的警告来源
Kotlin/Native 为 Apple 平台(iOS、macOS、watchOS、tvOS)提供特殊支持,包括框架生成、Xcode 集成和 Swift 导出。
框架是 Apple 平台的特殊类型的原生二进制文件,包含
主要功能
KotlinNativeLink 任务生成,outputKind = FRAMEWORKFatFrameworkTask 通过组合多个单架构框架生成embedAndSignAppleFrameworkForXcode 等任务与 Xcode 构建过程集成Swift 导出是一项功能,它允许将 Kotlin API 导出到 Swift,并遵循对 Swift 友好的 API 约定。
Swift 导出提供
配置
swiftExport 扩展来配置 Swift 导出来源
C 互操作允许 Kotlin 代码直接调用 C 库和 API。
关键组件
.def 文件,定义要导入的 C API配置属性
kotlin.mpp.enableCInteropCommonization:启用/禁用 C 互操作 Commonizationkotlin.native.cacheKind:控制互操作库的缓存类型来源
Kotlin/Native 和多平台功能可以通过各种属性进行自定义。
| 属性 | 描述 | 默认 |
|---|---|---|
kotlin.native.ignoreDisabledTargets | 抑制有关已禁用原生目标的警告 | false |
kotlin.mpp.enableCInteropCommonization | 启用 C 互操作 Commonization | false |
kotlin.native.cacheKind | 原生编译缓存的类型(NONE, STATIC, DYNAMIC) | NONE |
kotlin.native.distribution.type | Kotlin/Native 分发的类型(预构建、轻量级) | prebuilt |
kotlin.native.enableKlibsCrossCompilation | 启用 Kotlin/Native 库的交叉编译 | false |
kotlin.mpp.applyDefaultHierarchyTemplate | 将默认层次结构模板应用于源集 | true |
kotlin.mpp.enableResourcesPublication | 启用资源发布 | true |
| 属性 | 描述 | 默认 |
|---|---|---|
kotlin.native.cacheOrchestration | 控制缓存编排(Gradle、编译器) | 特定于平台 |
kotlin.native.binary.* | 传递给编译器的特定于二进制文件的选项 | None |
kotlin.apple.createSymbolicLinkToFrameworkInBuiltProductsDir | 创建框架的符号链接 | true |
kotlin.apple.copyDsymDuringArchiving | 归档期间复制 dSYM | true |
来源
Kotlin/Native 和多平台项目包含 IDE 支持,用于解析依赖项并在不同平台之间提供正确的类型信息。
主要功能
来源
Kotlin/Native 编译可能非常耗费资源。有几种机制可以提高构建性能:
性能特性
配置属性
kotlin.incremental.native:启用/禁用增量编译kotlin.native.cacheKind:原生编译缓存的类型kotlin.mpp.enableNativeDistributionCommonizationCache: 控制通用化缓存来源
Kotlin Gradle 插件提供针对原生和多平台开发的特定诊断信息
关键诊断功能
来源