纯Kotlin+Compose的Android项目转KMP记录
建议阅读:
原项目概述:
时间:2025.07.19
-
页面是纯compose编写的
-
依赖包均采用Android官方的 / 官方推荐的。
依赖包均默认为最小架构
数据库相关采用room -
软件架构采用官方推荐架构MVVM
迁移概述
创建Share module
- 选择 File - New - New Module,进入模块创建页面,选择 Kotlin Multiplatform Share Module,输入 Module name 和 Package name 即可完成创建。
我们后面都假设Module name为shared
创建好后新的模块,层级如下:
-
commonMain:跨平台的公共代码,比如 expact 的类和函数,Compose 代码等
-
androidMain:Android 平台的代码,比如 actual 的类和函数实现,可以依赖 Android SDK 或 Android 三方库,
-
iosMain:iOS 平台的代码,比如 actual 的类和函数实现,可以依赖 iOS SDK 或 iOS 三方库
我们迁移的目的就是将原有代码尽可能多的迁移到commonMain目录下。
尝试迁移
本节的目的是 将原有代码迁移到 commonMain 目录后,原来的Android代码还能正常运行。(Android调用KMP中commonMain的公共资源)
- 在 app/build.gradle 中添加 shared 模块的依赖,就可以在原来的 Android 代码中调用 KMP 代码了。
// settings.gradle
include ':shared'
// app/build.gradle
dependencies {
...
implementation project(":shared")
...
}
然后在commonMain的kotlin目录下的创建的文件页面等等,就可以在Android里面使用了。
创建并运行 desktop App
目的是创建desktop的启动类(ios平台参考官方教程,结合本教程即可,官方文档对ios支持较好)
- 创建新的Java or Kotlin Library 模块,名为
desktopApp(自己起名即可) - 创建完成后,切换视图从Android到Project
- 在
desktopApp/src/main/.../cn/.../desktop/创建Main.kt(记得将main标识)
内容如下:
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import cn.xxxxx.shared.App
fun main() = application {
Window(
onCloseRequest = ::exitApplication,
title = "App",
) {
App()
}
}
正式迁移
什么不可以迁移
Android的Application不可以放入commonMain
Android的Activity不可以放入commonMain
迁移room
建议阅读:https://developer.android.com/kotlin/multiplatform/room?hl=zh-cn
重点提醒,对于事务操作 要从db.withTransaction { … }改为新模式,
否则会报错:“Cannot return a SupportSQLiteOpenHelper since no SupportSQLiteOpenHelper.Factory was configured with Room.”
实例如下:
修改前:
withContext(Dispatchers.IO) {
db.withTransaction{
// ... 操作 ...
}
}
修改后:
withContext(Dispatchers.Default) {
db.useWriterConnection { connection ->
connection.immediateTransaction {
// ... 操作 ...
}
}
}
迁移资源
迁移导航
迁移Repository
迁移viewmodel
迁移 Android-KMP
建议阅读:https://developer.android.com/kotlin/multiplatform/plugin?hl=zh-cn

浙公网安备 33010602011771号