Android-Gradle-Bibliotheks-Plug-in für KMP einrichten

Das Gradle-Plug-in com.android.kotlin.multiplatform.library ist das offiziell unterstützte Tool zum Hinzufügen eines Android-Ziels zu einem Kotlin Multiplatform-Bibliotheksmodul (KMP) . Es vereinfacht die Projektkonfiguration, verbessert die Build-Leistung und bietet eine bessere Integration mit Android Studio.

Die Verwendung des Plug-ins com.android.library für die KMP-Entwicklung hängt von Android Gradle-Plug-in-APIs ab, die veraltet sind und für die im Android Gradle-Plug-in 9.0 und höher (4. Quartal 2025) eine Aktivierung erforderlich ist. Diese APIs werden voraussichtlich im Android Gradle-Plug-in 10.0 (zweite Hälfte 2026) entfernt.

Informationen zum Anwenden dieses Plug-ins finden Sie im Abschnitt Android-KMP-Plug-in anwenden. Wenn Sie von den Legacy-APIs migrieren müssen, lesen Sie die Migration Guide.

Wenn Sie Hilfe bei der Migration zu AGP 9.0 oder höher benötigen, können Sie den Agent-Skill verwenden, der von JetBrains für KMP-Apps erstellt wurde. Weitere Informationen zur Verwendung von Skills in Android Studio finden Sie unter Agent-Modus mit Skills erweitern. Beachten Sie, dass KI-Ergebnisse nicht vollständig vorhersehbar sind.

Wichtige Funktionen und Unterschiede

Das Android-KMP-Plug-in ist speziell auf KMP-Projekte zugeschnitten und unterscheidet sich in mehreren wichtigen Punkten vom Standard-Plug-in com.android.library:

  • Architektur mit einer einzigen Variante:Das Plug-in verwendet eine einzige Variante und unterstützt keine Produktvarianten und Build-Typen mehr. Dadurch wird die Konfiguration vereinfacht und die Build-Leistung verbessert.

  • Für KMP optimiert:Das Plug-in wurde für KMP-Bibliotheken entwickelt und konzentriert sich auf gemeinsamen Kotlin-Code und Interoperabilität. Es unterstützt keine Android-spezifischen nativen Builds, AIDL und RenderScript.

  • Tests standardmäßig deaktiviert:Sowohl Unit- als auch Gerätetests (Instrumentierungstests) sind standardmäßig deaktiviert, um die Build-Geschwindigkeit zu erhöhen. Sie können sie bei Bedarf aktivieren.

  • Keine Android-Erweiterung auf oberster Ebene:Die Konfiguration erfolgt mit einem android-Block in der Gradle-KMP-DSL, wodurch eine einheitliche KMP-Projektstruktur beibehalten wird. Es gibt keinen android-Erweiterungsblock auf oberster Ebene.

  • Aktivierung der Java-Kompilierung erforderlich:Die Java-Kompilierung ist standardmäßig deaktiviert. Verwenden Sie withJava() im android-Block, um sie zu aktivieren. Dadurch werden die Build-Zeiten verbessert, wenn keine Java-Kompilierung erforderlich ist.

Vorteile des Android-KMP-Bibliotheks-Plug-ins

Das Android-KMP-Plug-in bietet folgende Vorteile für KMP-Projekte:

  • Verbesserte Build-Leistung und ‑Stabilität:Es wurde für optimierte Build-Geschwindigkeiten und verbesserte Stabilität in KMP-Projekten entwickelt. Der Fokus auf KMP-Workflows trägt zu einem effizienteren und zuverlässigeren Build-Prozess bei.

  • Verbesserte IDE-Integration:Es bietet eine bessere Codevervollständigung, Navigation, Fehlerbehebung und insgesamt eine bessere Entwicklererfahrung bei der Arbeit mit KMP-Android-Bibliotheken.

  • Vereinfachte Projektkonfiguration:Das Plug-in vereinfacht die Konfiguration für KMP-Projekte, indem Android-spezifische Komplexitäten wie Build-Varianten entfernt werden. Dies führt zu übersichtlicheren und besser wartbaren Build-Dateien. Bisher konnte die Verwendung des Plug-ins com.android.library in KMP-Projekten zu verwirrenden Source-Set-Namen führen, z. B. androidAndroidTest. Diese Benennungskonvention war für Entwickler, die mit Standard-KMP-Projektstrukturen vertraut sind, weniger intuitiv.

Problemumgehungen für nicht unterstützte Funktionen

Im Vergleich zur KMP-Integration mit dem Plug-in com.android.library fehlen im Plug-in com.android.kotlin.multiplatform.library einige Funktionen. Hier sind die Problemumgehungen für die nicht unterstützten Funktionen:

  • Build-Varianten

    Build-Typen und Produktvarianten werden nicht unterstützt. Das liegt daran, dass das neue Plug-in eine Architektur mit einer einzigen Variante verwendet, wodurch die Konfiguration vereinfacht und die Build-Leistung verbessert wird.

    Wenn Sie Build-Varianten benötigen, empfehlen wir, ein separates eigenständiges Android-Bibliotheksmodul mit dem Plug-in com.android.library zu erstellen, Build-Typen und Produktvarianten in diesem Modul zu konfigurieren und es dann als Standardprojektabhängigkeit aus dem androidMain Source-Set Ihrer Kotlin Multiplatform-Bibliothek zu verwenden. Weitere Informationen finden Sie unter Android-Bibliothek erstellen und Build-Varianten konfigurieren.

  • Datenbindung und Ansichtbindung

    Dies sind Android-spezifische UI-Framework-Funktionen, die eng mit dem Android-Ansichtssystem und XML-Layouts verknüpft sind. Im neuen Android-KMP-Bibliotheks-Plug-in empfehlen wir, die UI mit einem plattformübergreifenden Framework wie Compose Multiplatform zu verarbeiten. Datenbindung und Ansichtbindung gelten als Implementierungsdetails einer endgültigen Android-App und nicht als freigebare Bibliothek.

  • Unterstützung für native Builds

    Das neue Plug-in konzentriert sich auf die Erstellung einer Standard-AAR-Datei für das Android-Ziel. Die Integration von nativem Code in Kotlin Multiplatform wird direkt von den eigenen nativen Zielen von KMP (z. B. androidNativeArm64 und androidNativeX86) und den C-Interop-Funktionen verarbeitet. Wenn Sie nativen C/C++-Code einfügen müssen, sollten Sie ihn als Teil eines gemeinsamen oder nativen Quellsatzes definieren und die C-Interop im kotlin-Block konfigurieren, anstatt den Android-spezifischen externalNativeBuild-Mechanismus zu verwenden.

    Wenn Sie alternativ Unterstützung für native Builds über externalNativeBuild benötigen, empfehlen wir, ein separates eigenständiges com.android.library-Modul zu erstellen, in dem Sie nativen Code einbinden können, und diese eigenständige Bibliothek aus dem androidMain-Source-Set Ihres Kotlin Multiplatform-Bibliotheksprojekts zu verwenden. Weitere Informationen finden Sie unter Android-Bibliothek erstellen und C- und C++-Code zum Projekt hinzufügen.

  • BuildConfig-Klasse

    Die Funktion BuildConfig ist in Umgebungen mit mehreren Varianten am nützlichsten. Da das neue Kotlin Multiplatform-Bibliotheks-Plug-in variantenunabhängig ist und keine Unterstützung für Build-Typen und Produktvarianten bietet, ist diese Funktion nicht implementiert. Alternativ empfehlen wir, das Plug-in BuildKonfig oder ähnliche Community-Lösungen zu verwenden, um Metadaten für alle Ziele zu generieren.

Vorbereitung

Damit Sie das Plug-in com.android.kotlin.multiplatform.library verwenden können, muss Ihr Projekt mit den folgenden Mindestversionen oder höher konfiguriert sein:

  • Android Gradle-Plug-in (AGP): 8.10.0
  • Kotlin Gradle-Plug-in (KGP): 2.0.0

Android-KMP-Plug-in auf ein vorhandenes Modul anwenden

So wenden Sie das Android-KMP-Plug-in auf ein vorhandenes KMP-Bibliotheksmodul an:

  1. Plug-ins im Versionskatalog deklarieren Öffnen Sie die TOML-Datei des Versionskatalogs (in der Regel gradle/libs.versions.toml) und fügen Sie den Abschnitt mit den Plug-in-Definitionen hinzu:

    # To check the version number of the latest Kotlin release, go to
    # https://kotlinlang.org/docs/releases.html
    
    [versions]
    androidGradlePlugin = "9.2.0"
    kotlin = "KOTLIN_VERSION"
    
    [plugins]
    kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
    android-kotlin-multiplatform-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "androidGradlePlugin" }
    
  2. Plug-in-Deklaration in der Build-Datei des Stammverzeichnisses anwenden Öffnen Sie die Datei build.gradle.kts im Stammverzeichnis Ihres Projekts. Fügen Sie die Plug-in-Aliasse mit apply false zum Block plugins hinzu. Dadurch sind die Plug-in-Aliasse für alle Unterprojekte verfügbar, ohne dass die Plug-in-Logik auf das Stammprojekt selbst angewendet wird.

    Kotlin

    // Root build.gradle.kts file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform) apply false
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library) apply false
    }

    Groovy

    // Root build.gradle file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform) apply false
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library) apply false
    }
  3. Plug-in in der Build-Datei eines KMP-Bibliotheksmoduls anwenden Öffnen Sie die Datei build.gradle.kts in Ihrem KMP-Bibliotheksmodul und wenden Sie das Plug-in oben in der Datei im Block plugins an:

    Kotlin

    // Module-specific build.gradle.kts file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform)
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library)
    }

    Groovy

    // Module-specific build.gradle file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform)
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library)
    }
  4. Android-KMP-Ziel konfigurieren Konfigurieren Sie den Kotlin Multiplatform-Block (kotlin), um das Android-Ziel zu definieren. Geben Sie im Block kotlin das Android-Ziel mit android an:

    Kotlin

    kotlin {
       android {
           namespace = "com.example.kmpfirstlib"
           compileSdk = 33
           minSdk = 24
    
           withJava() // enable java compilation support
           withHostTestBuilder {}.configure {}
           withDeviceTestBuilder {
               sourceSetTreeName = "test"
           }
    
           compilerOptions.configure {
               jvmTarget.set(
                   org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8
               )
           }
       }
    
       sourceSets {
           androidMain {
               dependencies {
                   // Add Android-specific dependencies here
               }
           }
           getByName("androidHostTest") {
               dependencies {
               }
           }
    
           getByName("androidDeviceTest") {
               dependencies {
               }
           }
       }
       // ... other targets (JVM, iOS, etc.) ...
    }

    Groovy

    kotlin {
       android {
           namespace = "com.example.kmpfirstlib"
           compileSdk = 33
           minSdk = 24
    
           withJava() // enable java compilation support
           withHostTestBuilder {}.configure {}
           withDeviceTestBuilder {
               it.sourceSetTreeName = "test"
           }
    
           compilerOptions.options.jvmTarget.set(
               org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8
           )
       }
    
       sourceSets {
           androidMain {
               dependencies {
               }
           }
           androidHostTest {
               dependencies {
               }
           }
           androidDeviceTest {
               dependencies {
               }
           }
       }
       // ... other targets (JVM, iOS, etc.) ...
    }
  5. Änderungen übernehmen Nachdem Sie das Plug-in angewendet und den Block kotlin konfiguriert haben, synchronisieren Sie Ihr Gradle-Projekt, um die Änderungen zu übernehmen.

Von Legacy-Plug-in migrieren

In dieser Anleitung wird beschrieben, wie Sie vom Legacy-Plug-in com.android.library zum Plug-in com.android.kotlin.multiplatform.library migrieren.

1. Quellen verschieben

Mit dem Legacy-Plug-in konnten Sie neben src/androidMain, src/androidHostTest und src/androidDeviceTest auch die Quellsätze src/main, src/test und src/androidTest verwenden. Das neue Plug-in verwendet nur die letztgenannten Quellverzeichnisse. Daher müssen Sie die Quellen von src/main nach src/androidMain, von src/test nach src/androidHostTest und von src/androidTest nach src/androidDeviceTest verschieben.

2. Abhängigkeiten deklarieren

Eine häufige Aufgabe ist das Deklarieren von Abhängigkeiten für Android-spezifische Quellsätze. Mit dem neuen Plug-in müssen diese explizit im Block sourceSets platziert werden, anders als beim zuvor verwendeten allgemeinen Block dependencies.

Android-KMP

Das neue Plug-in fördert eine übersichtlichere Struktur, indem Android-Abhängigkeiten im androidMain Source-Set gruppiert werden. Neben dem Haupt-Source-Set gibt es zwei Test-Source-Sets, die bei Bedarf erstellt werden: androidDeviceTest und androidHostTest. Weitere Informationen finden Sie unter Host- und Gerätetests konfigurieren.

// build.gradle.kts

kotlin {
    android {}
    //... other targets

    sourceSets {
        commonMain.dependencies {
            implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")
        }

        // Dependencies are now scoped to the specific Android source set
        androidMain.dependencies {
            implementation("androidx.appcompat:appcompat:1.7.0")
            implementation("com.google.android.material:material:1.11.0")
        }
    }
}

Die Quellsätze haben entsprechende Kotlin Kompilierungen mit den Namen main, deviceTest, und hostTest. Die Quellsätze und Kompilierungen können im Build-Skript so konfiguriert werden:

// build.gradle.kts

kotlin {
    android {
        compilations.getByName("deviceTest") {
            kotlinOptions.languageVersion = "2.0"
        }
    }
}

Legacy-Plug-in

Mit dem alten Plug-in konnten Sie Android-spezifische Abhängigkeiten im Abhängigkeitsblock auf oberster Ebene deklarieren, was in einem Multiplatform-Modul manchmal verwirrend sein konnte.

// build.gradle.kts

kotlin {
  androidTarget()
  //... other targets
}

// Dependencies for all source sets were often mixed in one block
dependencies {
  // Common dependencies
  commonMainImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")

  // Android-specific dependencies
  implementation("androidx.appcompat:appcompat:1.7.0")
  implementation("com.google.android.material:material:1.11.0")
}

3. Android-Ressourcen aktivieren

Die Unterstützung für Android-Ressourcen (res-Ordner) ist im neuen Plug-in standardmäßig nicht aktiviert, um die Build-Leistung zu optimieren. Sie müssen sie aktivieren, um sie zu verwenden. Diese Änderung trägt dazu bei, dass Projekte, für die keine Android-spezifischen Ressourcen erforderlich sind, nicht durch den damit verbundenen Build-Aufwand belastet werden.

Android-KMP

Sie müssen die Verarbeitung von Android-Ressourcen explizit aktivieren. Die Ressourcen sollten in src/androidMain/res platziert werden.

// build.gradle.kts

kotlin {
  android {
    // ...
    // Enable Android resource processing
    androidResources {
      enable = true
    }
  }
}

// Project Structure
// └── src
//     └── androidMain
//         └── res
//             ├── values
//             │   └── strings.xml
//             └── drawable
//                 └── icon.xml

Legacy-Plug-in

Die Ressourcenverarbeitung war standardmäßig aktiviert. Sie konnten sofort ein res-Verzeichnis in src/main hinzufügen und XML-Drawables, -Werte usw. hinzufügen.

// build.gradle.kts

android {
    namespace = "com.example.library"
    compileSdk = 34
    // No extra configuration was needed to enable resources.
}

// Project Structure
// └── src
//     └── main
//         └── res
//             ├── values
//             │   └── strings.xml
//             └── drawable
//                 └── icon.xml

4. Host- und Gerätetests konfigurieren

Eine wichtige Änderung im neuen Plug-in ist, dass Android-Host-seitige (Unit-) und geräteseitige (Instrumentierungs-)Tests standardmäßig deaktiviert sind. Sie müssen die Testquellsätze und ‑konfigurationen explizit aktivieren, während sie mit dem alten Plug-in automatisch erstellt wurden.

Dieses Aktivierungsmodell trägt dazu bei, dass Ihr Projekt schlank bleibt und nur die Build-Logik und Quellsätze enthält, die Sie aktiv verwenden.

Android-KMP

Im neuen Plug-in aktivieren und konfigurieren Sie Tests im Block kotlin.android. Dadurch wird die Einrichtung expliziter und es werden keine nicht verwendeten Testkomponenten erstellt. Der androidUnitTest Source-Set wird zu androidHostTest (das Testverzeichnis ändert sich von src/androidUnitTest zu src/androidHostTest) und androidInstrumentedTest wird zu androidDeviceTest (das Testverzeichnis ändert sich von src/androidInstrumentedTest zu src/androidDeviceTest).

// build.gradle.kts

kotlin {
  android {
    // ...

    // Opt-in to enable and configure host-side (unit) tests
    withHostTest {
      isIncludeAndroidResources = true
    }

    // Opt-in to enable and configure device-side (instrumented) tests
    withDeviceTest {
      instrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
      execution = "HOST"
    }
  }
}

// Project Structure (After Opt-in)
// └── src
//     ├── androidHostTest
//     └── androidDeviceTest

Legacy-Plug-in

Mit dem Plug-in com.android.library werden die Quellsätze androidUnitTest und androidInstrumentedTest standardmäßig erstellt. Sie konfigurieren ihr Verhalten im Block android, in der Regel mit der DSL testOptions.

// build.gradle.kts

android {
  defaultConfig {
    // Runner was configured in defaultConfig
    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
  }

  testOptions {
    // Configure unit tests (for the 'test' source set)
    unitTests.isIncludeAndroidResources = true

    // Configure device tests (for the 'androidTest' source set)
    execution = "HOST"
  }
}

// Project Structure (Defaults)
// └── src
//     ├── test
//     └── androidTest

5. Java-Quellkompilierung aktivieren

Wenn Ihre KMP-Bibliothek Java-Quellen für das Android-Ziel kompilieren muss, müssen Sie diese Funktion mit dem neuen Plug-in explizit aktivieren. Beachten Sie, dass dadurch die Kompilierung für Java-Dateien aktiviert wird, die sich direkt in Ihrem Projekt befinden, nicht für die Abhängigkeiten. Auch die Methode zum Festlegen der JVM-Zielversion des Java- und Kotlin-Compilers ändert sich.

Android-KMP

Sie müssen die Java-Kompilierung mit withJava() aktivieren. Das JVM-Ziel wird jetzt direkt im Block kotlin { android {} } konfiguriert, um die Einrichtung zu vereinheitlichen. Wenn Sie hier jvmTarget festlegen, gilt dies sowohl für die Kotlin- als auch für die Java-Kompilierung für das Android-Ziel.

// build.gradle.kts

kotlin {
  android {
    //  Opt-in to enable Java source compilation
    withJava()
    // Configure the JVM target for both Kotlin and Java sources
    compilerOptions {
      jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_1_8)
    }
  }
  // ...
}

// Project Structure:
// └── src
//     └── androidMain
//         ├── kotlin
//         │   └── com/example/MyKotlinClass.kt
//         └── java
//             └── com.example/MyJavaClass.java

Legacy-Plug-in

Die Java-Kompilierung war standardmäßig aktiviert. Das JVM-Ziel für Java- und Kotlin-Quellen wurde im Android-Block mit „compileOptions“ festgelegt.

// build.gradle.kts

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

kotlin {
  androidTarget {
    compilations.all {
      kotlinOptions.jvmTarget = "1.8"
    }
  }
}

6. Mit Build-Varianten über androidComponents interagieren

Die Erweiterung androidComponents ist weiterhin verfügbar, um programmatisch mit Build-Artefakten zu interagieren. Während ein Großteil der Variant API gleich bleibt, die neue AndroidKotlinMultiplatformVariant Schnittstelle ist eingeschränkter, da das Plug-in nur eine einzige Variante erzeugt.

Daher sind Eigenschaften im Zusammenhang mit Build-Typen und Produktvarianten nicht mehr für das Variantenobjekt verfügbar.

Android-KMP

Der Block onVariants wird jetzt nur einmal durchlaufen. Sie können weiterhin auf allgemeine Eigenschaften wie name und artifacts zugreifen, aber nicht auf Build-Typ-spezifische.

// build.gradle.kts

androidComponents {
  onVariants { variant ->
      val artifacts = variant.artifacts
  }
}

Legacy-Plug-in

Bei mehreren Varianten konnten Sie auf Build-Typ-spezifische Eigenschaften zugreifen, um Aufgaben zu konfigurieren.

// build.gradle.kts

androidComponents {
  onVariants(selector().withBuildType("release")) { variant ->
    // ...
  }
}

7. Varianten von Android-Bibliotheksabhängigkeiten auswählen

Ihre KMP-Bibliothek erzeugt eine einzige Variante für Android. Möglicherweise sind Sie jedoch von einer Standard-Android-Bibliothek (com.android.library) abhängig, die mehrere Varianten hat (z.B. free/paid-Produktvarianten). Es ist häufig erforderlich, zu steuern, wie Ihr Projekt eine Variante aus dieser Abhängigkeit auswählt.

Android-KMP

Das neue Plug-in zentralisiert und verdeutlicht diese Logik im Block kotlin.android.localDependencySelection. Dadurch wird viel klarer, welche Varianten externer Abhängigkeiten für Ihre KMP-Bibliothek mit einer einzigen Variante ausgewählt werden.

// build.gradle.kts
kotlin {
  android {
    localDependencySelection {
      // For dependencies with multiple build types, select 'debug' first, and 'release' in case 'debug' is missing
      selectBuildTypeFrom.set(listOf("debug", "release"))

      // For dependencies with a 'type' flavor dimension...
      productFlavorDimension("type") {
        // ...select the 'typeone' flavor.
        selectFrom.set(listOf("typeone"))
      }
    }
  }
}

Legacy-Plug-in

Sie haben Strategien zur Auswahl von Abhängigkeiten in den buildTypes and productFlavors Blöcken konfiguriert. Dabei wurde häufig missingDimensionStrategy verwendet, um eine Standardvariante für eine Dimension bereitzustellen, die Ihre Bibliothek nicht hatte, oder matchingFallbacks innerhalb einer bestimmten Variante, um eine Suchreihenfolge zu definieren.

Weitere Informationen zur API-Nutzung finden Sie unter Fehler bei der Übereinstimmung beheben.

8. Abhängigkeiten für die Compose-Vorschau

Normalerweise möchten wir, dass bestimmte Bibliotheken auf unsere lokale Entwicklungsumgebung beschränkt sind, damit interne Tools nicht in das endgültige veröffentlichte Artefakt gelangen. Das ist mit dem neuen KMP-Android-Plug-in eine Herausforderung, da es die Architektur mit Build-Typen entfernt, die verwendet wurde, um Entwicklungsabhängigkeiten vom Release-Code zu trennen.

Android-KMP

Wenn Sie eine Abhängigkeit nur für die lokale Entwicklung und das Testen hinzufügen möchten, fügen Sie sie direkt der Laufzeit-Classpath-Konfiguration (im Block dependencies auf oberster Ebene) der Haupt-Android-Kompilierung hinzu. Dadurch ist die Abhängigkeit zur Laufzeit verfügbar (z. B. für Tools wie die Compose-Vorschau), ist aber nicht Teil des Kompilierungs- Classpaths oder der veröffentlichten API Ihrer Bibliothek.

// build.gradle.kts
dependencies {
  "androidRuntimeClasspath"(libs.androidx.compose.ui.tooling)
}

Legacy-Plug-in

Für Kotlin Multiplatform-Projekte, die das Plug-in com.android.library für das Android-Ziel verwenden, sollte die Konfiguration debugImplementation verwendet werden. Dadurch wird die Abhängigkeit auf den Debug-Build-Typ beschränkt und verhindert, dass sie in die Release-Variante der Bibliothek aufgenommen wird, die von den Nutzern verwendet wird.

// build.gradle.kts
dependencies {
  debugImplementation(libs.androidx.compose.ui.tooling)
}

9. JVM-Ziel für das KMP-Android-Ziel konfigurieren

Das KMP-Android-Plug-in legt das JVM-Ziel mit android.compilerOptions.jvmTarget fest, das sowohl für Java als auch für Kotlin gilt. Dadurch wird die Konfiguration im Vergleich zu den separaten Blöcken compileOptions und kotlinOptions in reinen Android-Projekten vereinfacht.

Android-KMP

Wenn Sie mit einem Kotlin Multiplatform-Projekt (KMP) arbeiten, das ein Android-Ziel enthält, haben Sie mehrere Möglichkeiten, die JVM-Zielversion für den Kotlin- und den Java-Compiler zu konfigurieren. Es ist wichtig, den Umfang und die Hierarchie dieser Konfigurationen zu verstehen, um die Bytecode-Kompatibilität Ihres Projekts zu verwalten.

Hier sind die drei wichtigsten Möglichkeiten, das JVM-Ziel festzulegen, sortiert nach Priorität (niedrigste bis höchste). JVM-Zielwerte mit höherer Priorität gelten für eine kleinere Teilmenge der konfigurierten Ziele und überschreiben Werte mit niedrigerer Priorität. Das bedeutet, dass Sie verschiedene JVM-Versionen für verschiedene Ziele und Kompilierungen innerhalb von Zielen in Ihrem Projekt festlegen können.

Kotlin-Toolchain verwenden (niedrigste Priorität)

Die allgemeinste Möglichkeit, das JVM-Ziel festzulegen, besteht darin, die Toolchain im Block kotlin Ihrer Datei build.gradle.kts anzugeben. Mit diesem Ansatz wird das Ziel für Kotlin- und Java-Kompilierungsaufgaben für alle JVM-basierten Ziele in Ihrem Projekt festgelegt, einschließlich Android.

// build.gradle.kts
kotlin {
    jvmToolchain(21)
}

Bei dieser Konfiguration wird sowohl kotlinc als auch javac auf JVM 21 ausgerichtet. So können Sie eine einheitliche Baseline für Ihr gesamtes Projekt festlegen.

Compileroptionen auf Android-Zielebene verwenden (mittlere Priorität)

Sie können das JVM-Ziel speziell für das Android-KMP-Ziel im Block android angeben. Diese Einstellung überschreibt die projektweite jvmToolchain-Konfiguration und gilt für alle Android-Kompilierungen.

// build.gradle.kts
kotlin {
    android {
        compilerOptions {
            jvmTarget.set(JvmTarget.JVM_11)
        }
    }
}

In diesem Fall wird der Kotlin- und Java-Code des Android-Ziels auf JVM 11 kompiliert, auch wenn eine andere Version für jvmToolchain festgelegt ist.

Compileroptionen auf Kompilierungsebene verwenden (höchste Priorität)

Für die detaillierteste Steuerung können Sie Compileroptionen pro Kompilierung konfigurieren (z. B. nur für androidMain oder androidHostTest). Das ist nützlich, wenn für eine bestimmte Kompilierung eine andere JVM-Version verwendet werden muss. Diese Einstellung überschreibt sowohl die Kotlin-Toolchain als auch die Optionen auf Android-Zielebene.

// build.gradle.kts
kotlin {
    android {
        compilations.all {
            compileTaskProvider.configure {
                compilerOptions.jvmTarget.set(JvmTarget.JVM_11)
            }
        }
    }
}

Mit dieser Konfiguration wird sichergestellt, dass alle Kompilierungen innerhalb des Android-Ziels JVM 11 verwenden, wodurch eine detaillierte Steuerung möglich ist.

Legacy-Plug-in

In einem KMP-Projekt, das das Standard-Android-Bibliotheks-Plug-in (com.android.library) verwendet, unterscheidet sich die Konfiguration leicht von der Konfiguration mit dem KMP-Android-Plug-in (ist aber konzeptionell ähnlich).

Kotlin-Toolchain verwenden

Die Methode kotlin.jvmToolchain() funktioniert identisch und legt sourceCompatibility und targetCompatibility für Java sowie jvmTarget für Kotlin fest. Wir empfehlen diesen Ansatz.

// build.gradle.kts
kotlin {
    jvmToolchain(21)
}

compileOptions und kotlinOptions

Wenn Sie keine Kotlin-Toolchain verwenden, müssen Sie die JVM-Ziele mit separaten Blöcken für Java und Kotlin konfigurieren.

// build.gradle.kts
android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }

    kotlinOptions {
        jvmTarget = "11"
    }
}

10. Consumer-Keep-Regeln veröffentlichen

Wenn Ihre KMP-Bibliothek Consumer-Keep-Regeln (z. B. ProGuard-Regeln für R8) für ihre Nutzer bereitstellen muss, müssen Sie die Veröffentlichung im neuen Plug-in explizit aktivieren. Bisher wurden Consumer-Keep-Regeln standardmäßig veröffentlicht, wenn sie angegeben wurden.

Android-KMP

Mit dem neuen Plug-in müssen Sie optimization.consumerKeepRules.publish = true festlegen und Regeldateien im consumerKeepRules Block angeben, um Consumer-Keep-Regeln zu veröffentlichen.

// build.gradle.kts
kotlin {
  android {
    optimization {
      consumerKeepRules.apply {
        publish = true
        file("consumer-proguard-rules.pro")
      }
    }
  }
}

Legacy-Plug-in

Mit com.android.library werden alle Regeldateien, die mit consumerProguardFiles in android.defaultConfig angegeben wurden, standardmäßig in den Artefakten der Bibliothek veröffentlicht.

// build.gradle.kts
android {
  defaultConfig {
    consumerProguardFiles("consumer-proguard-rules.pro")
  }
}

11. Bibliothek in Maven veröffentlichen

Wenn Sie Ihre KMP-Bibliothek in Maven veröffentlichen möchten, damit sie von anderen Projekten verwendet werden kann, unterscheidet sich der Prozess je nachdem, ob Sie das neue Android-KMP-Plug-in oder das Legacy-Plug-in verwenden.

Android-KMP

Das Plug-in com.android.kotlin.multiplatform.library ist in die Standardmechanismen für die Veröffentlichung von Kotlin Multiplatform eingebunden. Über den Standardprozess für die Veröffentlichung von KMP-Bibliotheken hinaus sind keine Android-spezifischen Schritte erforderlich.

Folgen Sie der offiziellen Dokumentation von JetBrains, um Ihre Bibliothek zu veröffentlichen: Set up publishing for a multiplatform library.

Legacy-Plug-in

Wenn Sie com.android.library für das Android-Ziel in einem KMP-Projekt verwenden, müssen Sie der Standardanleitung für die Veröffentlichung von Android-Bibliotheken folgen, um das Android-spezifische Artefakt (.aar) vorzubereiten und zu veröffentlichen.

Eine ausführliche Anleitung finden Sie unter Bibliothek für die Veröffentlichung vorbereiten.

Plug-in-API-Referenz

Das neue Plug-in hat eine andere API-Oberfläche als com.android.library. Ausführliche Informationen zur neuen DSL und zu den neuen Schnittstellen finden Sie in den API-Referenzen:

Bekannte Probleme im Android-KMP-Bibliotheks-Plug-in

Die folgenden bekannten Probleme können auftreten, wenn Sie das neue Plug-in com.android.kotlin.multiplatform.library anwenden: