Konfigurowanie wtyczki biblioteki Androida do obsługi Gradle na potrzeby KMP

Wtyczka com.android.kotlin.multiplatform.library do obsługi Gradle to oficjalnie obsługiwane narzędzie do dodawania celu Androida do modułu biblioteki Kotlin Multiplatform (KMP). Upraszcza konfigurację projektu, poprawia wydajność kompilacji i zapewnia lepszą integrację z Android Studio.

Używanie wtyczki com.android.library do programowania w KMP zależy od interfejsów API wtyczki Androida do obsługi Gradle, które zostały wycofane i wymagają akceptacji we wtyczce Androida do obsługi Gradle w wersji 9.0 i nowszych (IV kwartał 2025 r.). Te interfejsy API zostaną usunięte we wtyczce Androida do obsługi Gradle w wersji 10.0 (w drugiej połowie 2026 r.).

Aby zastosować tę wtyczkę, zapoznaj się z sekcją Stosowanie wtyczki Android-KMP. Jeśli chcesz przejść ze starszych interfejsów API, zapoznaj się z przewodnikiem po migracji.

Aby uzyskać pomoc dotyczącą migracji do AGP 9.0 lub nowszej wersji, możesz użyć umiejętności agenta utworzonej przez JetBrains dla aplikacji KMP. Więcej informacji o korzystaniu z umiejętności w Android Studio znajdziesz w artykule Rozszerzanie trybu agenta za pomocą umiejętności. Pamiętaj, że wyniki AI nie są całkowicie przewidywalne.

Najważniejsze funkcje i różnice

Wtyczka Android-KMP jest dostosowana specjalnie do projektów KMP i różni się od standardowej wtyczki com.android.library pod kilkoma kluczowymi względami:

  • Architektura z jednym wariantem: wtyczka używa jednego wariantu, co eliminuje obsługę wariantów usługi i typów kompilacji, upraszczając konfigurację i zwiększając wydajność kompilacji.

  • Optymalizacja pod kątem KMP: wtyczka jest przeznaczona do bibliotek KMP i skupia się na udostępnianym kodzie Kotlin oraz interoperacyjności, pomijając obsługę kompilacji natywnych na Androida, AIDL i RenderScript.

  • Testy domyślnie wyłączone: testy jednostkowe i testy na urządzeniu (z instrumentacją) są domyślnie wyłączone, aby przyspieszyć kompilację. W razie potrzeby możesz je włączyć.

  • Brak rozszerzenia Androida najwyższego poziomu: konfiguracja jest obsługiwana za pomocą bloku android w języku DSL KMP Gradle, co pozwala zachować spójną strukturę projektu KMP. Brak bloku rozszerzenia android najwyższego poziomu.

  • Kompilacja Java z akceptacją: kompilacja Java jest domyślnie wyłączona. Aby go włączyć, użyj withJava() w bloku android. Skraca to czas kompilacji, gdy kompilacja Javy nie jest potrzebna.

Zalety wtyczki biblioteki Android-KMP

Wtyczka Android-KMP zapewnia te korzyści w przypadku projektów KMP:

  • Lepsza wydajność i stabilność kompilacji: narzędzie zostało zaprojektowane pod kątem optymalizacji szybkości kompilacji i zwiększenia stabilności w projektach KMP. Skupienie się na przepływach pracy KMP przyczynia się do bardziej wydajnego i niezawodnego procesu kompilacji.

  • Ulepszona integracja z IDE: zapewnia lepsze uzupełnianie kodu, nawigację, debugowanie i ogólne wrażenia dewelopera podczas pracy z bibliotekami KMP na Androida.

  • Uproszczona konfiguracja projektu: wtyczka upraszcza konfigurację projektów KMP, usuwając złożone elementy związane z Androidem, takie jak warianty kompilacji. Dzięki temu pliki kompilacji są bardziej przejrzyste i łatwiejsze w utrzymaniu. Wcześniej użycie wtyczki com.android.library w projekcie KMP mogło powodować tworzenie mylących nazw zbiorów źródeł, takich jak androidAndroidTest. Ta konwencja nazewnictwa była mniej intuicyjna dla deweloperów znających standardowe struktury projektów KMP.

Obejścia nieobsługiwanych funkcji

W porównaniu z integracją KMP z wtyczką com.android.library wtyczka com.android.kotlin.multiplatform.library nie ma niektórych funkcji. Oto sposoby obejścia problemu z nieobsługiwanymi funkcjami:

  • Warianty kompilacji

    Typy kompilacji i warianty usługi nie są obsługiwane. Wynika to z tego, że nowa wtyczka używa architektury z jednym wariantem, co upraszcza konfigurację i poprawia wydajność kompilacji.

    Jeśli potrzebujesz wariantów kompilacji, zalecamy utworzenie osobnego samodzielnego modułu biblioteki Androida za pomocą wtyczki com.android.library, skonfigurowanie typów kompilacji i wariantów usługi w tym module, a następnie użycie go jako standardowej zależności projektu ze zbioru źródeł androidMain biblioteki wieloplatformowej Kotlin. Więcej informacji znajdziesz w artykułach Tworzenie biblioteki Androida i Konfigurowanie wariantów kompilacji.

  • Wiązanie danych i wiązanie widoku

    Są to funkcje platformy interfejsu na Androida, które są ściśle powiązane z systemem widoków Androida i układami XML. W przypadku nowej wtyczki biblioteki Android-KMP zalecamy obsługę interfejsu za pomocą platformy wieloplatformowej, takiej jak Compose Multiplatform. Wiązanie danych i wiązanie widoku są uważane za szczegóły implementacji ostatecznej aplikacji na Androida, a nie biblioteki, którą można udostępniać.

  • Obsługa kompilacji natywnej

    Nowa wtyczka koncentruje się na tworzeniu standardowego pliku AAR dla środowiska docelowego Androida. Integracja kodu natywnego w Kotlin Multiplatform jest obsługiwana bezpośrednio przez własne cele natywne KMP (takie jak androidNativeArm64 i androidNativeX86) oraz możliwości współdziałania z C. Jeśli chcesz dołączyć natywny kod C/C++, zdefiniuj go jako część wspólnego lub natywnego zbioru źródeł i skonfiguruj współdziałanie z C w bloku kotlin, zamiast używać mechanizmu externalNativeBuild typowego dla Androida.

    Jeśli potrzebujesz obsługi kompilacji natywnej za pomocą externalNativeBuild, zalecamy utworzenie osobnego samodzielnego modułu com.android.library, w którym możesz zintegrować kod natywny, i wykorzystanie tej samodzielnej biblioteki ze zbioru źródeł androidMain projektu biblioteki Kotlin Multiplatform. Więcej informacji znajdziesz w artykułach Tworzenie biblioteki Androida i Dodawanie kodu C i C++ do projektu.

  • BuildConfig klasa

    Funkcja BuildConfig jest najbardziej przydatna w środowiskach z wieloma wariantami. Nowa wtyczka biblioteki Kotlin Multiplatform nie jest zależna od wariantów i nie obsługuje typów kompilacji ani wariantów usługi, dlatego ta funkcja nie jest zaimplementowana. Zamiast tego zalecamy użycie wtyczki BuildKonfig lub podobnych rozwiązań społecznościowych do generowania metadanych dla wszystkich środowisk docelowych.

Wymagania wstępne

Aby używać wtyczki com.android.kotlin.multiplatform.library, musisz skonfigurować projekt z tymi minimalnymi wersjami lub nowszymi:

  • Wtyczka Androida do obsługi Gradle (AGP): 8.10.0
  • Wtyczka Kotlin Gradle (KGP): 2.0.0

Stosowanie wtyczki Android-KMP do istniejącego modułu

Aby zastosować wtyczkę Android-KMP do istniejącego modułu biblioteki KMP, wykonaj te czynności:

  1. Zadeklaruj wtyczki w katalogu wersji. Otwórz plik TOML katalogu wersji (zwykle gradle/libs.versions.toml) i dodaj sekcję definicji wtyczek:

    # To check the version number of the latest Kotlin release, go to
    # https://kotlinlang.org/docs/releases.html
    
    [versions]
    androidGradlePlugin = "9.4.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. Zastosuj deklarację wtyczki w głównym pliku kompilacji. Otwórz plik build.gradle.kts znajdujący się w katalogu głównym projektu. Dodaj aliasy wtyczki do bloku plugins za pomocą apply false. Dzięki temu aliasy wtyczki są dostępne dla wszystkich podprojektów bez stosowania logiki wtyczki do samego projektu głównego.

    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
    }

    Dynamiczny

    // 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. Zastosuj wtyczkę w pliku kompilacji modułu biblioteki KMP. Otwórz plik build.gradle.kts w module biblioteki KMP i zastosuj wtyczkę u góry pliku w bloku plugins:

    Kotlin

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

    Dynamiczny

    // Module-specific build.gradle file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform)
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library)
    }
  4. Skonfiguruj środowisko docelowe KMP na Androidzie. Skonfiguruj blok Kotlin Multiplatform (kotlin), aby zdefiniować środowisko docelowe Androida. W bloku kotlin określ środowisko docelowe Androida za pomocą android:

    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.) ...
    }

    Dynamiczny

    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. Zastosuj zmiany. Po zastosowaniu wtyczki i skonfigurowaniu bloku kotlin zsynchronizuj projekt Gradle, aby zastosować zmiany.

Migracja ze starszej wtyczki

Ten przewodnik pomoże Ci przejść ze starszej wtyczki com.android.library na wtyczkę com.android.kotlin.multiplatform.library.

1. Przenoszenie źródeł

Starsza wtyczka umożliwiała korzystanie ze zbiorów źródeł src/main, src/test i src/androidTest, a także src/androidMain, src/androidHostTest i src/androidDeviceTest. Nowa wtyczka używa tylko tych drugich katalogów źródłowych, więc musisz przenieść źródła z src/main do src/androidMain, z src/test do src/androidHostTest i z src/androidTest do src/androidDeviceTest.

2. Konfigurowanie niestandardowych katalogów źródeł i zasobów

Jeśli masz źródła lub zasoby w niestandardowych katalogach, wcześniej skonfigurowano je za pomocą bloku sourceSets. W nowej wtyczce użyj rozszerzenia androidComponents, aby dodać do wariantu katalogi źródłowe statyczne.

Pamiętaj, że w przypadku nowej wtyczki metoda addStaticSourceDirectory dodaje katalog do istniejącej listy katalogów źródłowych. W przypadku starszej wtyczki metoda setSrcDirs zastępuje listę, a metoda srcDir dodaje do niej elementy.

Android-KMP

W nowej wtyczce użyj bloku onVariants, aby wejść w interakcję ze źródłami wariantu.

// build.gradle.kts

androidComponents {
    onVariants { variant ->
        // Add a directory for Kotlin sources
        variant.sources.kotlin?.addStaticSourceDirectory("other/kotlin")

        // Add a directory for Android assets
        variant.sources.assets?.addStaticSourceDirectory("other/assets")
    }
}

Starsza wersja wtyczki

W przypadku wtyczki com.android.library blok sourceSets służył do ustawiania lub dodawania katalogów źródłowych.

// build.gradle.kts

android {
    sourceSets {
        getByName("main") {
            // Replaces the directory for Kotlin sources.
            kotlin.setSrcDirs(listOf("other/kotlin"))

            // Appends a directory for assets.
            assets.srcDir("other/assets")
        }
    }
}

3. Deklarowanie zależności

Częstym zadaniem jest deklarowanie zależności dla zbiorów źródeł związanych z Androidem. Nowa wtyczka wymaga, aby były one umieszczone w bloku sourceSets, a nie w ogólnym bloku dependencies, który był używany wcześniej.

Android-KMP

Nowa wtyczka promuje czystszą strukturę, grupując zależności Androida w zbiorze źródeł androidMain. Oprócz głównego zbioru źródeł istnieją 2 zbiory źródeł testowych, które są tworzone na żądanie: androidDeviceTest i androidHostTest (więcej informacji znajdziesz w artykule o konfigurowaniu testów hosta i urządzenia).

// 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")
        }
    }
}

Zbiory źródeł mają odpowiadające im kompilacje Kotlina o nazwach main, deviceTest i hostTest. Zbiory źródeł i kompilacje można skonfigurować w skrypcie kompilacji w ten sposób:

// build.gradle.kts

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

Starsza wersja wtyczki

W starszej wtyczce można było zadeklarować zależności związane z Androidem w bloku zależności najwyższego poziomu, co czasami mogło być mylące w przypadku modułu wieloplatformowego.

// 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")
}

4. Włączanie zasobów Androida

Obsługa zasobów Androida (foldery res) nie jest domyślnie włączona w nowej wtyczce, aby zoptymalizować wydajność kompilacji. Aby korzystać z tej funkcji, musisz wyrazić na nią zgodę. Dzięki tej zmianie projekty, które nie wymagają zasobów związanych z Androidem, nie są obciążone dodatkowymi kosztami kompilacji.

Android-KMP

Musisz bezpośrednio włączyć przetwarzanie zasobów Androida. Zasoby powinny być umieszczone w src/androidMain/res.

// build.gradle.kts

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

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

Starsza wersja wtyczki

Przetwarzanie zasobów było domyślnie włączone. Możesz od razu dodać katalog res w src/main i zacząć dodawać obiekty rysunkowe XML, wartości itp.

// 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

5. Konfigurowanie testów hosta i urządzenia

Domyślnie nowa wtyczka wyłącza testy po stronie hosta (jednostkowe) i po stronie urządzenia (z instrumentacją) na Androidzie. Musisz wyraźnie wyrazić zgodę na tworzenie testowych zbiorów źródeł i konfiguracji, podczas gdy starsza wtyczka tworzyła je automatycznie.

Ten model akceptacji pomaga upewnić się, że projekt pozostaje prosty i zawiera tylko logikę kompilacji i zbiory źródeł, których aktywnie używasz.

Android-KMP

W przypadku nowej wtyczki testy włącza się i konfiguruje w bloku kotlin.android. Dzięki temu konfiguracja jest bardziej przejrzysta i nie tworzy nieużywanych komponentów testowych. Zbiór źródeł androidUnitTest staje się zbiorem androidHostTest (katalog testowy zmienia się z src/androidUnitTest na src/androidHostTest), a zbiór androidInstrumentedTest staje się zbiorem androidDeviceTest (katalog testowy zmienia się z src/androidInstrumentedTest na 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

Starsza wersja wtyczki

W przypadku wtyczki com.android.library zbiory źródeł androidUnitTest i androidInstrumentedTest są tworzone domyślnie. Ich zachowanie konfigurujesz w bloku android, zwykle za pomocą 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

6. Włącz kompilację źródła Java

Jeśli biblioteka KMP musi skompilować źródła Javy dla celu Androida, musisz wyraźnie włączyć tę funkcję za pomocą nowej wtyczki. Pamiętaj, że umożliwia to kompilację plików Java znajdujących się bezpośrednio w projekcie, a nie jego zależności. Zmienia się też metoda ustawiania docelowej wersji JVM kompilatora Javy i Kotlina.

Android-KMP

Musisz wyrazić zgodę na kompilację w języku Java, wywołując withJava(). Cel JVM jest teraz konfigurowany bezpośrednio w bloku kotlin { android {} }, co zapewnia bardziej ujednoliconą konfigurację. Ustawienie jvmTarget tutaj dotyczy kompilacji zarówno w Kotlin, jak i w Java dla środowiska docelowego Androida.

// 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

Starsza wersja wtyczki

Kompilacja Javy była domyślnie włączona. Cel JVM dla źródeł Java i Kotlin został ustawiony w bloku android za pomocą compileOptions.

// build.gradle.kts

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

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

7. Interakcja z wariantami kompilacji za pomocą androidComponents

Rozszerzenie androidComponents jest nadal dostępne do interakcji z artefaktami kompilacji w sposób zautomatyzowany. Chociaż interfejs API Variant pozostaje w dużej mierze taki sam, nowy interfejs AndroidKotlinMultiplatformVariant jest bardziej ograniczony, ponieważ wtyczka generuje tylko 1 wariant.

W związku z tym właściwości związane z typami kompilacji i wariantami usługi nie są już dostępne w obiekcie wariantu.

Android-KMP

Blok onVariants wykonuje teraz iterację po jednym wariancie. Nadal możesz uzyskiwać dostęp do typowych właściwości, takich jak name i artifacts, ale nie do właściwości związanych z typem kompilacji.

// build.gradle.kts

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

Starsza wersja wtyczki

W przypadku wielu wariantów możesz uzyskać dostęp do właściwości związanych z typem kompilacji, aby skonfigurować zadania.

// build.gradle.kts

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

8. Wybieranie wariantów zależności biblioteki Androida

Biblioteka KMP tworzy jeden wariant na Androida. Możesz jednak korzystać ze standardowej biblioteki Androida (com.android.library), która ma wiele wariantów (np. free/paid wariantów usługi). Często trzeba kontrolować sposób, w jaki projekt wybiera wariant z tej zależności.

Android-KMP

Nowa wtyczka centralizuje i wyjaśnia tę logikę w bloku kotlin.android.localDependencySelection. Dzięki temu znacznie łatwiej będzie określić, które warianty zależności zewnętrznych zostaną wybrane dla biblioteki KMP z jednym wariantem.

// 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"))
      }
    }
  }
}

Starsza wersja wtyczki

Strategie wyboru zależności zostały skonfigurowane w blokach buildTypes and productFlavors. Często wiązało się to z użyciem missingDimensionStrategy, aby zapewnić domyślną wersję dla wymiaru, którego nie było w bibliotece, lub matchingFallbacks w ramach konkretnej wersji, aby zdefiniować kolejność wyszukiwania.

Więcej informacji o korzystaniu z interfejsu API znajdziesz w artykule Rozwiązywanie błędów dopasowania.

9. Dodawanie zależności podglądu Compose

Zwykle chcemy, aby określone biblioteki były ograniczone do naszego lokalnego środowiska programistycznego, aby zapobiec wyciekowi narzędzi wewnętrznych do ostatecznego opublikowanego artefaktu. W przypadku nowej wtyczki KMP do Androida stanowi to wyzwanie, ponieważ usuwa ona architekturę typu kompilacji używaną do oddzielania zależności programistycznych od kodu wersji.

Android-KMP

Aby dodać zależność tylko na potrzeby lokalnego programowania i testowania, dodaj ją bezpośrednio do konfiguracji ścieżki klasy środowiska wykonawczego (w bloku dependencies najwyższego poziomu) głównej kompilacji Androida. Dzięki temu zależność jest dostępna w czasie działania (np. w przypadku narzędzi takich jak Compose Preview), ale nie jest częścią ścieżki klasy kompilacji ani opublikowanego interfejsu API biblioteki.

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

Starsza wersja wtyczki

Projekty Kotlin Multiplatform, które używają wtyczki com.android.library dla Androida, powinny używać konfiguracji debugImplementation, która ogranicza zależność do typu kompilacji do debugowania i zapobiega jej uwzględnieniu w wariancie wersji biblioteki używanej przez klientów.

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

10. Konfigurowanie środowiska docelowego JVM dla środowiska docelowego KMP na Androidzie

Wtyczka KMP na Androida ustawia środowisko docelowe JVM za pomocą android.compilerOptions.jvmTarget, co dotyczy zarówno Javy, jak i Kotlina, upraszczając konfigurację w porównaniu z osobnymi blokami compileOptions i kotlinOptions w projektach czysto androidowych.

Android-KMP

Podczas pracy nad projektem Kotlin Multiplatform (KMP), który zawiera środowisko docelowe Androida, masz kilka sposobów na skonfigurowanie wersji docelowej JVM zarówno dla kompilatora Kotlin, jak i Java. Zrozumienie zakresu i hierarchii tych konfiguracji jest kluczem do zarządzania zgodnością kodu bajtowego projektu.

Oto 3 główne sposoby ustawiania celu JVM, uporządkowane od najniższego do najwyższego priorytetu. Wartości docelowe JVM o wyższym priorytecie mają zastosowanie do mniejszego podzbioru skonfigurowanych celów i zastępują wartości o niższym priorytecie. Oznacza to, że możesz ustawić różne wersje JVM dla różnych celów i kompilacji w ramach celów w projekcie.

Korzystanie z łańcucha narzędzi Kotlin (najniższy priorytet)

Najbardziej ogólnym sposobem ustawienia celu JVM jest określenie łańcucha narzędzi w bloku kotlin pliku build.gradle.kts. To podejście ustawia cel dla zadań kompilacji zarówno w Kotlinie, jak i w Javie we wszystkich środowiskach docelowych opartych na JVM w projekcie, w tym na Androidzie.

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

Ta konfiguracja sprawia, że zarówno kotlinc, jak i javac są kierowane na JVM 21. To świetny sposób na ustalenie spójnego punktu odniesienia dla całego projektu.

Korzystanie z opcji kompilatora na poziomie docelowym Androida (średni priorytet)

Możesz określić środowisko docelowe JVM dla środowiska docelowego Android KMP w bloku android. To ustawienie zastępuje konfigurację jvmToolchain na poziomie projektu i dotyczy wszystkich kompilacji na Androida.

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

W takim przypadku, nawet jeśli właściwość jvmToolchain jest ustawiona na inną wersję, kod Kotlin i Java celu Androida zostanie skompilowany na potrzeby docelowej maszyny JVM 11.

Używanie opcji kompilatora na poziomie kompilacji (najwyższy priorytet)

Aby uzyskać największą kontrolę, możesz skonfigurować opcje kompilatora na podstawie kompilacji (na przykład tylko w przypadku androidMain lub androidHostTest). Jest to przydatne, jeśli konkretna kompilacja musi być kierowana na inną wersję JVM. To ustawienie zastępuje zarówno zestaw narzędzi Kotlin, jak i opcje na poziomie docelowym Androida.

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

Ta konfiguracja pomaga zapewnić, że wszystkie kompilacje w ramach celu Androida używają JVM 11, co zapewnia szczegółową kontrolę.

Starsza wersja wtyczki

W projekcie KMP, który używa standardowej wtyczki biblioteki Androida (com.android.library), konfiguracja nieco się różni od tej, która jest używana w przypadku wtyczki Androida KMP (ale koncepcyjnie jest podobna).

Korzystanie z zestawu narzędzi Kotlin

Metoda kotlin.jvmToolchain() działa identycznie, ustawiając sourceCompatibility i targetCompatibility w przypadku Javy oraz jvmTarget w przypadku Kotlina. Zalecamy korzystanie z tego podejścia.

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

compileOptions i kotlinOptions

Jeśli nie używasz łańcucha narzędzi Kotlin, musisz skonfigurować cele JVM za pomocą oddzielnych bloków dla Javy i Kotlina.

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

    kotlinOptions {
        jvmTarget = "11"
    }
}

11. Opublikuj reguły przechowywania dla klientów

Jeśli biblioteka KMP musi dostarczać konsumentom reguły zachowywania (np. reguły ProGuard dla R8), musisz wyraźnie włączyć publikowanie za pomocą nowej wtyczki. Wcześniej reguły przechowywania konsumentów były domyślnie publikowane, jeśli zostały określone.

Android-KMP

W przypadku nowej wtyczki musisz ustawić optimization.consumerKeepRules.publish = true i określić pliki reguł w bloku consumerKeepRules, aby opublikować reguły zachowywania konsumentów.

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

Starsza wersja wtyczki

W przypadku com.android.library wszystkie pliki reguł określone za pomocą consumerProguardFiles w android.defaultConfig są domyślnie publikowane w artefaktach biblioteki.

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

12. Publikowanie biblioteki w Maven

Jeśli planujesz opublikować bibliotekę KMP w Mavenie, aby mogła być używana przez inne projekty, proces będzie się różnić w zależności od tego, czy używasz nowej wtyczki Android-KMP czy starszej wtyczki.

Android-KMP

Wtyczka com.android.kotlin.multiplatform.library integruje się ze standardowymi mechanizmami publikowania Kotlin Multiplatform. Nie są wymagane żadne dodatkowe czynności związane z Androidem poza standardowym procesem publikowania biblioteki KMP.

Aby opublikować bibliotekę, postępuj zgodnie z oficjalną dokumentacją JetBrains: Konfigurowanie publikowania biblioteki wieloplatformowej.

Starsza wersja wtyczki

Jeśli w projekcie KMP używasz com.android.library jako celu Androida, musisz postępować zgodnie ze standardowym przewodnikiem po publikowaniu bibliotek Androida, aby przygotować i opublikować artefakt (.aar) przeznaczony na Androida.

Szczegółowe instrukcje znajdziesz w artykule Przygotowywanie biblioteki do opublikowania.

Dokumentacja API wtyczki

Nowa wtyczka ma inny interfejs API niż com.android.library. Szczegółowe informacje o nowym języku DSL i interfejsach znajdziesz w dokumentacji API:

Znane problemy z wtyczką biblioteki Android-KMP

Oto znane problemy, które mogą wystąpić po zastosowaniu nowej wtyczki com.android.kotlin.multiplatform.library: