KMP için Android Gradle kitaplık eklentisini ayarlama

com.android.kotlin.multiplatform.library Gradle eklentisi, Kotlin Multiplatform (KMP) kitaplık modülüne Android hedefi eklemek için resmi olarak desteklenen araçtır. Proje yapılandırmasını basitleştirir, derleme performansını artırır ve Android Studio ile daha iyi entegrasyon sunar.

KMP geliştirme için com.android.library eklentisinin kullanılması, Android Gradle eklentisi 9.0 ve sonraki sürümlerinde (2025'in 4. çeyreği) kullanımdan kaldırılan ve etkinleştirilmesi gereken Android Gradle eklentisi API'lerine bağlıdır. Bu API'lerin, Android Gradle eklentisi 10.0'da (2026'nın ikinci yarısı) kaldırılması beklenmektedir.

Bu eklentiyi uygulamak için Android-KMP eklentisini uygulama bölümüne bakın. Eski API'lerden taşıma yapmanız gerekiyorsa Taşıma Rehberi'ni inceleyin.

AGP 9.0+ taşıma işlemiyle ilgili yardım için JetBrains tarafından KMP uygulamaları için oluşturulan agent skill'i kullanabilirsiniz. Android Studio'da becerileri kullanma hakkında daha fazla bilgi için Becerilerle Agent Modu'nu genişletme başlıklı makaleyi inceleyin. Yapay zeka sonuçlarının tamamen öngörülebilir olmadığını unutmayın.

bilinen sorunlar ve desteklenmeyen özellikler hakkında bilgi edinin.

Temel özellikler ve farklar

Android-KMP eklentisi, özellikle KMP projeleri için tasarlanmıştır ve standart com.android.library eklentisinden birkaç önemli açıdan farklıdır:

  • Tek varyantlı mimari: Eklenti, tek bir varyant kullanır. Bu sayede, ürün çeşitleri ve derleme türleri için destek kaldırılır. Böylece yapılandırma basitleştirilir ve derleme performansı artırılır.

  • KMP için optimize edildi: Eklenti, KMP kitaplıkları için tasarlanmıştır. Paylaşılan Kotlin kodu ve birlikte çalışabilirlik özelliklerine odaklanarak Android'e özgü yerel derlemeler, AIDL ve RenderScript desteğini atlar.

  • Varsayılan olarak devre dışı bırakılan testler: Derleme hızını artırmak için hem birim hem de cihaz (enstrümantasyon) testleri varsayılan olarak devre dışı bırakılır. Gerekirse bunları etkinleştirebilirsiniz.

  • Üst düzey Android uzantısı yok: Yapılandırma, Gradle KMP DSL'deki bir android bloğuyla yönetilir ve tutarlı bir KMP proje yapısı korunur. Üst düzey android uzantı bloğu yoktur.

  • Java derlemesini etkinleştirme: Java derlemesi varsayılan olarak devre dışıdır. Etkinleştirmek için android bloğunda withJava() simgesini kullanın. Bu, Java derlemesi gerekmediğinde derleme sürelerini kısaltır.

Android-KMP kitaplığı eklentisinin avantajları

Android-KMP eklentisi, KMP projeleri için aşağıdaki avantajları sunar:

  • Daha iyi derleme performansı ve kararlılık: Optimize edilmiş derleme hızları ve KMP projelerinde daha iyi kararlılık için tasarlanmıştır. KMP derleme işlemlerine odaklanması, daha verimli ve güvenilir bir derleme işlemine katkıda bulunur.

  • Gelişmiş IDE entegrasyonu: KMP Android kitaplıklarıyla çalışırken daha iyi kod tamamlama, gezinme, hata ayıklama ve genel geliştirici deneyimi sağlar.

  • Basitleştirilmiş proje yapılandırması: Eklenti, derleme varyantları gibi Android'e özgü karmaşıklıkları kaldırarak KMP projelerinin yapılandırmasını basitleştirir. Bu sayede daha temiz ve bakımı daha kolay derleme dosyaları elde edilir. Daha önce, KMP projesinde com.android.library eklentisinin kullanılması androidAndroidTest gibi kafa karıştırıcı kaynak grubu adlarının oluşturulmasına neden olabiliyordu. Bu adlandırma kuralı, standart KMP proje yapılarına aşina olan geliştiriciler için daha az sezgiseldi.

Desteklenmeyen özellikler için geçici çözümler

com.android.library eklentisiyle KMP entegrasyonuna kıyasla com.android.kotlin.multiplatform.library eklentisinde bazı özellikler eksiktir. Desteklenmeyen özellikler için geçici çözümleri aşağıda bulabilirsiniz:

  • Varyant oluşturma

    Derleme türleri ve ürün çeşitleri desteklenmez. Bunun nedeni, yeni eklentinin tek varyantlı bir mimari kullanmasıdır. Bu mimari, yapılandırmayı basitleştirir ve derleme performansını artırır.

    Derleme varyantlarına ihtiyacınız varsa com.android.library eklentisini kullanarak ayrı bir bağımsız Android kitaplığı modülü oluşturmanızı, bu modülde derleme türlerini ve ürün çeşitlerini yapılandırmanızı, ardından Kotlin Multiplatform kitaplığınızın androidMain kaynak grubundan standart bir proje bağımlılığı olarak kullanmanızı öneririz. Daha fazla bilgi için Android kitaplığı oluşturma ve Derleme varyantlarını yapılandırma başlıklı makalelere göz atın.

  • Veri bağlama ve görünüm bağlama

    Bunlar, Android'e özgü, Android View sistemi ve XML düzenleriyle sıkı bir şekilde bağlantılı olan kullanıcı arayüzü çerçevesi özellikleridir. Yeni Android-KMP kitaplığı eklentisiyle birlikte, kullanıcı arayüzünü Compose Multiplatform gibi çok platformlu bir çerçeve kullanarak yönetmenizi öneririz. Veri bağlama ve görünüm bağlama, paylaşılabilir bir kitaplık değil, nihai bir Android uygulamasının uygulama ayrıntıları olarak kabul edilir.

  • Yerel derleme desteği

    Yeni eklenti, Android hedefi için standart bir AAR oluşturmaya odaklanır. Kotlin Multiplatform'daki yerel kod entegrasyonu doğrudan KMP'nin kendi yerel hedefleri (ör. androidNativeArm64 ve androidNativeX86) ve C-interop özellikleri tarafından işlenir. Yerel C/C++ kodu eklemeniz gerekiyorsa bunu ortak veya yerel bir kaynak kümesinin parçası olarak tanımlamalı ve Android'e özgü kotlin mekanizmasını kullanmak yerine C-interop'u externalNativeBuild bloğunda yapılandırmalısınız.

    Alternatif olarak, externalNativeBuild üzerinden yerel derleme desteğine ihtiyacınız varsa yerel kodu entegre edebileceğiniz ve bu bağımsız kitaplığı Kotlin Multiplatform kitaplık projenizin androidMain kaynak grubundan kullanabileceğiniz ayrı bir bağımsız com.android.library modülü oluşturmanızı öneririz. Daha fazla bilgi için Android kitaplığı oluşturma ve Projenize C ve C++ kodu ekleme başlıklı makaleleri inceleyin.

  • BuildConfig class

    BuildConfig özelliği, en çok çok değişkenli ortamlarda kullanışlıdır. Yeni Kotlin Multiplatform kitaplığı eklentisi değişkenden bağımsız olduğundan ve derleme türleri ile ürün çeşitleri için destek sunmadığından bu özellik uygulanmamıştır. Alternatif olarak, tüm hedefler için meta veri oluşturmak üzere BuildKonfig eklentisini veya benzer topluluk çözümlerini kullanmanızı öneririz.

Ön koşullar

com.android.kotlin.multiplatform.library eklentisini kullanmak için projenizin aşağıdaki minimum sürümler veya daha yenileriyle yapılandırılması gerekir:

  • Android Gradle Eklentisi (AGP): 8.10.0
  • Kotlin Gradle Eklentisi (KGP): 2.0.0

Android-KMP eklentisini mevcut bir modüle uygulama

Android-KMP eklentisini mevcut bir KMP kitaplık modülüne uygulamak için aşağıdaki adımları uygulayın:

  1. Sürüm kataloğunda eklentileri bildirin. Sürüm kataloğu TOML dosyasını (genellikle gradle/libs.versions.toml) açın ve eklenti tanımları bölümünü ekleyin:

    # 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. Eklenti bildirimini kök derleme dosyasına uygulayın. Projenizin kök dizininde bulunan build.gradle.kts dosyasını açın. plugins kullanarak eklenti takma adlarını apply false bloğuna ekleyin. Bu sayede, eklenti mantığı kök projeye uygulanmadan eklenti takma adları tüm alt projelerde kullanılabilir.

    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
    }

    Modern

    // 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. Eklentiyi bir KMP kitaplık modülü derleme dosyasında uygulayın. KMP kitaplık modülünüzdeki build.gradle.kts dosyasını açın ve eklentiyi plugins bloğundaki dosyanızın en üstüne uygulayın:

    Kotlin

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

    Modern

    // Module-specific build.gradle file
    
    plugins {
       alias(libs.plugins.kotlin.multiplatform)
    
       // Add the following
       alias(libs.plugins.android.kotlin.multiplatform.library)
    }
  4. Android KMP hedefini yapılandırın. Android hedefini tanımlamak için Kotlin Multiplatform bloğunu (kotlin) yapılandırın. kotlin bloğunda, android kullanarak Android hedefini belirtin:

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

    Modern

    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. Değişiklikleri uygulayın. Eklentiyi uygulayıp kotlin bloğunu yapılandırdıktan sonra değişiklikleri uygulamak için Gradle projenizi senkronize edin.

Eski eklentiden taşıma

Bu kılavuz, eski com.android.library eklentisinden com.android.kotlin.multiplatform.library eklentisine geçiş yapmanıza yardımcı olur.

1. Kaynakları taşıma

Eski eklenti, src/androidMain, src/androidHostTest ve src/androidDeviceTest'ın yanı sıra src/main, src/test ve src/androidTest kaynak kümelerini kullanmanıza olanak tanıyordu. Yeni eklenti yalnızca ikinci kaynak dizinleri kullandığından kaynakları src/main dizininden src/androidMain dizinine, src/test dizininden src/androidHostTest dizinine ve src/androidTest dizininden src/androidDeviceTest dizinine taşımanız gerekir.

2. Özel kaynak ve kaynak dizinlerini yapılandırma

Standart olmayan dizinlerde kaynaklarınız veya öğeleriniz varsa bunları daha önce sourceSets bloğunu kullanarak yapılandırmışsınızdır. Yeni eklentiyle, varyanta statik kaynak dizinleri eklemek için androidComponents uzantısını kullanın.

Yeni eklentide addStaticSourceDirectory yönteminin, dizini mevcut kaynak dizinleri listesine eklediğini unutmayın. Eski eklentide ise setSrcDirs yöntemi listeyi değiştirirken srcDir yöntemi listeye ekleme yapar.

Android-KMP

Yeni eklentiyle, varyantın kaynaklarıyla etkileşimde bulunmak için onVariants bloğunu kullanın.

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

Eski eklenti

com.android.library eklentisiyle, kaynak dizinleri ayarlamak veya eklemek için sourceSets bloğu kullanılıyordu.

// 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. Bağımlılıkları bildirme

Sık karşılaşılan bir görev, Android'e özgü kaynak kümeleri için bağımlılıkları bildirmektir. Yeni eklenti, daha önce kullanılan genel dependencies bloğunun aksine bunların sourceSets bloğuna açıkça yerleştirilmesini gerektirir.

Android-KMP

Yeni eklenti, Android bağımlılıklarını androidMain kaynak grubunda gruplandırarak daha temiz bir yapı oluşturur. Ana kaynak grubuna ek olarak, isteğe bağlı olarak oluşturulan iki test kaynak grubu vardır: androidDeviceTest ve androidHostTest (daha fazla bilgi için ana makine ve cihaz testlerini yapılandırma bölümüne bakın).

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

Kaynak kümelerinin main, deviceTest ve hostTest adlı Kotlin derlemeleri vardır. Kaynak kümeleri ve derlemeler, derleme komut dosyasında şu şekilde yapılandırılabilir:

// build.gradle.kts

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

Eski eklenti

Eski eklentide, üst düzey bağımlılıklar bloğunda Android'e özgü bağımlılıklar bildirebiliyordunuz. Bu durum, bazen çok platformlu bir modülde kafa karıştırıcı olabiliyordu.

// 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. Android kaynaklarını etkinleştirme

Derleme performansını optimize etmek için yeni eklentiyle Android kaynakları (res klasörleri) desteği varsayılan olarak etkinleştirilmez. Bu özellikleri kullanmak için etkinleştirmeniz gerekir. Bu değişiklik, Android'e özgü kaynak gerektirmeyen projelerin ilişkili derleme ek yükünden etkilenmemesini sağlar.

Android-KMP

Android kaynak işlemeyi açıkça etkinleştirmeniz gerekir. Kaynaklar src/androidMain/res içine yerleştirilmelidir.

// build.gradle.kts

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

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

Eski eklenti

Kaynak işleme varsayılan olarak etkinleştirilmişti. src/main içinde hemen bir res dizini ekleyebilir ve XML çizilebilir öğeleri, değerleri vb. eklemeye başlayabilirsiniz.

// 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. Ana makine ve cihaz testlerini yapılandırma

Yeni eklenti, varsayılan olarak Android ana tarafı (birim) ve cihaz tarafı (enstrümanlı) testlerini devre dışı bırakır. Test kaynağı kümelerini ve yapılandırmalarını oluşturmak için açıkça kabul etmeniz gerekir. Eski eklenti ise bunları otomatik olarak oluşturuyordu.

Bu etkinleştirme modeli, projenizin yalın kalmasını ve yalnızca etkin olarak kullandığınız derleme mantığını ve kaynak kümelerini içermesini sağlar.

Android-KMP

Yeni eklentiyle, testleri kotlin.android bloğunda etkinleştirip yapılandırabilirsiniz. Bu sayede kurulum daha açık hale gelir ve kullanılmayan test bileşenleri oluşturulması önlenir. androidUnitTest kaynak grubu androidHostTest olur (test dizini src/androidUnitTest'den src/androidHostTest'e değişir) ve androidInstrumentedTest, androidDeviceTest olur (test dizini src/androidInstrumentedTest'den src/androidDeviceTest'e değişir).

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

Eski eklenti

com.android.library eklentisiyle, androidUnitTest ve androidInstrumentedTest kaynak kümeleri varsayılan olarak oluşturulur. Davranışlarını android bloğunda yapılandırabilirsiniz. Bu işlem genellikle testOptions DSL kullanılarak yapılır.

// 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. Java kaynak derlemesini etkinleştirme

KMP kitaplığınızın Android hedefi için Java kaynaklarını derlemesi gerekiyorsa bu işlevi yeni eklentiyle açıkça etkinleştirmeniz gerekir. Bu seçeneğin, bağımlılıklar için değil, doğrudan projenizde bulunan Java dosyaları için derlemeyi etkinleştirdiğini unutmayın. Java ve Kotlin derleyicisinin JVM hedef sürümünü ayarlama yöntemi de değişir.

Android-KMP

withJava() numaralı telefonu arayarak Java derlemesini etkinleştirmeniz gerekir. JVM hedefi, daha birleşik bir kurulum için artık doğrudan kotlin { android {} } bloğunda yapılandırılıyor. Buradaki jvmTarget ayarı, Android hedefi için hem Kotlin hem de Java derlemesi için geçerlidir.

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

Eski eklenti

Java derlemesi varsayılan olarak etkinleştirildi. Hem Java hem de Kotlin kaynakları için JVM hedefi, compileOptions kullanılarak android bloğunda ayarlanmıştır.

// build.gradle.kts

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

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

7. androidComponents kullanarak derleme varyantlarıyla etkileşim kurma

androidComponents uzantısı, derleme yapılarıyla programatik olarak etkileşim kurmak için kullanılmaya devam edebilir. Variant API'nin büyük bir kısmı aynı kalsa da eklenti yalnızca tek bir varyant ürettiğinden yeni AndroidKotlinMultiplatformVariant arayüzü daha sınırlıdır.

Bu nedenle, derleme türleri ve ürün çeşitleriyle ilgili özellikler artık varyant nesnesinde kullanılamaz.

Android-KMP

onVariants bloğu artık tek bir varyant üzerinde yineleniyor. name ve artifacts gibi ortak özelliklere erişmeye devam edebilirsiniz ancak derleme türüne özgü olanlara erişemezsiniz.

// build.gradle.kts

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

Eski eklenti

Birden fazla varyantla, görevleri yapılandırmak için derleme türüne özgü özelliklere erişebilirsiniz.

// build.gradle.kts

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

8. Android kitaplık bağımlılıklarının varyantlarını seçme

KMP kitaplığınız Android için tek bir varyant oluşturur. Ancak, birden fazla varyantı (ör. free/paid ürün aromaları) olan standart bir Android kitaplığına (com.android.library) bağlı olabilirsiniz. Projenizin bu bağımlılıktan bir varyantı nasıl seçeceğini kontrol etmek yaygın bir gereksinimdir.

Android-KMP

Yeni eklenti, bu mantığı kotlin.android.localDependencySelection bloğunda merkezileştirir ve netleştirir. Bu sayede, tek varyantlı KMP kitaplığınız için hangi harici bağımlılık varyantlarının seçileceği çok daha net bir şekilde anlaşılır.

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

Eski eklenti

buildTypes and productFlavors bloklarında bağımlılık seçimi stratejileri yapılandırdınız. Bu genellikle kitaplığınızın sahip olmadığı bir boyut için varsayılan bir tür sağlamak üzere missingDimensionStrategy veya bir arama sırası tanımlamak için belirli bir tür içinde matchingFallbacks kullanmayı içeriyordu.

API kullanımı hakkında daha ayrıntılı bilgi için Eşleştirme Hatalarını Çözme bölümüne bakın.

9. Compose önizleme bağımlılıkları ekleme

Genellikle, dahili araçların yayınlanan son yapıda sızmasını önlemek için yerel geliştirme ortamımızda belirli kitaplıkların kapsamını belirlemek isteriz. Bu, geliştirme bağımlılıklarını yayın kodundan ayırmak için kullanılan derleme türü mimarisini kaldıran yeni KMP Android eklentisiyle zorlaşır.

Android-KMP

Yalnızca yerel geliştirme ve test için bağımlılık eklemek istiyorsanız bağımlılığı doğrudan ana Android derlemesinin çalışma zamanı sınıf yolu yapılandırmasına (üst düzey dependencies bloğunda) ekleyin. Bu, bağımlılığın çalışma zamanında (örneğin, Compose Preview gibi araçlar için) kullanılabilir olmasını ancak derleme sınıf yolunun veya kitaplığınızın yayınlanmış API'sinin bir parçası olmamasını sağlar.

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

Eski eklenti

Android hedefi için com.android.library eklentisini kullanan Kotlin Multiplatform projeleri, bağımlılığı hata ayıklama derleme türüyle sınırlayan ve tüketiciler tarafından kullanılan kitaplığın yayın varyantına dahil edilmesini engelleyen debugImplementation yapılandırmasını kullanmalıdır.

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

10. KMP Android hedefi için JVM hedefini yapılandırma

KMP Android eklentisi, JVM hedefini android.compilerOptions.jvmTarget kullanarak ayarlar. Bu, hem Java hem de Kotlin için geçerlidir ve yapılandırmayı saf Android projelerindeki ayrı compileOptions ve kotlinOptions bloklarına kıyasla basitleştirir.

Android-KMP

Android hedefi içeren bir Kotlin Multiplatform (KMP) projesiyle çalışırken hem Kotlin hem de Java derleyicisi için JVM hedef sürümünü yapılandırmanın çeşitli yolları vardır. Bu yapılandırmaların kapsamını ve hiyerarşisini anlamak, projenizin bayt kodu uyumluluğunu yönetmek için çok önemlidir.

JVM hedefini ayarlamanın üç temel yolu vardır. Bunlar, en düşükten en yüksek önceliğe göre sıralanmıştır. Daha yüksek önceliğe sahip JVM hedef değerleri, yapılandırılmış hedeflerinizin daha küçük bir alt kümesi için geçerlidir ve daha düşük önceliğe sahip değerleri geçersiz kılar. Bu, projenizdeki hedefler içinde farklı hedefler ve derlemeler için farklı JVM sürümleri ayarlayabileceğiniz anlamına gelir.

Kotlin araç zincirini kullanma (en düşük öncelik)

JVM hedefini ayarlamanın en genel yolu, build.gradle.kts dosyanızın kotlin bloğunda araç zincirini belirtmektir. Bu yaklaşım, Android de dahil olmak üzere projenizdeki tüm JVM tabanlı hedeflerde hem Kotlin hem de Java derleme görevlerinin hedefini belirler.

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

Bu yapılandırma, hem kotlinc hem de javac hedef JVM 21'i yapar. Bu, projenizin tamamı için tutarlı bir temel oluşturmanın harika bir yoludur.

Android hedef düzeyinde derleyici seçeneklerini kullanma (orta öncelikli)

JVM hedefini, android bloğunda özellikle Android KMP hedefi için belirtebilirsiniz. Bu ayar, proje genelindeki jvmToolchain yapılandırmasını geçersiz kılar ve tüm Android derlemeleri için geçerlidir.

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

Bu durumda, jvmToolchain farklı bir sürüme ayarlanmış olsa bile Android hedefinin Kotlin ve Java kodu, JVM 11'i hedefleyecek şekilde derlenir.

Derleme düzeyindeki derleyici seçeneklerini kullanma (en yüksek öncelik)

En ayrıntılı kontrol için derleyici seçeneklerini derleme başına (örneğin, yalnızca androidMain veya androidHostTest için) yapılandırabilirsiniz. Bu, belirli bir derlemenin farklı bir JVM sürümünü hedeflemesi gerektiğinde yararlıdır. Bu ayar, hem Kotlin araç zincirini hem de Android hedef düzeyindeki seçenekleri geçersiz kılar.

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

Bu yapılandırma, Android hedefindeki tüm derlemelerin JVM 11'i kullanmasını sağlayarak ayrıntılı kontrol olanağı sunar.

Eski eklenti

Standart Android kitaplık eklentisini (com.android.library) kullanan bir KMP projesinde yapılandırma, KMP Android eklentisini kullandığınız zamankinden biraz farklıdır (ancak kavramsal olarak benzerdir).

Kotlin araç zincirini kullanma

kotlin.jvmToolchain() yöntemi de aynı şekilde çalışır ve Java için sourceCompatibility ile targetCompatibility, Kotlin için jvmTarget ayarlanır. Bu yaklaşımı kullanmanızı öneririz.

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

compileOptions ve kotlinOptions

Kotlin araç zincirini kullanmıyorsanız JVM hedeflerini Java ve Kotlin için ayrı bloklar kullanarak yapılandırmanız gerekir.

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

    kotlinOptions {
        jvmTarget = "11"
    }
}

11. Tüketicilerin saklama kurallarını yayınlama

KMP kitaplığınızın tüketicileri için tüketici saklama kuralları (ör. R8 için ProGuard kuralları) göndermesi gerekiyorsa yeni eklentiyle yayınlamayı açıkça etkinleştirmeniz gerekir. Daha önce, belirtilmişse tüketici saklama kuralları varsayılan olarak yayınlanıyordu.

Android-KMP

Yeni eklentiyle, tüketici saklama kurallarını yayınlamak için optimization.consumerKeepRules.publish = true ayarlamanız ve consumerKeepRules bloğunda kural dosyalarını belirtmeniz gerekir.

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

Eski eklenti

com.android.library ile android.defaultConfig içinde consumerProguardFiles ile belirtilen tüm kurallar dosyaları, varsayılan olarak kitaplığın yapıtlarında yayınlanır.

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

12. Kitaplığınızı Maven'de yayınlama

KMP kitaplığınızı diğer projelerde kullanılmak üzere Maven'e yayınlamayı planlıyorsanız süreç, yeni Android-KMP eklentisini mi yoksa eski eklentiyi mi kullandığınıza bağlı olarak değişir.

Android-KMP

com.android.kotlin.multiplatform.library eklentisi, standart Kotlin Multiplatform yayınlama mekanizmalarıyla entegre olur. Standart KMP kitaplığı yayınlama sürecinin dışında Android'e özel bir adım gerekmez.

Kitaplığınızı yayınlamak için JetBrains'in resmi belgelerini inceleyin: Çok platformlu bir kitaplık için yayınlamayı ayarlama.

Eski eklenti

KMP projesinde Android hedefi için com.android.library kullanılırken Android'e özgü yapıyı (.aar) hazırlamak ve yayınlamak için standart Android kitaplığı yayınlama kılavuzunu uygulamanız gerekir.

Ayrıntılı talimatlar için Kitaplığınızı yayınlamaya hazırlama başlıklı makaleyi inceleyin.

Plugin API referansı

Yeni eklentinin API yüzeyi, com.android.library'dan farklıdır. Yeni DSL ve arayüzler hakkında ayrıntılı bilgi için API referanslarına bakın:

Android-KMP kitaplığı eklentisiyle ilgili bilinen sorunlar

Yeni com.android.kotlin.multiplatform.library eklentisini uyguladığınızda ortaya çıkabilecek bilinen sorunlar şunlardır: