纯Kotlin+Compose的Android项目转KMP记录

建议阅读:

  1. WanAndroid 项目迁移 KMP
  2. Kotlin Multiplatform 向导

原项目概述:

时间:2025.07.19

  1. 页面是纯compose编写的

  2. 依赖包均采用Android官方的 / 官方推荐的。
    依赖包均默认为最小架构
    数据库相关采用room

  3. 软件架构采用官方推荐架构MVVM

迁移概述

创建Share module

  1. 选择 File - New - New Module,进入模块创建页面,选择 Kotlin Multiplatform Share Module,输入 Module name 和 Package name 即可完成创建。

我们后面都假设Module name为shared

创建好后新的模块,层级如下:

  1. commonMain:跨平台的公共代码,比如 expact 的类和函数,Compose 代码等

  2. androidMain:Android 平台的代码,比如 actual 的类和函数实现,可以依赖 Android SDK 或 Android 三方库,

  3. iosMain:iOS 平台的代码,比如 actual 的类和函数实现,可以依赖 iOS SDK 或 iOS 三方库

我们迁移的目的就是将原有代码尽可能多的迁移到commonMain目录下。

尝试迁移

本节的目的是 将原有代码迁移到 commonMain 目录后,原来的Android代码还能正常运行。(Android调用KMP中commonMain的公共资源)

  1. 在 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支持较好)

  1. 创建新的Java or Kotlin Library 模块,名为desktopApp(自己起名即可)
  2. 创建完成后,切换视图从Android到Project
  3. 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 {
        // ... 操作 ...
      }
   }
}

迁移资源

建议阅读:https://www.jetbrains.com/help/kotlin-multiplatform-dev/compose-multiplatform-resources-usage.html#strings

迁移导航

迁移Repository

迁移viewmodel

迁移 Android-KMP

建议阅读:https://developer.android.com/kotlin/multiplatform/plugin?hl=zh-cn

posted @ 2025-07-18 13:23  kingwzun  阅读(218)  评论(0)    收藏  举报