KMP için Android Gradle kitaplık eklentisini ayarlama

com.android.kotlin.multiplatform.library Gradle eklentisi, Kotlin Çoklu Platform (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 sağlar.

KMP geliştirme için com.android.library eklentisinin kullanımı, desteği sonlandırılan ve Android Gradle eklentisi 9.0 ve sonraki sürümlerde (2025'in 4. çeyreği) 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ı bekleniyor.

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

AGP 9.0 ve sonraki sürümlere geçiş konusunda yardım almak için JetBrains tarafından KMP uygulamaları için oluşturulan temsilci becerisini kullanabilirsiniz. Android Studio'da becerileri kullanma hakkında daha fazla bilgi için Temsilci Modu'nu becerilerle genişletme başlıklı makaleyi inceleyin. Yapay zeka sonuçlarının tamamen öngörülebilir olmadığını unutmayın.

Temel özellikler ve farklılıklar

Android-KMP eklentisi, KMP projeleri için özel olarak 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. Ürün varyantları ve derleme türleri için desteği kaldırarak yapılandırmayı basitleştirir ve derleme performansını artırır.

  • KMP için optimize edilmiştir: Eklenti, KMP kitaplıkları için tasarlanmıştır. Paylaşılan Kotlin koduna ve birlikte çalışabilirliğe odaklanır. Android'e özgü yerel derlemeler, AIDL ve RenderScript desteği sunmaz.

  • Varsayılan olarak devre dışı bırakılan testler: Derleme hızını iyileştirmek 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ğu ile gerçekleştirilir ve tutarlı bir KMP proje yapısı korunur. Üst düzey android uzantı engellemesi yok.

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

Android-KMP kitaplık eklentisinin avantajları

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

  • Daha iyi derleme performansı ve kararlılık: KMP projelerinde optimize edilmiş derleme hızları ve daha fazla kararlılık için tasarlanmıştır. KMP iş akışlarına odaklanması, daha verimli ve güvenilir bir derleme süreci sağlar.

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

  • Basitleştirilmiş proje yapılandırması: Eklenti, derleme varyantları gibi Android'e özgü karmaşıklıkları ortadan 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 eklentisini kullanmak androidAndroidTest gibi kafa karıştırıcı kaynak grubu adları oluşturabiliyordu. 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 entegrasyonu ile karşılaştırıldığında com.android.kotlin.multiplatform.library eklentisinde bazı özellikler eksiktir. Desteklenmeyen özellikler için geçici çözümler şunlardır:

  • Derleme değişkenleri

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

    Derleme değişkenlerine ihtiyacınız varsa com.android.library eklentisini kullanarak ayrı bir bağımsız Android kitaplık modülü oluşturmanızı, bu modülde derleme türlerini ve ürün türlerini yapılandırmanızı ve ardından Kotlin Çok Platformlu 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 değişkenlerini yapılandırma başlıklı makaleleri inceleyin.

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

    Bunlar, Android görünüm sistemi ve XML düzenleriyle sıkı bir şekilde bağlantılı olan Android'e özgü kullanıcı arayüzü çerçevesi özellikleridir. Yeni Android-KMP kitaplığı eklentisiyle, kullanıcı arayüzünü Compose Multiplatform gibi çoklu platform çerçevesi kullanarak yönetmenizi öneririz. Veri bağlama ve görünüm bağlama, paylaşılabilir bir kitaplığın 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'da yerel kod entegrasyonu, doğrudan KMP'nin kendi yerel hedefleri (ör. androidNativeArm64 ve androidNativeX86) ve C-interop özellikleri tarafından gerçekleştirilir. Yerel C/C++ kodu eklemeniz gerekiyorsa bunu ortak veya yerel bir kaynak grubunun parçası olarak tanımlamanız ve Android'e özgü externalNativeBuild mekanizmasını kullanmak yerine kotlin bloğunda C-interop'u yapılandırmanız gerekir.

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

  • BuildConfig sınıf

    BuildConfig özelliği, en çok birden fazla varyantın bulunduğu ortamlarda faydalıdır. Yeni Kotlin Çoklu Platform kitaplık eklentisi varyanttan bağımsız olduğundan ve derleme türleri ile ürün türlerini desteklemediğinden bu özellik uygulanmaz. 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ümlerle veya daha yeni sürümlerle 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.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. Eklenti beyanını kök derleme dosyasına uygulayın. Projenizin kök dizininde bulunan build.gradle.kts dosyasını açın. apply false kullanarak eklenti takma adlarını plugins bloğuna ekleyin. Bu sayede, eklenti mantığı kök projenin kendisine 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ığı modülü derleme dosyasına uygulayın. KMP kitaplık modülünüzde build.gradle.kts dosyasını açın ve eklentiyi dosyanızın üst kısmındaki plugins bloğuna 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 uyguladıktan ve 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 kaynak kümelerine ek olarak src/main, src/test ve src/androidTest kaynak kümelerini kullanmanıza olanak tanıyordu. Yeni eklenti yalnızca ikinci kaynak dizinlerini 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 varsa bunları daha önce sourceSets bloğunu kullanarak yapılandırmışsınızdır. Yeni eklentiyle, değişkene statik kaynak dizinleri eklemek için androidComponents uzantısını kullanın.

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

Android-KMP

Yeni eklentiyle, varyantın kaynaklarıyla etkileşim kurmak 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

Android'e özgü kaynak grupları için bağımlılıkları bildirmek yaygın bir görevdir. 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ı sağlar. 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 gruplarında main, deviceTest ve hostTest adlı karşılık gelen Kotlin derlemeleri bulunur. Kaynak grupları 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 eklentiyle, üst düzey bağımlılıklar bloğunda Android'e özgü bağımlılıkları bildirebiliyordunuz. Bu durum, çoklu platform modülünde bazen 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

Android kaynakları (res klasörleri) için destek, derleme performansını optimize etmek amacıyla yeni eklentiyle varsayılan olarak etkinleştirilmez. Bu özellikleri kullanabilmek için etkinleştirmeniz gerekir. Bu değişiklik, Android'e özgü kaynaklar gerektirmeyen projelerin, ilgili 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ştirildi. 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 makine tarafındaki (birim) ve cihaz tarafındaki (enstrümantasyon) testleri devre dışı bırakır. Test kaynak gruplarını ve yapılandırmalarını oluşturmak için açıkça etkinleştirmeniz 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 gruplarını içermesini sağlar.

Android-KMP

Yeni eklentiyle, testleri kotlin.android bloğunda etkinleştirip yapılandırabilirsiniz. Bu sayede kurulum daha net hale gelir ve kullanılmayan test bileşenleri oluşturulmaz. androidUnitTest kaynak grubu androidHostTest olur (test dizini src/androidUnitTest yerine src/androidHostTest olur) ve androidInstrumentedTest, androidDeviceTest olur (test dizini src/androidInstrumentedTest yerine src/androidDeviceTest olur).

// 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 grupları varsayılan olarak oluşturulur. Davranışlarını android bloğunda, genellikle testOptions DSL'yi kullanarak yapılandırırsınız.

// 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() yöntemini çağırarak Java derlemesini etkinleştirmeniz gerekir. JVM hedefi artık daha birleşik bir kurulum için doğrudan kotlin { android {} } bloğunun içinde yapılandırılıyor. Burada jvmTarget ayarını yapmak, 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 ayarlandı.

// 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 değişkenleriyle etkileşim kurma

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

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

Android-KMP

onVariants bloğu artık tek bir varyant üzerinde iterasyon yapar. name ve artifacts gibi ortak özelliklere erişmeye devam edebilirsiniz ancak derleme türüne özgü özelliklere 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ığı bağımlılıklarının varyantlarını seçme

KMP kitaplığınız Android için tek bir varyant üretir. Ancak birden fazla varyantı (ör. free/paid ürün türü) 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 harici bağımlılıkların hangi 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

Bağımlılık seçimi stratejilerini buildTypes and productFlavors blokları içinde yapılandırdınız. Bu işlem genellikle kitaplığınızda bulunmayan bir boyut için varsayılan bir varyant sağlamak üzere missingDimensionStrategy kullanmayı veya arama sırasını tanımlamak için belirli bir varyantta matchingFallbacks kullanmayı içerir.

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

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

Dahili araçların yayınlanan nihai yapıya sızmasını önlemek için genellikle yerel geliştirme ortamımızın kapsamına giren belirli kitaplıklar kullanmak isteriz. Yeni KMP Android eklentisi, geliştirme bağımlılıklarını yayın kodundan ayırmak için kullanılan derleme türü mimarisini kaldırdığından bu durum bir sorun haline gelir.

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 sayede bağımlılık, çalışma zamanında kullanılabilir (ör. Compose Preview gibi araçlar için) ancak derleme sınıf yolunun veya kitaplığınızın yayınlanan API'sinin bir parçası olmaz.

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

Eski Eklenti

Android hedefi için com.android.library eklentisini kullanan Kotlin Çoklu Platform projeleri, debugImplementation yapılandırmasını kullanmalıdır. Bu yapılandırma, bağımlılığı hata ayıklama derlemesi türüyle sınırlandırır ve tüketiciler tarafından kullanılan kitaplığın sürüm varyantına dahil edilmesini engeller.

// 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 hem Java hem de Kotlin için geçerli olan android.compilerOptions.jvmTarget kullanarak ayarlar. Bu sayede, saf Android projelerindeki ayrı compileOptions ve kotlinOptions bloklarına kıyasla yapılandırma basitleştirilir.

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 birkaç yolu vardır. Bu yapılandırmaların kapsamını ve hiyerarşisini anlamak, projenizin bayt kodu uyumluluğunu yönetmek açısından çok önemlidir.

JVM hedefini ayarlamanın üç temel yolu vardır. Bunlar en düşükten en yüksek önceliğe doğru 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 sayede, projenizdeki farklı hedefler ve hedefler içindeki derlemeler için farklı JVM sürümleri ayarlayabilirsiniz.

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örevleri için hedefi belirler.

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

Bu yapılandırma, hem kotlinc hem de javac'in JVM 21'i hedeflemesini sağlar. Bu, tüm projeniz için tutarlı bir temel oluşturmanın harika bir yoludur.

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

android bloğunda Android KMP hedefi için JVM hedefini 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üzeyinde derleyici seçeneklerini kullanma (en yüksek öncelik)

En ayrıntılı kontrol için derleyici seçeneklerini derleme bazında yapılandırabilirsiniz (örneğin, yalnızca androidMain veya androidHostTest için). Bu, belirli bir derlemenin farklı bir JVM sürümünü hedeflemesi gerektiğinde kullanışlıdır. Bu ayar, hem Kotlin araç zincirini hem de Android hedef düzeyi seçeneklerini 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 sağlar.

Eski Eklenti

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

Kotlin araç zincirini kullanma

kotlin.jvmToolchain() yöntemi de aynı şekilde çalışır. Java için sourceCompatibility ve targetCompatibility, Kotlin için ise jvmTarget değerini ayarlar. 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üketici 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. Önceden, tüketici saklama kuralları belirtilmişse varsayılan olarak yayınlanıyordu.

Android-KMP

Yeni eklentiyle, tüketici saklama kurallarını yayınlamak için consumerKeepRules bloğunda optimization.consumerKeepRules.publish = true değerini ayarlamanız ve 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 kural dosyaları varsayılan olarak kitaplığın yapılarına yayınlanır.

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

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

KMP kitaplığınızı diğer projeler tarafından kullanılmak üzere Maven'de 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 özgü adımlar gerekmez.

Kitaplığınızı yayınlamak için JetBrains'in resmi dokümanlarındaki Çoklu platform kitaplığı için yayınlama ayarlarını yapma başlıklı makaleyi inceleyin.

Eski Eklenti

KMP projesinde Android hedefi için com.android.library kullanırken Android'e özel 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ınlanmaya hazırlama başlıklı makaleyi inceleyin.

Eklenti API referansı

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

Android-KMP kitaplık eklentisiyle ilgili bilinen sorunlar

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