Kotlinv2.4.0

在平台上共享代码

使用 Kotlin Multiplatform,您可以利用 Kotlin 提供的机制来共享代码:

如果您需要从共享代码访问平台特定的 API,请使用 Kotlin 的 预期声明与实际声明 机制。

在所有平台上共享代码

如果您拥有适用于所有平台的通用业务逻辑,则无需为每个平台编写相同的代码 —— 只需在 common 源集中共享即可。

在所有平台上共享代码

源集的某些依赖项是默认设置的。您不需要手动指定任何 dependsOn 关系:

  • 对于依赖于 common 源集的所有平台特定源集,例如 jvmMainmacosArm64Main 等。
  • 在特定目标的 maintest 源集之间,例如 androidMainandroidUnitTest

如果您需要从共享代码访问平台特定的 API,请使用 Kotlin 的 预期声明与实际声明 机制。

在相似平台上共享代码

您经常需要创建多个原生目标,这些目标可能会重用大量通用逻辑和第三方 API。

例如,在针对 iOS 的典型多平台项目中,有两个 iOS 相关的目标:一个是针对 iOS ARM64 设备的,另一个是针对 x64 模拟器的。它们拥有独立的平台特定源集,但实际上很少需要为设备和模拟器编写不同的代码,且它们的依赖项也基本相同。因此,iOS 特定的代码可以在它们之间共享。

显然,在这种配置下,最好能为两个 iOS 目标建立一个共享源集,其中的 Kotlin/Native 代码仍然可以直接调用 iOS 设备和模拟器共有的任何 API。

在这种情况下,您可以使用 层次结构 通过以下方式之一在项目中的原生目标之间共享代码:

详细了解 在库中共享代码连接平台特定库

在库中共享代码

得益于层次结构项目结构,库也可以为目标的子集提供通用 API。当 库发布 时,其中间源集的 API 会与项目结构信息一起嵌入到库工件中。当您使用该库时,项目的中间源集仅访问该库中对每个源集的目标可用的 API。

例如,查看来自 kotlinx.coroutines 仓库的以下源集层次结构:

库层次结构

concurrent 源集声明了 runBlocking 函数,并为 JVM 和原生目标进行编译。一旦 kotlinx.coroutines 库使用层次结构项目结构完成更新和发布,您就可以依赖它,并从 JVM 和原生目标共享的源集中调用 runBlocking,因为它匹配库中 concurrent 源集的“目标签名”。

连接平台特定库

为了在不受平台特定依赖项限制的情况下共享更多原生代码,请使用 平台库,如 Foundation、UIKit 和 POSIX。这些库随 Kotlin/Native 一起提供,并且默认在共享源集中可用。

此外,如果您在项目中使用 Kotlin CocoaPods Gradle 插件,则可以处理通过 cinterop 机制 使用的第三方原生库。

下一步