【问题标题】:How to make Kotlin Multiplatform work with Android Studio's project view?如何让 Kotlin Multiplatform 与 A​​ndroid Studio 的项目视图一起工作?
【发布时间】:2022-01-27 17:06:56
【问题描述】:

我正在尝试在 Android Studio 中构建一个多平台库模块的模板,该模板可以与其他普通的 Android 库和应用程序模块无缝互操作。我发现在编译、运行和发布工件方面,让一个多平台 Android 项目在技术上工作很容易,但我似乎无法解决的一个问题是让源集在 Android 项目文件窗格视图中正确显示.

所以你可以在这里的Project视图中看到,源码分为android、native和common目录及其各自的test目录,一共六个源码目录:

在 Android 项目视图中,这是由构建目标而不是源文件目录呈现的,因此这个“typing-sdk”模块示例总共有 10 个不同的子模块。而且您会注意到 androidMain 和 androidTest 不在其中:它们的源代码不是被呈现为子模块,而是位于内联的 kotlin 目录下;您可以分别看到 main 和 test com.demo.typing 包。

每个构建目标都有自己的子模块有点烦人,但在实践中,实际上几乎不需要使用其中的一些,例如“iosArm64Test”。不过,我可以忍受冗余子模块。 这里的核心问题是这些子模块中的每一个都填充了错误的源文件。

因此,在文件结构中,通用集和原生集都有自己的源文件,如您在此处看到的:

在 Android 项目视图中,每个子模块都包含 Android 源代码!?

要么这是 Android Studio 与 Kotlin 多平台 Gradle 插件互操作的错误,要么是我编写的 Gradle 构建文件有问题,即(使用 Gradle 7.1):

plugins {
    id 'org.jetbrains.kotlin.multiplatform' version '1.6.10'
    id 'com.android.library' version '7.0.4'
}

allprojects {
    group = 'typing'
    version = '1.0'
    sourceCompatibility = '1.8'

    repositories {
        mavenCentral()
        google()
    }
}

kotlin {
    android()
    ios()

    sourceSets {
        commonMain
        commonTest
        androidMain {
            dependsOn(commonMain)
        }
        androidAndroidTestRelease
        androidTest {
            dependsOn(commonTest)
            dependsOn(androidAndroidTestRelease)
        }
        nativeMain {
            dependsOn(commonMain)
        }
        nativeTest {
            dependsOn(commonTest)
        }
        iosMain {
            dependsOn(nativeMain)
            iosX64Main.dependsOn(it)
            iosArm64Main.dependsOn(it)
        }
        iosTest {
            dependsOn(nativeTest)
            iosX64Test.dependsOn(it)
            iosArm64Test.dependsOn(it)
        }
    }
}

android {
    compileSdk 31
    defaultConfig {
        minSdk 23
        targetSdk 30
    }
}

我注意到已经存在的大多数源示例都使用 Kotlin DSL,这是可取的,但情况迫使我在这里使用 Groovy。在我的另一个项目中,Kotlin DSL 使用早期版本的 Gradle (7.0.2) Android Gradle Plugin (7.0.2) 和 Kotlin (1.5.20),Android 项目视图的呈现方式不同,尽管仍然存在很大缺陷,在每个构建目标模块下都列出 Android 源代码并没有那么严重的错误。在该项目的 Android 块中,您对 com.android.library 插件有第二个源集定义:

android {
    compileSdk = 31
    defaultConfig {
        minSdk = 23
        targetSdk = 30

        consumerProguardFiles("proguard-rules.pro")
    }
    sourceSets.all {
        java.srcDirs(file("src/android${name.capitalize()}/kotlin"))
        res.srcDirs(file("src/android${name.capitalize()}/res"))
        resources.srcDirs(file("src/android${name.capitalize()}/resources"))
        manifest.srcFile(file("src/android${name.capitalize()}/AndroidManifest.xml"))
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

我不知道如何直接将其翻译成 Groovy,但是按照 Android 文档,可以这样写:

android {
    compileSdk 31
    defaultConfig {
        minSdk 23
        targetSdk 30
    }
    sourceSets {
        main {
            java.srcDirs = ['src/androidMain/kotlin']
            manifest.srcFile 'src/androidMain/AndroidManifest.xml'
        }
        test {
            java.srcDirs = ['src/androidTest/kotlin']
        }
        androidTest {
            setRoot 'src/androidTest/kotlin'
        }
    }
}

很遗憾,这并不能解决问题。如果没有人可以向我展示不会在 Android Studio 中创建可怕和损坏的源文件视图的可行 Gradle 脚本,我会将其作为错误提交给 JetBrains。

【问题讨论】:

    标签: android-studio gradle android-gradle-plugin build.gradle kotlin-multiplatform


    【解决方案1】:

    IntellIJ 是多平台开发时推荐使用的 IDE。

    Android Studio 是针对更多 Android 特定的东西,我不认为 Android 项目视图 是 JetBrains 想要支持的,也许会有一个 Kotlin 多平台项目视图在某个时候,但不是现在。

    (如果您打开 Spring、NodeJS、iOS 或任何其他类型的项目,Android 项目视图同样会出现故障)

    【讨论】:

    • 哦,麻烦了。好吧,感谢您澄清这一点。无论如何,我可能仍会推动对 YouTrack 的支持,因为 JetBrains 正在尝试推动 Kotlin Mobile Multiplatform,他们至少可以使 IDE 集成变得体面。
    猜你喜欢
    • 2017-11-02
    • 2020-06-30
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多