当前位置: 首页 > 知识库问答 >
问题:

Kotlin多平台配置问题

通啸
2023-03-14

我的KMP Jetpack Compose项目中继续出现Gradle配置错误

配置项目:共享时出现问题。

找不到名为“testApi”的配置。

我的设置是:

  1. Android Studio北极狐狸2020.3.1金丝雀3
  2. 项目级别设置
dependencies {
   classpath("com.android.tools.build:gradle:7.0.0-alpha03")
   classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.20")
}
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
    kotlin("multiplatform")
    id("com.android.library")
}

kotlin {
    android()
    ios {
        binaries {
            framework {
                baseName = "shared"
            }
        }
    }
    sourceSets {
        val commonMain by getting
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test-common"))
                implementation(kotlin("test-annotations-common"))
            }
        }
        val androidMain by getting {
            dependencies {
                implementation("com.google.android.material:material:1.2.1")
            }
        }
        val androidTest by getting {
            dependencies {
                implementation(kotlin("test-junit"))
                implementation("junit:junit:4.13.1")
            }
        }
        val iosMain by getting
        val iosTest by getting
    }
}

android {
    compileSdkVersion(30)
    sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
    defaultConfig {
        minSdkVersion(21)
        targetSdkVersion(30)
    }
}

val packForXcode by tasks.creating(Sync::class) {
    group = "build"
    val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
    val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
    val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
    val framework = kotlin.targets.getByName<KotlinNativeTarget>(targetName).binaries.getFramework(mode)
    inputs.property("mode", mode)
    dependsOn(framework.linkTask)
    val targetDir = File(buildDir, "xcode-frameworks")
    from({ framework.outputDirectory })
    into(targetDir)
}

tasks.getByName("build").dependsOn(packForXcode)

注意:通过删除一部分一部分的配置,我似乎发现问题似乎是围绕着android配置本身,所以如果我删除android()部分

kotlin {
    android()
    ....

只要简单的jvm()就可以了

共有2个答案

冀越
2023-03-14

问题出在Canary或AGP7.0中。0:

  • IDE:Canary 11
  • 分配比例RL:6.8。2
  • 7.0。0-11

重要提示:确保文件是groovy或dsl

前提条件:这些配置必须在KMM项目的所有模块/子模块中完成,并且android{}块必须在kotlin{}块之前

对于Kotlin DSL:

android {
    configurations {
        create("androidTestApi")
        create("androidTestDebugApi")
        create("androidTestReleaseApi")
        create("testApi")
        create("testDebugApi")
        create("testReleaseApi")
    }
}
kotlin { }

对于Groovy:

android {
    configurations {
        androidTestApi {}
        androidTestDebugApi {}
        androidTestReleaseApi {}
        testApi {}
        testDebugApi {}
        testReleaseApi {}
    }
}
kotlin { }

此外,您应该使用AGP 7.0,因为以前的gradle版本会产生问题。

dependencies {
    implementation("com.android.tools.build:gradle:7.0.0-alpha11")
}

暂时最多使用测试版:

  • IDE:Beta 6

祝你好运

  • 问题/KT-43944
易成双
2023-03-14

您可以在共享模块Gradle文件中使用以下代码作为变通方法

android {
    configurations {
        create("androidTestApi")
        create("androidTestDebugApi")
        create("androidTestReleaseApi")
        create("testApi")
        create("testDebugApi")
        create("testReleaseApi")
    }
}

注意:这必须放在kotlin{}块之前

 类似资料:
  • 我得到这个构建错误: kotlin多平台项目中的kotlinOptions 奇怪的是,最初的海报据称只是通过修补他的androidx进口产品来解决这个问题。也许值得注意的是,我的所有六个“不能内联字节码”都与对新的多平台Okio库的方法调用相关联。但更有可能的是我自己的设置出现了错误,而不是杰克·沃顿帮做的事情。

  • IntelliJ IDEA 2018.2.3(Community Edition)中的Kotlin多平台模板在中依赖于JUnit 4.12,用于项目的JVM部分: 值得注意的是,我使用的是Gradle4.10(一些较旧的示例使用,它从Gradle4.6起就被弃用了)。关于如何设置的文档已经过时并且稀少: 如上所示,IntelliJ中构建的默认项目模板不使用JUnit 5。 JUnit团队提供了示例

  • 我尝试使用ShadowJar gradle插件将我的ktor应用程序打包到胖罐子中。但由于任务,我每次都得到几乎空的jar。它只包含清单(正确设置了主类)。 渐变配置(groovy):

  • 报告工作的groovy代码是: 这将如何翻译成Kotlin DSL?我尝试了许多变体,其中一些编译和运行,但不创建所需的输出。可运行的罐子。

  • 在KMM中是否可以有一些期望的抽象类?该项目是AndroidiOS 我希望有一些共享类,但部分方法应该是特定于平台的。 最好的方法是什么?也许是预期类和实际类的共享父类的某种组合? 例如, 据我所知,这样的例子是不可能的,因为预期的类应该是接口而不是抽象类。 对于两种平台,resetTimer方法可能相同。 不知怎么可能?