Android Gradle eklentisi 9.0.1 (Ocak 2026)

Android Gradle eklentisi 9.0, API ve davranış değişiklikleri içeren önemli bir sürümdür.

Android Gradle eklentisi 9.0.1'e güncellemek için Android Gradle eklentisi Yükseltme Yardımcısı'nı kullanın.

AGP Upgrade Assistant, projenizi yükseltirken uygun olduğunda mevcut davranışları korumanıza yardımcı olur. Bu sayede, AGP 9.0'daki tüm yeni varsayılanları kullanmaya hazır olmasanız bile projenizi AGP 9.0'ı kullanacak şekilde yükseltebilirsiniz.

Uyumluluk

Android Gradle eklentisi 9.0'ın desteklediği maksimum API düzeyi 36'dır. Diğer uyumluluk bilgileri:

Minimum sürüm Varsayılan sürüm Notlar
Gradle 9.1.0 9.1.0 Daha fazla bilgi edinmek için Gradle'ı güncelleme bölümünü inceleyin.
SDK Derleme Araçları 36.0.0 36.0.0 SDK Derleme Araçları'nı yükleyin veya yapılandırın.
NDK Yok 28.2.13676358 NDK'nın farklı bir sürümünü yükleyin veya yapılandırın.
JDK 17 17 Daha fazla bilgi için JDK sürümünü ayarlama konusuna bakın.

android DSL sınıfları artık yalnızca yeni herkese açık arayüzleri uyguluyor

Son birkaç yıldır, hangi API'lerin herkese açık olduğunu daha iyi kontrol etmek için DSL ve API'miz için yeni arayüzler kullanıma sunduk. AGP 7.x ve 8.x sürümleri, arayüzler üzerinde çalışmalar devam ederken uyumluluğu korumak için yeni herkese açık arayüzleri de uygulayan eski DSL türlerini (ör. BaseExtension) kullanmaya devam etti.

AGP 9.0 yalnızca yeni DSL arayüzlerimizi kullanır ve uygulamalar tamamen gizlenmiş yeni türlere dönüştürülmüştür. Bu işlem, eski ve kullanımdan kaldırılmış varyant API'sine erişimi de kaldırır.

AGP 9.0'a güncellemek için aşağıdakileri yapmanız gerekebilir:

  • Projenizin yerleşik Kotlin ile uyumlu olduğundan emin olun: org.jetbrains.kotlin.android eklentisi, yeni DSL ile uyumlu değildir.
  • KMP projelerini KMP için Android Gradle Library eklentisine geçirme: org.jetbrains.kotlin.multiplatform eklentisinin com.android.library ve com.android.application eklentileriyle aynı Gradle alt projesinde kullanılması yeni DSL ile uyumlu değildir.

  • Derleme dosyalarınızı güncelleyin: Arayüzlerin değiştirilmesi, DSL'nin mümkün olduğunca benzer kalmasını sağlamayı amaçlasa da bazı küçük değişiklikler olabilir.

  • Özel derleme mantığınızı yeni DSL ve API'ye referans verecek şekilde güncelleyin: Dahili DSL'ye yapılan tüm referansları herkese açık DSL arayüzleriyle değiştirin. Çoğu durumda bu, bire bir değiştirme olacaktır. applicationVariants ve benzeri API'lerin tüm kullanımlarını yeni androidComponents API ile değiştirin. androidComponents API'si, eklentilerin daha uzun süre uyumlu kalması için daha kararlı olacak şekilde tasarlandığından bu işlem daha karmaşık olabilir. Örnekler için Gradle Tarifleri'ne göz atın.

  • Üçüncü taraf eklentilerini güncelleyin: Bazı üçüncü taraf eklentileri, artık kullanılmayan arayüzlere veya API'lere bağlı olabilir. Bu eklentilerin AGP 9.0 ile uyumlu sürümlerine geçin.

Yeni DSL arayüzlerine geçiş, aşağıdakiler de dahil olmak üzere çeşitli kullanımdan kaldırılmış API'leri kullanan eklentilerin ve Gradle derleme komut dosyalarının çalışmasını engeller:

android bloğunda kullanımdan kaldırılmış API İşlev Değiştirme
applicationVariants,
libraryVariants,
testVariants ve
unitTestVariants
Eklentilerin AGP'ye yeni işlevler eklemesi için uzantı noktaları. Bunu androidComponents.onVariants API ile değiştirin. Örneğin:
androidComponents {
    onVariants() { variant ->
        variant.signingConfig
            .enableV1Signing.set(false)
    }
}
Önceki tüm API'lerin doğrudan yerine geçecek bir API olmayabilir. Yeni varyant API'lerinin kapsamadığı bir kullanım alanı varsa sorun bildirin.
variantFilter Seçilen varyantların devre dışı bırakılmasına olanak tanır. Bunu androidComponents.beforeVariants API ile değiştirin. Örneğin:
androidComponents {
    beforeVariants(
        selector()
            .withBuildType("debug")
            .withFlavor("color", "blue")
    ) { variantBuilder ->
        variantBuilder.enable = false
    }
  }
deviceProvider ve
testServer
Android cihazlarda ve emülatörlerde test çalıştırmak için özel test ortamlarının kaydı. Gradle tarafından yönetilen cihazlara geçin.
sdkDirectory,
ndkDirectory,
bootClasspath,
adbExecutable ve
adbExe
Özel görevler için Android SDK'nın çeşitli bileşenlerini kullanma. androidComponents.sdkComponents planına geçin.
registerArtifactType,
registerBuildTypeSourceProvider,
registerProductFlavorSourceProvider,
registerJavaArtifact,
registerMultiFlavorSourceProvider ve
wrapJavaSourceSet
Çoğunlukla Android Studio'da oluşturulan kaynakların işlenmesiyle ilgili olan ve AGP 7.2.0'da çalışmayı durduran işlevler. Bu API'lerin doğrudan bir alternatifi yoktur.
dexOptions d8 ile değiştirilen dx aracıyla ilgili eski ayarlar. Android Gradle eklentisi 7.0'dan beri bu ayarların hiçbir etkisi olmamıştır. Doğrudan bir alternatifi yoktur.
generatePureSplits Hazır uygulamalar için yapılandırma bölmeleri oluşturun. Yapılandırma bölmelerini gönderme özelliği artık Android uygulama paketlerine yerleştirilmiştir.
aidlPackagedList Kitaplıklar ve bu kitaplığa bağlı uygulamalar için API olarak kullanıma sunmak üzere AAR'ye paketlenecek AIDL dosyaları. Bu işlev, LibraryExtension'da kullanılmaya devam etmektedir ancak diğer uzantı türlerinde kullanılamaz.

AGP 9.0'a güncelledikten sonra aşağıdaki hata mesajını görürseniz projeniz hâlâ eski türlerden bazılarına referans veriyor demektir:

java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension

Uyumsuz üçüncü taraf eklentileri tarafından engelleniyorsanız DSL için eski uygulamaları ve eski varyant API'sini geri almak üzere devre dışı bırakabilirsiniz. Bu işlem sırasında yeni arayüzler de kullanılabilir ve kendi derleme mantığınızı yeni API'ye güncelleyebilirsiniz. Bu özelliği devre dışı bırakmak için gradle.properties dosyanıza şu satırı ekleyin:

android.newDsl=false

Önceki sınıflar, AGP 9.0'da kullanımdan kaldırıldı olarak işaretlenir. Bu nedenle, newDsl işaretini devre dışı bırakan projelerde, android bloğu da dahil olmak üzere desteğin sonlandırılmasıyla ilgili uyarılar gösterilir.

AGP 9.0'a yükseltmeden önce yeni API'lere yükseltmeye de başlayabilirsiniz. Yeni arayüzler birçok AGP sürümünde kullanılabildiği için yeni ve eski arayüzleri birlikte kullanabilirsiniz. AGP API referans belgelerinde, her AGP sürümünün API yüzeyi ve her sınıf, yöntem ve alanın ne zaman eklendiği gösterilir.

Sık kullanılan eklentilerin yazarlarıyla iletişime geçerek yeni modlarla tamamen uyumlu eklentiler geliştirmelerine ve yayınlamalarına yardımcı oluyoruz. Ayrıca, geçiş sürecinde size rehberlik etmek için Android Studio'daki AGP Yükseltme Yardımcısı'nı geliştirmeye devam edeceğiz.

Yeni DSL veya Variant API'de eksik özellikler olduğunu fark ederseniz lütfen en kısa sürede bir sorun kaydı oluşturun.

Yerleşik Kotlin

Android Gradle eklentisi 9.0, yerleşik Kotlin desteği sunar ve bu desteği varsayılan olarak etkinleştirir. Bu nedenle, Kotlin kaynak dosyalarını derlemek için artık derleme dosyalarınızda org.jetbrains.kotlin.android (veya kotlin-android) eklentisini uygulamanız gerekmez. Bu, Kotlin'in AGP ile entegrasyonunu basitleştirir, kullanımdan kaldırılan API'lerin kullanılmasını önler ve bazı durumlarda performansı artırır.

Bu nedenle, projenizi AGP 9.0'a yükselttiğinizde yerleşik Kotlin'e geçmeniz veya kapsam dışında kalmayı seçmeniz gerekir.

Ayrıca, Kotlin kaynakları olmayan Gradle alt projeleri için yerleşik Kotlin desteğini seçerek devre dışı bırakabilirsiniz.

Kotlin Gradle eklentisine çalışma zamanı bağımlılığı

Android Gradle eklentisi 9.0, yerleşik Kotlin desteği sağlamak için artık Kotlin Gradle eklentisi (KGP) 2.2.10'a çalışma zamanı bağımlılığına sahiptir. Bu nedenle artık KGP sürümü bildirmeniz gerekmez. 2.2.10'dan eski bir KGP sürümü kullanıyorsanız Gradle, KGP sürümünüzü otomatik olarak 2.2.10'a yükseltir. Benzer şekilde, 2.2.10-2.0.2'den eski bir KSP sürümü kullanıyorsanız AGP, KGP sürümüyle eşleşmesi için KSP sürümünü 2.2.10-2.0.2'ye yükseltir.

Daha yeni bir KGP sürümüne yükseltme

KGP veya KSP'nin daha yüksek bir sürümünü kullanmak için üst düzey derleme dosyanıza aşağıdakileri ekleyin:

buildscript {
    dependencies {
        // For KGP
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")

        // For KSP
        classpath("com.google.devtoolsksp:symbol-processing-gradle-plugin:KSP_VERSION")
    }
}

Daha eski bir KGP sürümüne geçme

KGP sürümünü yalnızca yerleşik Kotlin'i devre dışı bıraktıysanız düşürebilirsiniz. Bunun nedeni, AGP 9.0'da yerleşik Kotlin'in varsayılan olarak etkinleştirilmesi ve yerleşik Kotlin'in KGP 2.2.10 veya sonraki sürümleri gerektirmesidir.

KGP veya KSP'nin daha eski bir sürümünü kullanmak için katı sürüm bildirimi kullanarak bu sürümü üst düzey derleme dosyanızda bildirin:

buildscript {
    dependencies {
        // For KGP
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
            version { strictly("KGP_VERSION") }
        }

        // For KSP
        classpath("com.google.devtoolsksp:symbol-processing-gradle-plugin") {
            version { strictly("KSP_VERSION") }
        }
    }
}

Düşürebileceğiniz minimum KGP sürümünün 2.0.0 olduğunu unutmayın.

Test armatürleri için IDE desteği

AGP 9.0, test armatürleri için tam Android Studio IDE desteği sunar.

Fused Library Plugin

Fused Library Plugin (Önizleme), birden fazla kitaplığı tek bir Android kitaplığı AAR olarak yayınlamanıza olanak tanır. Bu sayede kullanıcılarınız yayınladığınız yapay nesnelere daha kolay güvenebilir.

Başlangıç hakkında bilgi için Fused Library ile birden fazla Android kitaplığını tek bir kitaplık olarak yayınlama başlıklı makaleyi inceleyin.

Davranış değişiklikleri

Android Gradle eklentisi 9.0'da aşağıdaki yeni davranışlar bulunur:

Davranış Öneri
Android Gradle eklentisi 9.0, varsayılan olarak NDK'nın r28c sürümünü kullanır. Kullanmak istediğiniz NDK sürümünü açıkça belirtmeyi düşünebilirsiniz.
Android Gradle eklentisi 9.0, kitaplık tüketicilerinin varsayılan olarak aynı veya daha yüksek bir derleme SDK'sı sürümünü kullanmasını gerektirir. Kitaplık kullanırken aynı veya daha yüksek bir derleme SDK'sı kullanın. Bu mümkün değilse veya yayınladığınız bir kitaplığın tüketicilerine geçiş için daha fazla zaman vermek istiyorsanız AarMetadata.minCompileSdk'ı açıkça ayarlayın.

AGP 9.0, aşağıdaki Gradle özelliklerinin varsayılan değerleriyle ilgili güncellemeler içerir. Bu sayede, yükseltme yaparken AGP 8.13 davranışını koruma seçeneğine sahip olursunuz:

Özellik İşlev AGP 8.13'ten AGP 9.0'a geçiş Öneri
android.newDsl android bloğunun eski uygulamalarını kullanıma sunmadan yeni DSL arayüzlerini kullanın.
Bu durum, android.applicationVariants gibi eski varyant API'lerine de erişilemeyeceği anlamına gelir. android.applicationVariants artık erişilemez.
falsetrue android.newDsl=false değerini ayarlayarak bu özelliği devre dışı bırakabilirsiniz.
Projenizin kullandığı tüm eklentiler ve derleme mantığı uyumlu olduğunda, devre dışı bırakma işlemini kaldırın.
android.builtInKotlin Yerleşik Kotlin'i etkinleştirir. falsetrue Mümkünse yerleşik Kotlin'e geçin veya özelliği devre dışı bırakın.
android.uniquePackageNames Her kitaplığın farklı bir paket adı olmasını zorunlu kılar. falsetrue Projenizdeki tüm kitaplıklar için benzersiz paket adları belirtin. Bu mümkün değilse taşıma işlemi sırasında bu işareti devre dışı bırakabilirsiniz.
android.useAndroidx Varsayılan olarak androidx bağımlılıklarını kullanın. falsetrue androidx bağımlılıklarını benimseyin.
android.default.androidx.test.runner Varsayılan olarak androidx.test.runner.AndroidJUnitRunner sınıfıyla cihaz üzerinde testler çalıştırın. Bu sınıf, kullanımdan kaldırılan InstrumentationTestRunner sınıfının varsayılan değerini değiştirir.
android {
  defaultConfig {
    testInstrumentationRunner = "..."
  }
}
falsetrue Kullanın AndroidJUnitRunner veya özel testInstrumentationRunner değerinizi açıkça belirtin.
android.dependency.useConstraints Yapılandırmalar arasındaki bağımlılık kısıtlamalarının kullanımını kontrol eder.
AGP 9.0'daki varsayılan değer false olup yalnızca uygulama cihazı testlerindeki (AndroidTest) kısıtlamaları kullanır. Bu ayarı true olarak ayarlamak, 8.13 sürümündeki davranışa geri dönülmesini sağlar.
truefalse Gerekmedikçe her yerde bağımlılık kısıtlamaları kullanmayın. Bu işaretin yeni varsayılanını kabul etmek, proje içe aktarma sürecinde optimizasyonları da etkinleştirir. Bu optimizasyonlar, çok sayıda Android kitaplığı alt projesi içeren derlemelerin içe aktarma süresini kısaltır.
android.enableAppCompileTimeRClass Uygulamalardaki kodu nihai olmayan bir R sınıfına göre derleyerek uygulama derlemesini kitaplık derlemesiyle uyumlu hale getirin.
Bu, artımlılığı iyileştirir ve kaynak işleme akışında gelecekte yapılacak performans optimizasyonlarının önünü açar.
falsetrue Birçok proje, kaynakta değişiklik yapmadan yeni davranışı benimseyebilir. R sınıfı alanları, sabit gerektiren herhangi bir yerde (ör. switch ifadeleri) kullanılıyorsa zincirleme if ifadeleri kullanmak için yeniden düzenleyin.
android.sdk.defaultTargetSdkToCompileSdkIfUnset Uygulamalarda ve testlerde hedef SDK sürümü için varsayılan değer olarak derleme SDK sürümünü kullanır.
Bu değişiklikten önce hedef SDK sürümü, varsayılan olarak minimum SDK sürümü oluyordu.
falsetrue Uygulamalar ve testler için hedef SDK sürümünü açıkça belirtin.
android.onlyEnableUnitTestForTheTestedBuildType Yalnızca test edilen derleme türü için birim testi bileşenleri oluşturur.
Varsayılan projede bu, hata ayıklama için tek bir birim testiyle sonuçlanır. Önceki davranış, hata ayıklama veya yayın için birim testlerinin çalıştırılmasıydı.
falsetrue Projenizde hem hata ayıklama hem de yayın için testlerin çalıştırılması gerekmiyorsa herhangi bir değişiklik yapmanız gerekmez.
android.proguard.failOnMissingFiles AGP DSL'de belirtilen saklanacak dosyalardan herhangi biri diskte yoksa derleme işlemi hatayla sonuçlanır. Bu değişiklikten önce, dosya adlarındaki yazım hataları dosyaların sessizce yoksayılmasına neden oluyordu. falsetrue Geçersiz ProGuard dosyası bildirimlerini kaldırın.
android.r8.optimizedResourceShrinking R8'in sınıfları ve Android kaynaklarını birlikte değerlendirerek daha az Android kaynağını korumasına olanak tanır. falsetrue Projenizin saklama kuralları zaten tamamlanmışsa herhangi bir değişiklik yapmanız gerekmez.
android.r8.strictFullModeForKeepRules Bir sınıf korunurken varsayılan oluşturucuyu örtülü olarak korumayarak R8'in daha az şey korumasına olanak tanır. Yani, -keep class A artık -keep class A { <init>(); }
anlamına gelmiyor.
falsetrue Projenizin saklama kuralları zaten tamamlanmışsa herhangi bir değişiklik yapmanız gerekmez.

Varsayılan -keep class A yapılandırıcının korunması gereken tüm durumlarda, projenizin saklama kurallarında -keep class A { <init>(); } ile değiştirin.
android.defaults.buildfeatures.resvalues Tüm alt projelerde resValues özelliğini etkinleştirir. truefalse Yalnızca ihtiyaç duyan alt projelerde resValues özelliğini etkinleştirmek için bu projelerin Gradle derleme dosyalarında aşağıdakileri ayarlayın:
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders Tüm alt projelerde gölgelendirici derlemeyi etkinleştirir. truefalse Yalnızca derlenecek gölgelendiriciler içeren alt projelerde gölgelendirici derlemesini etkinleştirmek için bu projelerin Gradle derleme dosyalarında aşağıdakileri ayarlayın:
android {
  buildFeatures {
    shaders = true
  }
}
android.r8.proguardAndroidTxt.disallowed AGP 9.0'da getDefaultProguardFile(), proguard-android.txt yerine yalnızca proguard-android-optimize.txt'yi destekleyecektir. Bu, proguard-android.txt içinde yer alan ­dontoptimize işaretinin yanlışlıkla kullanılmasını önlemek içindir. falsetrue Optimizasyonu önlemek istiyorsanız proguard-android-optimize.txt kullanmanın yanı sıra özel bir proguardFile'da ­dontoptimize değerini açıkça belirtebilirsiniz. Mümkünse bu dosyadan ­dontoptimize işaretini kaldırın. Bu işaret, R8 optimizasyonunun avantajlarını azaltır. Aksi takdirde android.r8.globalOptionsInConsumerRules.disallowed=false ayarını yaparak kapsam dışında kalabilirsiniz.
android.r8.globalOptionsInConsumerRules.disallowed AGP 9.0'dan itibaren, tüketici saklama dosyaları sorunlu Proguard yapılandırmaları içeriyorsa Android kitaplığı ve özellik modülü yayınlama işlemi başarısız olur. ­dontoptimize veya ­dontobfuscate gibi genel seçenekleri içeren tüketici saklama dosyaları yalnızca uygulama modüllerinde kullanılmalı ve kitaplık kullanıcıları için optimizasyon avantajlarını azaltabilir. Android uygulama modülü derlemesi, önceden derlenmiş bir bağımlılığa (JAR veya AAR) yerleştirilmişse bu tür genel seçenekleri sessizce yoksayar. Bu durumun ne zaman gerçekleştiğini, configuration.txt dosyasında (genellikle <app_module>/build/outputs/mapping/<build_variant>/configuration.txt gibi bir yolda) şu tür yorumları kontrol ederek görebilirsiniz: # REMOVED CONSUMER RULE: ­dontoptimize falsetrue Yayınlanan kitaplıklar, uyumsuz kuralları kaldırmalıdır. Dahili kitaplıklar, uyumsuz ancak gerekli kuralları bunun yerine bir uygulama modülündeki proguardFile'a taşımalıdır. android.r8.globalOptionsInConsumerRules.disallowed=false ayarını yaparak devre dışı bırakabilirsiniz. Tüm tüketici saklama dosyalarınız uyumlu hale geldiğinde devre dışı bırakma işlemini kaldırın.
android.sourceset.disallowProvider AndroidSourceSet DSL'yi kullanarak oluşturulan kaynaklar için sağlayıcıların iletilmesine izin vermeyin. falsetrue Oluşturulan kaynakları kaydetmek için androidComponents üzerinde Sources API'yi kullanın.
android.custom.shader.path.required Gölgelendirici derleme etkinse gölgelendirici derleyici yolunun local.properties içinde açıkça ayarlanması gerekir. falsetrue Projenizin glslc.dir=/path/to/shader-tools bölümüne local.properties ekleyin.

Kaldırılan özellikler

Android Gradle eklentisi 9.0, aşağıdaki işlevleri kaldırır:

  • Yerleştirilmiş Wear OS uygulaması desteği
    AGP 9.0, Wear OS uygulamalarının yerleştirilmesiyle ilgili desteği kaldırıyor. Bu özellik artık Play'de desteklenmiyor. Bu kapsamda, wearApp yapılandırmaları ve AndroidSourceSet.wearAppConfigurationName DSL'nin kaldırılması da yer alır. Uygulamanızı Wear OS'te yayınlama hakkında bilgi edinmek için Wear OS'e dağıtma başlıklı makaleyi inceleyin.
  • androidDependencies ve sourceSets rapor görevleri
  • Yoğunluğa göre bölünmüş APK desteği
    AGP 9.0, ekran yoğunluğuna göre bölünmüş APK oluşturma desteğini kaldırıyor. İşlev ve ilgili API'ler kaldırıldı. AGP 9.0 veya sonraki sürümleri kullanarak APK'ları ekran yoğunluğuna göre bölmek için uygulama paketlerini kullanın.

Değiştirilen DSL

Android Gradle eklentisi 9.0'da aşağıdaki DSL değişiklikleri yapıldı:

  • CommonExtension parametrelendirmesi kaldırıldı.

    Bu değişiklik, gelecekte kaynak düzeyinde uyumluluğu bozacak değişiklikleri önlemeye yardımcı olmak için yalnızca kaynak düzeyinde uyumluluğu bozacak bir değişikliktir. Ancak bu, blok yöntemlerinin CommonExtension'den ApplicationExtension, LibraryExtension, DynamicFeatureExtension ve TestExtension'ye taşınması gerektiği anlamına da gelir.

    Projenizi AGP 9.0'a yükseltirken bu parametreleri veya blok yöntemlerini kullanan Gradle eklenti kodunu yeniden düzenleyin. Örneğin, aşağıdaki eklenti, tür parametresini kaldıracak ve kaldırılan blok yöntemlerine dayanmayacak şekilde güncellenir:

    AGP 8.13

    val commonExtension: CommonExtension<*, *, *, *, *, *> =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig {
            minSdk {
                version = release(28)
            }
        }
    }
    

    AGP 9.0

    val commonExtension: CommonExtension =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig.apply {
            minSdk {
                version = release(28)
            }
        }
    }
    

    Bir dizi AGP sürümünü hedefleyen eklentilerde, getter'ı doğrudan kullanmak 9.0'dan önceki AGP sürümleriyle ikili uyumludur.

Kaldırılan DSL

Android Gradle eklentisi 9.0'da kaldırılanlar:

Kaldırılan API'ler

Android Gradle eklentisi 9.0'da kaldırılanlar:

Kaldırılan Gradle özellikleri

Aşağıdaki Gradle özellikleri, başlangıçta varsayılan olarak etkinleştirilen özellikleri genel olarak devre dışı bırakmanın yolları olarak eklenmişti.

Bu özellikler, AGP 8.0 veya daha eski sürümlerde varsayılan olarak devre dışı bırakılmıştır. Daha verimli bir derleme için bu özellikleri yalnızca bunları kullanan alt projelerde etkinleştirin.

Özellik İşlev Değiştirme
android.defaults.buildfeatures.aidl Tüm alt projelerde AIDL derlemesini etkinleştirir. Yalnızca AIDL kaynaklarının bulunduğu alt projelerde AIDL derlemesini etkinleştirmek için bu projelerin Gradle derleme dosyalarında aşağıdaki özelliği ayarlayın:
android {
  buildFeatures {
    aidl = true
  }
}
AIDL kaynaklarını içeren her alt projenin Gradle derleme dosyasında
android.defaults.buildfeatures.renderscript Tüm alt projelerde RenderScript derlemesini etkinleştirir. Yalnızca renderscript kaynaklarının bulunduğu alt projelerde aşağıdaki özelliği bu projelerin Gradle derleme dosyalarında ayarlayarak renderscript derlemesini etkinleştirin:
android {
  buildFeatures {
    renderScript = true
  }
}

Zorunlu kılınan Gradle özellikleri

Aşağıdaki Gradle özelliklerini ayarlarsanız AGP 9.0 hata verir.

Android Gradle eklentisi Upgrade Assistant, bu özellikleri kullanan projeleri AGP 9.0'a yükseltmez.

Özellik İşlev
android.r8.integratedResourceShrinking Kaynak küçültme artık her zaman R8'in bir parçası olarak çalıştırılıyor. Önceki uygulama kaldırıldı.
android.enableNewResourceShrinker.preciseShrinking Kaynak küçültme artık her zaman hassas kaynak küçültme kullanıyor. Bu sayede daha fazla kaynak kaldırılabiliyor.

R8 değişiklikleri

Aşağıdaki R8 değişiklikleri AGP 9.0.0'a dahil edilmiştir.

Yeni yapılandırma seçeneği -processkotlinnullchecks

Kotlin null denetimlerinin işlenmesi için R8'i yapılandırmak üzere yeni R8 seçeneği -processkotlinnullchecks eklendi. Seçenek, zorunlu bir bağımsız değişken alır ve bu bağımsız değişken şu üç değerden biri olmalıdır: keep, remove_message ve remove. Bu seçenek, Kotlin derleyicisi tarafından eklenen aşağıdaki boşluk kontrollerini işler:

class kotlin.jvm.internal.Intrinsics {
  void checkNotNull(java.lang.Object);
  void checkNotNull(java.lang.Object, java.lang.String);
  void checkExpressionValueIsNotNull(
      java.lang.Object, java.lang.String);
  void checkNotNullExpressionValue(
      java.lang.Object, java.lang.String);
  void checkReturnedValueIsNotNull(
      java.lang.Object, java.lang.String);
  void checkReturnedValueIsNotNull(
      java.lang.Object, java.lang.String, java.lang.String);
  void checkFieldIsNotNull(java.lang.Object, java.lang.String);
  void checkFieldIsNotNull(
      java.lang.Object, java.lang.String, java.lang.String);
  void checkParameterIsNotNull(java.lang.Object, java.lang.String);
  void checkNotNullParameter(java.lang.Object, java.lang.String);
}

En zayıftan en güçlüye doğru sıralanan seçenek değerleri aşağıdaki etkiye sahiptir:

  • keep kontrolleri değiştirmez.
  • remove_message, her kontrol yöntemi çağrısını, çağrının ilk bağımsız değişkeninde remove_message çağrısı olarak yeniden yazar (bu sayede, null kontrolü mesaj olmadan etkili bir şekilde korunur).getClass()
  • remove, kontrolleri tamamen kaldırır.

R8 varsayılan olarak remove_message kullanır. -processkotlinnullchecks ile ilgili tüm tanımlamalar bunu geçersiz kılar. Birden fazla kez belirtilirse en güçlü değer kullanılır.

Saklama bilgilerinin tamamlayıcı yöntemlere yayılmasını durdurma

Koruma kuralları, desugaring işlemine tabi olan arayüz yöntemleriyle eşleştiğinde R8, disallow optimization ve disallow shrinking bitlerini daha önce dahili olarak sentezlenmiş yardımcı yöntemlere aktarıyordu.

AGP 9.0'dan itibaren, saklama kuralları artık yardımcı yöntemler için geçerli değildir. Bu, saklama kurallarının derleyici tarafından sentezlenen diğer alanlar/yöntemler/sınıflar için geçerli olmamasıyla tutarlıdır.

Optimizasyona izin verme ve küçültmeye izin verme bitleri yardımcı yöntemlere aktarıldığından daha önce aşağıdaki kullanım alanı destekleniyordu:

  1. default/static/private arayüz yöntemleriyle bir kitaplık oluşturun. Bu kitaplık, minSdk < 24 olan DEX'e ve arayüz yöntemlerini koruyan kurallara sahip olmalıdır.
  2. Sınıf yolunda kitaplık ve -applymapping ile bir uygulama derleyin.
  3. Uygulamayı ve kitaplığı birleştirin.

disallow obfuscation biti tamamlayıcı yöntemlere aktarılmadığından bu işlevin yalnızca -applymapping ile çalıştığını unutmayın. Yani 1. adımda oluşturulan tamamlayıcı sınıfların, karartılmış yöntem adları olur.

Bu kullanım alanı, minSdk < 24 sürümünden itibaren artık desteklenmeyecek. Geçici çözüm olarak aşağıdakileri yapın:

  1. default/static/private arayüz yöntemleriyle kitaplığı, minSdk < 24 olan sınıf dosyaları için dönüştürün.
  2. R8'i ve arayüz yöntemlerini yardımcı sınıflarda tutan kuralları kullanarak şekeri alınmış yapıyı derleyin.
  3. Uygulamayı, sınıf yolundaki kitaplıkla derleyin.
  4. Uygulamayı ve desugared yapıyı birleştirin.

Bunun bir diğer yan etkisi de anonim ve yerel sınıflar için iç sınıf ve kapsayan yöntem özelliklerinin artık arayüz eşlikçi yöntemlerinde tutulamamasıdır.

Varsayılan olarak yayınlanan kaynak dosyanın adını r8-map-id-<MAP_ID> olarak değiştirin.

Bu değişiklik, 8.12.0 sürümünden itibaren AGP'de yer almaktadır.

Bir sınıf için varsayılan olarak verilen kaynak dosya özelliği, yeniden izleme gerektiğinde (yani karartma veya optimizasyon etkinleştirildiğinde) SourceFile olarak değişir.r8-map-id-<MAP_ID>

Yeni kaynak dosyası özelliği, karartılmış bir yığın izi verildiğinde yeniden izleme için gereken eşleme dosyasının kimliğini ayıklamayı mümkün kılar. Bu kimlik, Logcat'teki yığın izlerinin otomatik olarak yeniden izlenmesini desteklemek için kullanılabilir.

Özel bir kaynak dosyası özelliği kullanılıyorsa (-renamesourcefileattribute) bu özel kaynak dosyası özelliği öncelikli olmaya devam eder.

ProGuard uyumluluk modunda (gradle.properties, android.enableR8.fullMode=false içerdiğinde), r8-map-id-<MAP_ID> kaynak dosyası özelliğinin yayınlanması yalnızca SourceFile özelliği korunmadığında geçerli olur. ProGuard uyumluluk modunu kullanan ve eşleme dosyası kimliğini yığın izlerine eklemek isteyen uygulamalar -keepattributes SourceFile öğesini kaldırmalıdır (veya R8 tam moduna geçmelidir).

r8-map-id-<MAP_ID> içinde kullanılan harita kimliği, daha önce kullanılan 7 karakterlik harita karması öneki değil, tam harita karmasıdır.

L8 desugaring'de küçültülmüş sentetik adların kullanımını etkinleştirme

D8 tarafından oluşturulan yapay sınıfların adı genellikle, bunun D8 tarafından oluşturulan yapay bir sınıf olduğunu belirten $$ExternalSynthetic alt dizesini içerir. Ayrıca, sentetiklerin adı da sentetik türünü (örneğin, Backport, Lambda) kodlar. Bu durum, sınıf adları dize havuzunda daha fazla yer kapladığından sonuçtaki DEX boyutunu olumsuz etkiler.

AGP 9.0, L8'i (çekirdek kitaplık desugaring) tüm j$ sınıflarını içeren DEX dosyasının, sentetik sınıflar için yeni bir kısaltılmış sınıf adı biçimi kullanacak şekilde yapılandırır. Yeni sınıf adı sayısal bir kimlik kullanıyor (örneğin, $1).

-addconfigurationdebugging için desteği kaldırma

AGP 9.0, -addconfigurationdebugging desteğini kaldırıyor. Derleyici artık işaret kullanıldığında uyarı bildiriyor.

D8/R8'den L8 kuralları oluşturma desteği kaldırıldı

Bu değişiklik yalnızca D8/R8 komut satırını veya API'leri doğrudan kullanan geliştiriciler için geçerlidir.

R8 9.0, D8 ve R8'den L8 için saklama kuralları oluşturma desteğini kaldırır. Bunun yerine TraceReferences kullanmalısınız.

Daha spesifik olarak, D8Command.builder.setDesugaredLibraryKeepRuleConsumer ve R8Command.Builder.setDesugaredLibraryKeepRuleConsumer yöntemleri kaldırıldı ve --desugared-lib-pg-conf-output desteği, D8 ve R8'in komut satırı seçeneklerinden kaldırıldı.

Çözülen sorunlar

Android Gradle eklentisi 9.0.0

Çözülen Sorunlar
Android Gradle Eklentisi
Özellik isteği: İdeal AGP sürümünü özellik olarak ekleme
SingleArtifact.VERSION_CONTROL_INFO_FILE öğesini kararlı kıl
androidTest connectedCheck logcat çıktısı bozuk
AGP'deki yerleşik Kotlin desteği, Kotlin kaynak kümeleriyle senkronize edilmemelidir.
missingDimensionStrategy, alakasız bir boyuttan olsa bile kendi adıyla eşleşen bir lezzeti tercih ediyor
AGP'deki yerleşik Kotlin desteği, Kotlin kaynak kümeleriyle senkronize edilmemelidir.
AGP 9.0.0-rc01, Kotlin kitaplıklarını kotlin() işlevi aracılığıyla çözmüyor
Built-in-kotlin, kotlin-stdlib bağımlılık kısıtlamasını Maven POM'da yayınlamıyor
compileSdk ile targetSdk arasındaki farklılık için test durumu ekleyin
Boş resConfigs değeri, anlaşılması zor bir aapt hatasına yol açıyor
Saf Java projeleri, Kotlin stdlib'e bağlıdır.
AGP 9.0'da kullanımdan kaldırılan KotlinMultiplatformAndroidCompilationBuilder özelliklerini kaldırma
`com.android.tools.build:gradle:9.0.0-alpha05`, KGP ve gradle-api üzerinde bir API bağımlılığına sahip olmalıdır.
com.android.experimental.built-in-kotlin Gradle eklentisini yeniden adlandırma
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` çalışmıyor
Derleme SDK'sındaki Aar meta veri kontrolleri eski DSL'yi kullanıyor
Kullanımdan kaldırılan `com.android.build.api.dsl.ManagedDevices.devices` özelliğini kaldırın
AGP'deki yerleşik Kotlin desteği, Kotlin kaynak kümeleriyle senkronize edilmemelidir.
Tüketici saklama dosyası -dontobfuscate içeriyorsa Android kitaplık yayınlama işlemi başarısız olur.
Optimize Edilmiş Kaynaklar İçin Yazdırma Eşleme Seçenekleri Yok
Bu aşama geçildikten sonra finalizeDsl'nin çağrılması hata olarak kabul edilir.
AGP, Jetifier devre dışı bırakılmış olsa bile Jetifier yapılandırmasını başlatıyor
Kotlin ile oluşturulan uygulamalarda, `kotlin.stdlib.default.dependency` modül ve pom dosyaları için doğru olduğunda kotlinStdlib derleme zamanı bağımlılığı olarak eklenmiyor
Yeni optimizasyon DSL'si varsayılan olarak configuration.txt oluşturmaz
AGP 8.13.0, bir modüldeki gezinme grafiğini doğrulayamıyor
AGP, kullanımdan kaldırılan Gradle API'sini kullanıyor: çok dizeli gösterim
minSdkVersion değeri >=21 olan eski multidex kitaplığını kullanmaya çalışan kullanıcıları uyarma
Kod oluşturma görevleri varsa derleme başarısız olur
`android.builtInKotlin=false`, `android.newDsl=false` ve `android.enableLegacyVariantApi=false` ile `kotlin-android` eklentisinin kullanılması "API 'applicationVariants' is obsolete" (API 'applicationVariants' kullanım dışı) hatasıyla başarısız oluyor.
kotlin.stdlib.default.dependency=false olduğunda yerleşik Kotlin, sürüm içermeyen kotlin-stdlib'i çözemiyor
DexData, dosyayı kapatmadan açtığı için temizleme işlemi engelleniyor
AndroidSourceDirectorySet, AGP 9.0'da PatternFilterable'ı genişletmeyi bırakmalıdır.
Yalnızca test modüllerinde test düzeneği hatası
Test armatürlerinde bağlam alıcıları kullanılırken yanlış hata
testFixtures'daki Kotlin kodu için yanlış IDE hataları
`legacy-kapt` eklentisi, `kotlin-kapt` eklentisinin aksine ek açıklama işlemeyi atlıyor
compileSdkSpec.minorApiLevel, SettingsExtension ile çalışmıyor
[fused lib - public] Oluşturulan birleştirilmiş kitaplık kaynakları içermiyor
extractNativeLibs ve useEmbeddedDex, manifest dosyasından gelmemelidir.
AGP 9.0.0-alpha09'da R8'den gelen uyarılar
AGP 9.0'da desteği sonlandırılan AndroidSourceSet.jni'yi kaldırma
AGP 9.0'da Installation.installOptions() öğesini kaldırma
AGP 9.0'da BuildType.isRenderscriptDebuggable'ı kaldırın.
android.defaults.buildfeatures.renderscript öğesini kaldırın.
`com.android.kotlin.multiplatform.library`, Gradle tarafından yönetilen cihazlarda kilitleniyor
`android.defaults.buildfeatures.aidl` varsayılan gradle.properties işaretlerini kaldırın.
Proguard dosyası mevcut olmadığında derleme başarısız oluyor
remove buildconfig defaults gradle.properties flags
Uygulamanın targetSdk varsayılan değerini minSdk yerine compileSdk'ye göre olacak şekilde değiştirme
`isIncludeAndroidResources` etkinleştirildiğinde `process{Variant}UnitTestManifest`, AGP 8.12.0'da tools:overrideLibrary kullanımlarını birleştiremiyor
AGP, JVM test görevleri için Gradle'da desteğin sonlandırılmasıyla ilgili uyarılara neden oluyor
DependencyReportTask, yapılandırma önbelleğiyle uyumlu değil
AGP 9.0'da varsayılan kaynak/hedef Java sürümünü Java 8'den Java 11'e geçirme
android.useAndroidX varsayılan değerini true olarak değiştirin.
Dahili Kotlin ile kapt eklentisi uygulanırken daha iyi istisna.
android.proguard.failOnMissingFiles, consumerProguardFiles için çalışmıyor
Kotlin Gradle eklentisi bağımlılığı 2.2.10 sürümüne güncellendi
KGP API'sini kullanarak KotlinJvmAndroidCompilation oluşturma
Kotlin açık API modu, test kaynaklarına uygulandı
Hata analizi
AGP 8.11.0: .gradle.kts dosyaları apply(from = "...") ile uygulandığında lintAnalyzeRelease görevi kilitleniyor
Lint ChecksSdkIntAtLeast Check, açıklama eklenen değerin doğru olup olmadığını kontrol etmiyor
Yerleşik Kotlin, META-INF'ye .kotlin_module eklemiyor
Lint classpath, farklı sürümlerde yinelenen sınıflar içeriyor
Özel kaynakları geçersiz kılma geçici çözümü çalışmıyor (tools:override = "true")
Hata: Kullanılmayan kaynakların kaldırılması, bu kaynakların çevirilerini de kaldırmıyor ve bu konuda soru sormuyor.
Lint, "K2 önbellekleri temizlenemedi" uyarısını veriyor
Lint, "K2 önbellekleri temizlenemedi" uyarısını veriyor
Hata Analizi Entegrasyonu
systemPropertyInputs.javaVersion farklılıkları nedeniyle farklı JDK satıcıları veya küçük sürümlerde AndroidLintAnalysisTask önbelleğinda bulunamama sorunları
Lint, compileSdk'ya rağmen en son yüklenen SDK'yı otomatik olarak kullanıyor, görev girişi olarak kaydedilmiyor ve önbelleğe almayı bozuyor
Shrinker (R8)
Son kaynak kimlikleri kullanılıyorsa R8 ile optimize edilmiş kaynak küçültme işlemi sessizce başarısız oluyor