由于Android目标,Kotlin Multiplatform构建失败

时间:2020-07-23 22:58:13

标签: android kotlin gradle gradle-kotlin-dsl kotlin-multiplatform

我正在创建具有Android支持的Kotlin Multiplatform库。

当我尝试使用gradle构建时,出现错误(./gradlew build --warning-mode all)。

要么:

Could not determine the dependencies of task ':lib:compileDebugAidl'.
> Failed to find target with hash string '29' in: /home/user/Android/Sdk

或者那个:

Could not determine the dependencies of task ':lib:verifyReleaseResources'.
> Failed to find target with hash string '29' in: /home/user/Android/Sdk

索引建立后的第一条权利,而我做./gradlew clean时的第二条权利

但是,无论如何都存在这种依赖关系,因为我已经基于此创建了Android应用程序。 我还尝试了Target 28和RC版本30(因为30尚未正式发布,但我仍然创建了应用)

我的gradle文件结构如下:

root
|-build.gradle.kts
|-settings.gradle.kts
|-gradlew
|-gradlew.bat
|-gradle
   |-wrapper
      |-gradle-wrapper.jar
      |-gradle-wrapper.properties
|-lib
   |-build.gradle.kts

settings.gradle.kts:

rootProject.name = "Library"

include(":lib")

root build.gradle.kts:

buildscript {
    repositories {
        addRepos()
        maven(uri("https://dl.bintray.com/kotlin/kotlin-eap")) {
            metadataSources {
                gradleMetadata()
                mavenPom()
            }
        }
    }

    dependencies {
        classpath("com.android.tools.build:gradle:4.1.0-beta04")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72")
    }
}

allprojects {
    repositories {
        addRepos()
        maven(uri("https://dl.bintray.com/kotlin/kotlin-eap")) {
            metadataSources {
                gradleMetadata()
                mavenPom()
            }
        }
    }
}

lib build.gradle.kts:

plugins {
    id("com.android.library")
    kotlin("multiplatform")
    id("maven-publish")
}
group = "de.datlag"
version = "1.0"

android {
    compileSdkVersion = 29.toString()
    buildToolsVersion = "29.0.3"

    defaultConfig {
        targetSdkVersion(29)
        versionCode = 1
        versionName = "1.0"
    }

    buildTypes {
        val debug by getting {
            isMinifyEnabled = false
            isDebuggable = true
            isShrinkResources = false
        }

        val release by getting {
            isMinifyEnabled = false
            isDebuggable = false
            isShrinkResources = false
        }
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

repositories {
    addRepos()
}

kotlin {
    jvm {
        compilations.all {
            kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString()
        }
    }
    js {
        browser()
        nodejs()
    }
    android {
        publishAllLibraryVariants()
    }
    val hostOs = System.getProperty("os.name")
    val isMingwX64 = hostOs.startsWith("Windows")
    val nativeTarget = when {
        hostOs == "Mac OS X" -> macosX64("native")
        hostOs == "Linux" -> linuxX64("native")
        isMingwX64 -> mingwX64("native")
        else -> throw GradleException("Host OS is not supported in Kotlin/Native.")
    }
    sourceSets {
        val commonMain by getting {
            dependencies {
                implementation(kotlin("stdlib-common"))
            }
        }
        val commonTest by getting {
            dependencies {
                implementation(kotlin("test-common"))
                implementation(kotlin("test-annotations-common"))
            }
        }
        val jvmMain by getting {
            dependencies {
                implementation(kotlin("stdlib-jdk8"))
            }
        }
        val jvmTest by getting {
            dependencies {
                implementation(kotlin("test"))
                implementation(kotlin("test-junit"))
            }
        }
        val androidMain by getting {
            dependsOn(jvmMain)
        }
        val androidTest by getting {
            dependsOn(jvmTest)
        }
        val jsMain by getting {
            dependencies {
                implementation(kotlin("stdlib-js"))
            }
        }
        val jsTest by getting {
            dependencies {
                implementation(kotlin("test-js"))
            }
        }
        val nativeMain by getting { }
        val nativeTest by getting { }
    }
}

addRepos方法:

fun RepositoryHandler.addRepos() {
    mavenLocal {
        metadataSources {
            gradleMetadata()
            mavenPom()
        }
    }
    mavenCentral {
        metadataSources {
            gradleMetadata()
            mavenPom()
        }
    }
    jcenter {
        metadataSources {
            gradleMetadata()
            mavenPom()
        }
    }
    google {
        metadataSources {
            gradleMetadata()
            mavenPom()
        }
    }
    gradlePluginPortal()
}

1 个答案:

答案 0 :(得分:1)

在lib.build.gradle.kts中,应使用compileSdkVersion(29)语法而不是设置字符串。您可以在这些扩展的源代码中看到,如果您调用字符串版本,则行为会有所不同。

/** @see #getCompileSdkVersion() */
public void compileSdkVersion(String version) {
    checkWritability();
    this.target = version;
}

/** @see #getCompileSdkVersion() */
public void compileSdkVersion(int apiLevel) {
    compileSdkVersion("android-" + apiLevel);
}

当传递一个int时,它将为您附加“ android-”。因此,您可以根据需要执行compileSdkVersion = "android-29",但仅通过int会更容易

相关问题