DatLag
DatLag

Reputation: 150

Kotlin Multiplatform build failure due to android target

I am creating a Kotlin Multiplatform library with Android support.

When I try to build with gradle I get an error (./gradlew build --warning-mode all).

Either this:

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

Or that:

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

The first right after indexing and the second when I do ./gradlew clean

However, there is this dependency in any case since I have already created Android apps based on that. I have also tried Target 28 and an RC version of 30 (since 30 has not yet been officially released, but I have still created apps)

My structure of the gradle files is like this:

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 method:

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

Upvotes: 0

Views: 1442

Answers (1)

Sam Hill
Sam Hill

Reputation: 88

In lib.build.gradle.kts you should use the compileSdkVersion(29) syntax rather than setting a string. You can see in the source for these extensions that the behavior is different if you call the string version.

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

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

The when passing an int it will append "android-" for you. So you could do compileSdkVersion = "android-29" if you wanted, but just passing the int is easier

Upvotes: 1

Related Questions