菜单

多平台和原生支持

相关源文件

此页面详细介绍了 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 任务

KotlinNativeCompile 任务将 Kotlin 源代码编译为 Kotlin 库格式(.klib)。此任务:

  • 处理 Kotlin 源文件
  • 解析依赖项(包括其他 .klib 文件)
  • 生成特定于平台的 .klib 文件

主要属性

  • compilation:正在构建的编译
  • outputKind:通常是此任务的 LIBRARY
  • konanTarget:原生目标(例如,iosArm64linuxX64
  • libraries:编译所需的依赖项

KotlinNativeLink 任务接收 KotlinNativeCompile 生成的 .klib,并将其链接为原生二进制文件。此任务:

  • 将 .klib 与其依赖项链接
  • 集成 C 互操作库
  • 生成最终的原生二进制文件

主要属性

  • binary:正在构建的原生二进制文件
  • outputKind:输出类型(EXECUTABLE, FRAMEWORK 等)
  • target:原生目标平台
  • optimizeddebuggable:控制优化和调试信息
  • linkerOpts:传递给原生链接器的附加选项

来源

Commonizer 系统

Commonizer 通过创建可以在不同平台使用的“commonized”库,实现多个原生目标之间的代码共享。

Commonizer 在两个主要区域工作

  1. 原生分发 Commonization:为不同的原生目标组合(例如,iOS arm64 + x64)创建 Kotlin/Native 标准库和平台库的 commonized 版本。

  2. C 互操作 Commonization:为可在多个平台上使用的 C 库创建通用的接口,允许通用 Kotlin 代码使用这些 C 库。

关键任务

  • commonizeNativeDistribution:Commonize Kotlin/Native 标准库和平台库
  • commonizeCInterop:Commonize C 互操作库

配置属性

  • kotlin.mpp.enableCInteropCommonization:启用/禁用 C 互操作 Commonization
  • kotlin.native.ignoreDisabledTargets:抑制有关已禁用原生目标的警告

来源

Apple 平台支持

Kotlin/Native 为 Apple 平台(iOS、macOS、watchOS、tvOS)提供特殊支持,包括框架生成、Xcode 集成和 Swift 导出。

框架支持

框架是 Apple 平台的特殊类型的原生二进制文件,包含

  • 动态或静态库
  • 用于与 Swift/Objective-C 交互的头文件
  • 资源和元数据

主要功能

  • 单架构框架:由 KotlinNativeLink 任务生成,outputKind = FRAMEWORK
  • Fat(多架构)框架:由 FatFrameworkTask 通过组合多个单架构框架生成
  • Xcode 集成embedAndSignAppleFrameworkForXcode 等任务与 Xcode 构建过程集成

Swift 导出

Swift 导出是一项功能,它允许将 Kotlin API 导出到 Swift,并遵循对 Swift 友好的 API 约定。

Swift 导出提供

  • 从 Kotlin 代码生成对 Swift 友好的 API 头文件
  • 为导出的 API 创建 Swift Package Manager 包
  • 与 Xcode 项目集成

配置

  • 使用 swiftExport 扩展来配置 Swift 导出
  • 控制哪些 Kotlin API 被导出到 Swift
  • 指定生成的 Swift 代码和包的设置

来源

C 互操作支持

C 互操作允许 Kotlin 代码直接调用 C 库和 API。

关键组件

  • C 互操作定义.def 文件,定义要导入的 C API
  • CInteropProcess 任务:为 C 库生成 Kotlin 绑定
  • C 互操作 Commonization:允许从通用代码中使用 C 库

配置属性

  • kotlin.mpp.enableCInteropCommonization:启用/禁用 C 互操作 Commonization
  • kotlin.native.cacheKind:控制互操作库的缓存类型

来源

配置选项

Kotlin/Native 和多平台功能可以通过各种属性进行自定义。

通用配置属性

属性描述默认
kotlin.native.ignoreDisabledTargets抑制有关已禁用原生目标的警告false
kotlin.mpp.enableCInteropCommonization启用 C 互操作 Commonizationfalse
kotlin.native.cacheKind原生编译缓存的类型(NONE, STATIC, DYNAMIC)NONE
kotlin.native.distribution.typeKotlin/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归档期间复制 dSYMtrue

来源

IDE 支持原生和多平台

Kotlin/Native 和多平台项目包含 IDE 支持,用于解析依赖项并在不同平台之间提供正确的类型信息。

主要功能

  • 解析特定平台和通用依赖项
  • 在 IDE 中支持 commonized 库
  • C 互操作依赖项解析
  • 对多平台复合项目的特殊处理

来源

构建性能和缓存

Kotlin/Native 编译可能非常耗费资源。有几种机制可以提高构建性能:

性能特性

  • 增量编译:仅重新构建代码库的必要部分
  • 缓存系统:存储和重用编译工件
  • Commonization 缓存:缓存 commonized 库
  • 配置缓存:与 Gradle 的配置缓存兼容

配置属性

  • kotlin.incremental.native:启用/禁用增量编译
  • kotlin.native.cacheKind:原生编译缓存的类型
  • kotlin.mpp.enableNativeDistributionCommonizationCache: 控制通用化缓存

来源

诊断和报告

Kotlin Gradle 插件提供针对原生和多平台开发的特定诊断信息

关键诊断功能

  • 针对当前机器上无法构建的已禁用原生目标的警告
  • 关于已弃用原生目标的警告
  • C 互操作通用化问题的诊断
  • 包含性能指标的构建报告

来源