Kotlin logo

Kotlin

A concise multiplatform language developed by JetBrains

Kotlin Multiplatform

Kotlin Multiplatform 的新默认项目结构

Read this post in other languages:

我们即将更新 Kotlin Multiplatform 项目的默认项目结构,旨在为模块指定更清晰的职责,更好地与其他构建系统和框架使用的约定保持一致,并反映 Android Gradle Plugin 9.0 中的更改

您将在我们工具生成的新建项目、官方文档以及 Kotlin Multiplatform 示例中看到此项目结构。

这些更改已在 KMP 向导中上线,包括您的 IDE(已安装 Kotlin Multiplatform 插件)中和 kmp.jetbrains.com 上。我们也将更新示例项目和其他学习资料,以匹配此新结构。您现在就可以查看 kotlinconf-appKMP-App-TemplateRSS Reader 作为参考。

要在 IntelliJ IDEA 中获得对 AGP 9.0 的支持,请更新到 2026.1.2 或更高版本,并使用最新版 Android 插件

本文将说明我们进行的更改、更改结构的原因,以及您如何更新现有项目。

变化

在之前的结构中,大多数项目只有一个 composeApp Gradle 模块,该模块包含一个 Kotlin Multiplatform 库,同时也作为一个或多个平台的应用程序,包含它们的入口点和其他相关配置。

Project(项目)视图中,结构如下:

我们的新默认结构包含一个 shared 模块,其职责单一且明确:它是包含共享代码的 Kotlin Multiplatform 库。然后,对于每个您想基于共享库代码构建可运行应用程序的平台,您会有独立的应用程序模块,例如 androidAppdesktopAppwebApp

新结构在 Project(项目)视图中如下所示:

我们进行更改的原因

旧结构中的 composeApp 模块承担了多种不同职责。因此,它包含大量配置,包括所有平台的平台特定打包详细信息。这样一来,便很难分清哪些部分是在设置 Kotlin Multiplatform 库,哪些部分是在设置应用程序本身。

如果您选择在某个客户端平台上共享 UI(例如,为您的 iOS 应用程序使用 SwiftUI),旧结构会在 composeApp 之外再包含一个额外的 shared 模块。这是模块结构的重大更改,但仅在采用某些配置时才会发生。

iOS 应用程序还存在不对称的问题。由于 iOS 应用程序需要一个使用共享代码的 Xcode 项目,iOS 应用程序已经单独放在 iosApp 文件夹中,而其他基于共享代码构建的应用程序则都放在 composeApp 中。

Android Gradle 插件 9.0 要求 Android 应用程序的入口点必须单独放在与共享代码不同的模块中,因为它不再支持在多平台模块中应用 Android 应用程序 Gradle 插件。

最后一点,我们之前对基于 Gradle 和基于 Amper 的项目采用了不同的结构。Gradle 支持在单个模块中配置多个应用程序,而 Amper 的每个模块只允许一个产品,因此,基于 Amper 的项目已为每个应用程序使用单独的模块。

新结构的目标

基于以上几点,我们在创建新结构时考虑了以下目标:

  • 为项目提供初始设置,使每个模块都有清晰的职责和单一的目的。应始终明确指示某段代码或某个构建配置应该放在项目中的什么位置。
  • 尽可能保持向导所允许的不同配置之间的结构一致性:不同的目标平台组合、是否包含服务器应用程序、为客户端选择原生 UI 还是共享 UI。
  • 降低进一步对项目进行模块化的难度,可以根据需要从单个多平台模块扩展为多个模块。

适应其他配置

上面的示例展示的是在 Android、iOS、Desktop 和 Web 平台间共享 UI 的 Compose Multiplatform 应用程序的新项目结构 采用其他配置时,结构将根据需要进行调整,但变动会很少。

采用原生 UI 的配置

Kotlin Multiplatform 支持在共享 Kotlin 代码之上使用原生 UI。例如,您可以选择为 iOS App 使用 SwiftUI,而为其他平台使用 Compose Multiplatform。在这种情况下,您将编写所有平台共用的共享业务逻辑代码,以及仅供某些平台使用的共享 UI 代码。

采用此配置时,新结构将有两个共享模块,而非一个,这两个模块分别是 sharedLogicsharedUIsharedLogic 供所有应用程序使用,且不包含 Compose 依赖项,而 sharedUI 则仅供为其 UI 使用 Compose Multiplatform 的应用程序使用。

确定在哪个模块中编写共享代码也很简单:如果所有平台(包括实现原生 UI 的平台)都会用到此代码,就应将其放在 sharedLogic 中。如果只有使用 Compose Multiplatform 的平台需要这段代码,则应放在 sharedUI 中。

包含服务器的配置

对于同时面向服务器端 Kotlin 的项目,新结构添加了 server 模块,并将所有客户端模块移至嵌套的 app 文件夹中。借助项目根目录中额外增加的 core 模块,您可以在服务器端与客户端代码之间共享代码,例如模型和验证逻辑。

更新现有项目

虽然我们将更改新建项目的默认结构,但并不要求现有项目采用完全相同的结构。如果您想迁移现有项目,以匹配这种新的默认结构,可以参考迁移指南,其中介绍了如何为每个入口点引入新模块。

但要注意的是,对于所有面向 Android 的现有多平台项目,与 Android Gradle 插件 9.0 相关的更改为强制性要求。您可以参考这篇博文详细了解这些更改以及更新项目的方式。

要在 IntelliJ IDEA 中获得对 AGP 9.0 的支持,请更新到 2026.1.2 或更高版本,并使用最新版 Android 插件

立即开始使用 KMP

要使用新结构创建项目,请访问 kmp.new,或在 IDE 中使用 Kotlin Multiplatform 向导(在安装了 Kotlin Multiplatform 插件的 IntelliJ IDEA 和 Android Studio 中均提供)。

如果您想了解新结构的实际应用示例,可以查看 kotlinconf-appKMP-App-TemplateRSS Reader

本博文英文原作者:

Márton Braun

Márton Braun

Discover more