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 Asistanı'nı kullanın. AGP Upgrade Assistant, projenizi yükseltirken mevcut davranışları korumanıza yardımcı olur. Böylece, AGP 9.0'daki tüm yeni varsayılanları kullanmaya hazır olmasanız bile projenizi AGP 9.0'ı kullanacak şekilde yükseltebilirsiniz.
Yükseltme sürecini kolaylaştırmak için kullanabileceğiniz iki temsilci becerisi de vardır. KMP olmayan bir uygulama için Android beceri deposundaki AGP 9 yükseltme becerisini deneyin. KMP uygulaması için JetBrains'in AGP 9 yükseltme becerisini deneyin. Android Studio'da becerileri kullanma hakkında daha fazla bilgi için Temsilci modunu becerilerle genişletme başlıklı makaleyi inceleyin.
Uyumluluk
Android Gradle eklentisi 9.0'ın desteklediği maksimum API düzeyi 36.1'dir. 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 bölümüne bakın. |
| Kotlin Gradle eklentisi (KGP) | 2.2.10 | 2.2.10 | Daha fazla bilgi edinmek için Kotlin Gradle eklentisine çalışma zamanı bağımlılığı başlıklı makaleyi inceleyin. |
android DSL sınıfları artık yalnızca yeni herkese açık arayüzleri uygular.
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 gizli olan yeni türlere değiştirilmiştir. Bu işlem, eski ve desteği sonlandırılmış değişken 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.androideklentisi yeni DSL ile uyumlu değil. KMP projelerini KMP için Android Gradle Kitaplığı Eklentisi'ne geçirin:
org.jetbrains.kotlin.multiplatformeklentisinicom.android.libraryvecom.android.applicationeklentileriyle aynı Gradle alt projesinde kullanmak yeni DSL ile uyumlu değildir.Derleme dosyalarınızı güncelleyin: Arayüzlerdeki değişiklik, DSL'yi mümkün olduğunca benzer tutmayı 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şim olacaktır.
applicationVariantsve benzer API'lerin kullanımını yeniandroidComponentsAPI ile değiştirin.androidComponentsAPI'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 tariflerimize göz atın.Üçüncü taraf eklentilerini güncelleme: Bazı üçüncü taraf eklentileri, artık kullanılamayan arayüzlere veya API'lere bağlı olabilir. Bu eklentilerin AGP 9.0 ile uyumlu sürümlerine geçiş yapın.
Yeni DSL arayüzlerine geçiş, eklentilerin ve Gradle derleme komut dosyalarının, aşağıdakiler de dahil olmak üzere desteği sonlandırılmış çeşitli API'leri kullanmasını engeller:
android bloğunda desteği sonlandırılmış API |
İşlev | Değiştirme |
|---|---|---|
applicationVariants,libraryVariants,testVariants veunitTestVariants
|
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) } } |
variantFilter
|
Seçilen varyantların devre dışı bırakılmasına izin verir. |
Bunu androidComponents.beforeVariants API'si ile değiştirin. Örneğin:
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider vetestServer
|
Android cihazlar ve emülatörler üzerinde test çalıştırmak için özel test ortamlarının kaydı. | Gradle tarafından yönetilen cihazlar'a geçin. |
sdkDirectory,ndkDirectory,bootClasspath,adbExecutable veadbExe
|
Özel görevler için Android SDK'nın çeşitli bileşenlerini kullanma |
androidComponents.sdkComponents'e geçin.
|
registerArtifactType,registerBuildTypeSourceProvider,registerProductFlavorSourceProvider,registerJavaArtifact,registerMultiFlavorSourceProvider vewrapJavaSourceSet |
Android Studio'da oluşturulan kaynakların işlenmesiyle ilgili olan ve AGP 7.2.0'da çalışmayı durduran eski 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 ayarların hiçbirinin etkisi yoktur.
|
Doğrudan bir alternatif yoktur. |
generatePureSplits
|
Hazır uygulamalar için yapılandırma bölmeleri oluşturma | Yapılandırma bölmelerini gönderme özelliği artık Android App Bundle'lara yerleşik olarak eklenmiştir. |
aidlPackagedList
|
Bu kitaplığa bağlı kitaplıklar ve uygulamalar için API olarak sunmak üzere AAR'da paketlenecek AIDL dosyaları. |
Bu, LibraryExtension üzerinde hâlâ gösterilir ancak diğer uzantı türlerinde gösterilmez.
|
AGP 9.0'a güncellediğinizde aşağıdaki hata mesajını görüyorsanız 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 nedeniyle engelleniyorsanız devre dışı bırakabilir ve DSL için eski uygulamaları ve eski değişken API'yi geri alabilirsiniz.
Bu süreçte yeni arayüzler de kullanılabilir ve kendi derleme mantığınızı yeni API'ye güncelleyebilirsiniz. Kapsam dışında kalmak için gradle.properties dosyanıza şu satırı ekleyin:
android.newDsl=false
Alternatif olarak, daha kademeli bir taşıma işlemi için AGP 9.4, modülleri tek tek devre dışı bırakmanıza olanak tanır. Bunun nasıl yapılacağını öğrenmek için Varyant API modülünün kapsamı dışında kalmayı seçme başlıklı makaleyi inceleyin.
Önceki sınıflar, AGP 9.0'da desteği sonlandırılmış olarak işaretlenir. Bu, newDsl işaretini devre dışı bırakan projelerin, android bloğunun kendisi de dahil olmak üzere desteğin sonlandırılmasıyla ilgili uyarılar göreceği anlamına gelir.
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 mevcut olduğundan yeni ve eski arayüzleri bir arada kullanabilirsiniz. AGP API referans belgeleri, her AGP sürümü için API yüzeyini ve her sınıfın, yöntemin ve alanın ne zaman eklendiğini gösterir.
En çok tercih edilen eklentilerin yazarlarıyla iletişime geçerek yeni modlarla tam uyumlu eklentiler uyarlamalarına ve yayınlamalarına yardımcı oluyoruz. Ayrıca, geçiş sürecinde size rehberlik etmesi için Android Studio'daki AGP Yükseltme Asistanı'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 sorun bildirin.
Yerleşik Kotlin
Android Gradle eklentisi 9.0, yerleşik Kotlin desteği sunar ve bu desteği varsayılan olarak etkinleştirir. Bu sayede, Kotlin kaynak dosyalarını derlemek için derleme dosyalarınıza org.jetbrains.kotlin.android (veya kotlin-android) eklentisini uygulamanız gerekmez.
Bu sayede Kotlin'in AGP ile entegrasyonu basitleşir, desteği sonlandırılmış API'lerin kullanımı önlenir ve bazı durumlarda performans artar.
Bu nedenle, projenizi AGP 9.0'a yükselttiğinizde yerleşik Kotlin'e de geçmeniz veya devre dışı bırakmanız gerekir.
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, artık KGP sürümü beyan etmeniz gerekmediği anlamına gelir. 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 bu sürümü 2.2.10-2.0.2'ye yükseltir.
Daha yüksek bir KGP sürümüne yükseltin
KGP veya KSP'nin daha yeni 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.devtools.ksp: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 eski sürüme geçirebilirsiniz. Bunun nedeni, AGP 9.0'ın yerleşik Kotlin'i varsayılan olarak etkinleştirmesi ve yerleşik Kotlin'in KGP 2.2.10 veya sonraki bir sürümü gerektirmesidir.
KGP veya KSP'nin daha eski bir sürümünü kullanmak için katı sürüm beyanı kullanarak bu sürümü üst düzey derleme dosyanızda beyan edin:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
Sürümünü düşürebileceğiniz minimum KGP sürümünün 2.0.0 olduğunu unutmayın.
Test donanımları için IDE desteği
AGP 9.0, test donanımları için tam Android Studio IDE desteği sunar.
Fused Library Plugin
Fused Library eklentisi (önizleme), birden fazla kitaplığı tek bir Android kitaplığı AAR'si olarak yayınlamanıza olanak tanır. Bu sayede kullanıcılarınız, yayınladığınız yapıları daha kolay kullanabilir.
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 r28c sürümünü kullanır.
|
Kullanmak istediğiniz NDK sürümünü açıkça belirtmeniz önerilir. |
| Android Gradle eklentisi 9.0, varsayılan olarak bir kitaplığın tüketicilerinin aynı veya daha yüksek derleme SDK sürümünü kullanmasını gerektirir. |
Bir kitaplığı kullanırken aynı veya daha yüksek derleme SDK'sını kullanın.
Bu mümkün değilse veya yayınladığınız bir kitaplığın kullanıcılarına geçiş için daha fazla zaman tanımak istiyorsanız AarMetadata.minCompileSdk değerini 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ı koruyabilirsiniz:
| Özellik | İşlev | AGP 8.13'ten AGP 9.0'a geçiş | Öneri |
|---|---|---|---|
android. |
android bloğunun eski uygulamalarını göstermeden yeni DSL arayüzlerini kullanın.Bu, android.applicationVariants gibi eski değişken API'sine de artık erişilemeyeceği anlamına gelir.
|
false → true |
android.newDsl=false ayarını yaparak bu özelliği devre dışı bırakabilirsiniz.Projenizin kullandığı tüm eklentiler ve derleme mantığı uyumlu hale geldikten sonra kapsam dışında kalma seçeneğini kaldırın. |
android. |
Yerleşik Kotlin'i etkinleştirir. | false → true |
Mümkünse yerleşik Kotlin'e geçin veya devre dışı bırakın. |
android. |
Her kitaplığın farklı bir paket adı olmasını zorunlu kılar. | false → true |
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. |
Varsayılan olarak androidx bağımlılıklarını kullanın.
|
false → true |
androidx bağımlılıklarını kullanın.
|
android. |
Cihaz üzerinde testleri varsayılan olarak androidx.test.runner.AndroidJUnitRunner sınıfıyla çalıştırın. Bu sınıf, InstrumentationTestRunner için kullanımdan kaldırılan varsayılan sınıfın yerini alır.
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
AndroidJUnitRunner'ı benimseyin veya özel testInstrumentationRunner değerinizi açıkça belirtin.
|
android. |
Yapılandırmalar arasındaki bağımlılık kısıtlamalarının kullanımını kontrol eder. AGP 9.0'da varsayılan değer false şeklindedir. Bu değer, yalnızca uygulama cihaz testlerinde (AndroidTest) kısıtlamaları kullanır.
Bu ayar true olarak belirlenirse 8.13 davranışına geri dönülür.
|
true → false |
Bağımlılık kısıtlamalarını, ihtiyacınız olmadığı sürece her yerde kullanmayın. Bu işaretin yeni varsayılan değerini kabul ettiğinizde, proje içe aktarma sürecindeki optimizasyonlar da etkinleştirilir. Bu sayede, çok sayıda Android kitaplığı alt projesi içeren derlemelerin içe aktarma süresi kısalır. |
android. |
Uygulamalardaki kodu, nihai olmayan bir R sınıfına göre derleyerek uygulama derlemesini kitaplık derlemesiyle uyumlu hale getirir. Bu sayede artımlılık iyileştirilir ve kaynak işleme akışında gelecekte yapılacak performans optimizasyonlarının önü açılır. |
false → true |
Birçok proje, kaynak değişikliği olmadan yeni davranışı benimseyebilir. R sınıfı alanları, switch-case gibi sabit değer gerektiren yerlerde kullanılıyorsa zincirleme if ifadelerini kullanacak şekilde yeniden düzenleyin. |
android. |
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üne ayarlanıyordu. |
false → true |
Uygulamalar ve testler için hedef SDK sürümünü açıkça belirtin. |
android. |
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ınlama için birim testlerinin çalıştırılmasıydı. |
false → true |
Projeniz hem hata ayıklama hem de yayınlama için testlerin çalıştırılmasını gerektirmiyorsa herhangi bir değişiklik yapmanız gerekmez. |
android. |
AGP DSL'de belirtilen saklama dosyalarından herhangi biri diskte yoksa derleme işlemi hata vererek başarısız olur. Bu değişiklikten önce, dosya adlarındaki yazım hataları dosyaların sessizce yoksayılmasına neden oluyordu. | false → true |
Geçersiz ProGuard dosyası beyanlarını kaldırın |
android. |
R8'in, sınıfları ve Android kaynaklarını birlikte değerlendirerek daha az Android kaynağı tutmasına olanak tanır. | false → true |
Projenizin saklama kuralları zaten tamamlanmışsa herhangi bir değişiklik yapmanız gerekmez. |
android. |
Bir sınıf tutulduğunda varsayılan kurucuyu örtülü olarak tutmayarak R8'in daha az tutmasına olanak tanır.
Yani -keep class A artık -keep class A { <init>(); } anlamına gelmez |
false → true |
Projenizin saklama kuralları zaten tamamlanmışsa herhangi bir değişiklik yapmanız gerekmez.
Varsayılan kurucunun saklanması gereken durumlarda projenizin saklama kurallarında -keep class A yerine -keep class A { <init>(); } kullanın.
|
android. |
Tüm alt projelerde resValues özelliğini etkinleştirir.
|
true → false |
resValues özelliğini yalnızca ihtiyaç duyan alt projelerde etkinleştirmek için bu projelerin Gradle derleme dosyalarında aşağıdaki ayarı yapın:
android {
buildFeatures {
resValues = true
}
} |
android. |
Tüm alt projelerde gölgelendirici derlemeyi etkinleştirir. | true → false |
Yalnızca derlenecek gölgelendiricileri içeren alt projelerde gölgelendirici derlemeyi etkinleştirmek için bu projelerin Gradle derleme dosyalarında aşağıdakileri ayarlayın:
android {
buildFeatures {
shaders = true
}
} |
android. |
AGP 9.0'da getDefaultProguardFile(), proguard-android.txt yerine yalnızca proguard-android-optimize.txt sürümünü destekleyecek. Bunun amacı, proguard-android.txt içinde yer alan dontoptimize işaretinin yanlışlıkla kullanılmasını önlemektir.
|
false → true |
Optimizasyondan kaçınmak istiyorsanız özel bir proguardFile'da dontoptimize değerini açıkça belirtebilir ve proguard-android-optimize.txt kullanabilirsiniz. R8 optimizasyonunun avantajlarını azalttığı için mümkünse bu dosyadan dontoptimize işaretini kaldırın. Aksi takdirde android.r8.globalOptionsInConsumerRules.disallowed=false ayarını yaparak kapsam dışında kalmayı seçin.
|
android. |
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çenekler içeren tüketici saklama dosyaları yalnızca uygulama modüllerinde kullanılmalıdır 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ş bu tür genel seçenekleri sessizce yoksayar. Bunun ne zaman gerçekleştiğini görmek için configuration.txt dosyasında (genellikle <app_module>/build/outputs/mapping/<build_variant>/configuration.txt gibi bir yolda bulunur) şu yorumları kontrol edebilirsiniz: # REMOVED CONSUMER RULE: dontoptimize
|
false → true |
Yayınlanan kitaplıklardan uyumsuz kurallar kaldırılmalıdır. Dahili kitaplıklar, uyumsuz ancak gerekli kuralları bir uygulama modülündeki proguardFile dosyasına taşımalıdır. android.r8.globalOptionsInConsumerRules.disallowed=false ayarını yaparak kapsam dışında kalabilirsiniz. Tüketici Keep dosyalarınızın tümü uyumlu hale geldiğinde kapsam dışında kalma seçeneğini kaldırın.
|
android. |
AndroidSourceSet DSL'yi kullanarak oluşturulan kaynaklar için sağlayıcıların iletilmesine izin vermeyin.
|
false → true |
Oluşturulan kaynakları kaydetmek için androidComponents üzerinde Sources API'sini kullanın.
|
android. |
Gölgelendirici derleme etkinleştirilmişse gölgelendirici derleyici yolunun local.properties içinde açıkça ayarlanması gerekir.
|
false → true |
Projenizin local.properties dosyasına glslc.dir=/path/to/shader-tools ekleyin.
|
Kaldırılan özellikler
Android Gradle eklentisi 9.0, aşağıdaki işlevleri kaldırır:
- Yerleşik Wear OS uygulaması desteği
AGP 9.0, Wear OS uygulamalarını yerleştirme desteğini kaldırır. Bu özellik artık Google Play'de desteklenmemektedir. BunawearAppyapılandırmalarının veAndroidSourceSet.wearAppConfigurationNameDSL'nin kaldırılması da dahildir. Uygulamanızı Wear OS'te nasıl yayınlayacağınızı öğrenmek için Wear OS'e dağıtma başlıklı makaleyi inceleyin. androidDependenciesvesourceSetsrapor görevi- Yoğunluğa göre bölünmüş APK desteği
AGP 9.0, ekran yoğunluğuna göre bölünmüş APK'lar oluşturma desteğini kaldırır. İşlev ve ilgili API'ler kaldırıldı. AGP 9.0 veya sonraki sürümleri kullanarak bölünmüş 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 önemli DSL değişiklikleri yapılmıştır:
CommonExtensionparametreleştirmesi kaldırıldı.Bu, gelecekte kaynak düzeyinde zarar veren değişiklikleri önlemeye yardımcı olmak için yalnızca kaynak düzeyinde zarar veren bir değişikliktir ancak aynı zamanda engelleme yöntemlerinin
CommonExtension'denApplicationExtension,LibraryExtension,DynamicFeatureExtensionveTestExtension'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öntemlerini kullanmayacak şekilde güncellenmiştir:
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) } } }Çeşitli AGP sürümlerini hedefleyen eklentiler için alıcıyı doğrudan kullanmak, 9.0'dan eski AGP sürümleriyle ikili uyumludur.
Kaldırılan DSL
Android Gradle eklentisi 9.0'da kaldırılanlar:
AndroidSourceSet.jni, işlevsel olmadığı için kaldırıldı.Kaldırılan yerleşik Wear OS uygulaması desteğiyle ilgili olarak
AndroidSourceSet.wearAppConfigurationName.BuildType.isRenderscriptDebuggable, işlevsel olmadığı için kaldırıldı.DependencyVariantSelection. Bu yöntem,kotlin.android.localDependencySelectionolarak gösterilenDependencySelectionile değiştirildi.Installation.installOptions(String). Bu özelliğin yeriniInstallation.installOptions'nin değiştirilebilir özelliği almıştır.Deneysel olan ancak hiçbir zaman kararlı hale getirilmeyen
PostProcessingbloğu.ProductFlavor.setDimension(dimensionözelliğiyle değiştirildi)LanguageSplitOptions. Bu özellik yalnızca kullanımdan kaldırılan Google Play Instant için kullanışlıydı.DensitySplit, çünkü bu özellik artık desteklenmiyor. Bunun yerine uygulama paketleri kullanılmalıdır.
Kaldırılan API'ler
Android Gradle eklentisi 9.0'da kaldırılanlar:
AndroidComponentsExtension.finalizeDSl. Bu ayarın yerinifinalizeDslaldı.Component.transformClassesWith. Bu ayarın yeriniInstrumentation.transformClassesWithaldı.Component.setAsmFramesComputationMode. Bu ayarın yeriniInstrumentation.setAsmFramesComputationModealdı.ComponentBuilder.enabled. Bu özelliğin yeriniComponentBuilder.enablealdı.DependenciesInfoBuilder.includedInApk. Bu,includeInApkile değiştirildi.DependenciesInfoBuilder.includedInBundle. Bu,includeInBundleile değiştirildi.GeneratesApk.targetSdkVersion. Bu,targetSdkile değiştirildi.Variant.minSdkVersion. Bu,minSdkile değiştirildi.Variant.maxSdkVersion. Bu,maxSdkile değiştirildi.Variant.targetSdkVersion. Bu,targetSdkile değiştirildi.Variant.unitTest,com.android.testeklentisi için geçerli olmadığından kaldırıldı.unitTest,HasUnitTest'i genişletenVariantBuilderalt türlerinde kullanılabilir.VariantBuilder.targetSdkvetargetSdkPreview, kitaplıklarda anlamlı olmadıkları için kaldırıldı. Bunun yerineGeneratesApkBuilder.targetSdkveyaGeneratesApkBuilder.targetSdkPreviewkullanın.VariantBuilder.enableUnitTest,com.android.testeklentisi için geçerli olmadığından kaldırıldı.enableUnitTest,HasUnitTestBuilder'i genişletenVariantBuilderalt türlerinde kullanılabilir.VariantBuilder.unitTestEnabled,HasUnitTestBuilder'yi genişletenVariantBuilderalt türlerinde daha tutarlı bir şekilde adlandırılanenableUnitTestlehine kaldırıldı.VariantOutput.enable. Bu,enabledile değiştirildi.Desteği sonlandırılmış ve devre dışı bırakılmış
FeaturePluginveFeatureExtension.Yalnızca AGP 4.2 veya daha eski sürümlerde çalışmayı hedeflerken en son AGP sürümüne göre derlemeye izin vermek için kalan, desteği sonlandırılmış ve devre dışı bırakılmış
BaseExtension.registerTransformAPI'leri.
Kaldırılan Gradle özellikleri
Aşağıdaki Gradle özellikleri, başlangıçta varsayılan olarak etkinleştirilen özellikleri genel olarak devre dışı bırakmak için eklenmiştir.
Bu özellikler, AGP 8.0 veya daha eski sürümlerden itibaren varsayılan olarak devre dışı bırakılmıştır. Daha verimli bir derleme için bu özellikleri yalnızca kullanan alt projelerde etkinleştirin.
| Özellik | İşlev | Değiştirme |
|---|---|---|
android. |
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
}
} |
android. |
Tüm alt projelerde RenderScript derlemesini etkinleştirir. |
Yalnızca renderscript kaynaklarının bulunduğu alt projelerde renderscript derlemesini etkinleştirmek için bu projelerin Gradle derleme dosyalarında aşağıdaki özelliği ayarlayın:
android {
buildFeatures {
renderScript = true
}
} |
Zorunlu kılınan Gradle özellikleri
Aşağıdaki Gradle özelliklerini ayarlarsanız AGP 9.0 bir hata verir.
Android Gradle eklentisi Yükseltme Asistanı, bu özellikleri kullanan projeleri AGP 9.0'a yükseltmez.
| Özellik | İşlev |
|---|---|
android. |
Kaynak daraltma artık her zaman R8'in bir parçası olarak çalıştırılır. Önceki uygulama kaldırıldı. |
android. |
Kaynak küçültme artık her zaman hassas kaynak küçültme özelliğini kullanır. Bu sayede daha fazla kaynak kaldırılabilir. |
R8 değişiklikleri
Aşağıdaki R8 değişiklikleri AGP 9.0.0'a dahildir.
Yeni yapılandırma seçeneği -processkotlinnullchecks
Kotlin boş değer kontrollerini işlemek için R8'i yapılandırmak üzere yeni R8 seçeneği -processkotlinnullchecks'i ekledik. Seçenek, şu üç değerden biri olması gereken zorunlu bir bağımsız değişken alır: keep, remove_message ve remove.
Bu seçenek, Kotlin derleyicisi tarafından eklenen aşağıdaki boş değer 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 bir kontrol yöntemi çağrısını, çağrının ilk bağımsız değişkenindegetClass()çağrısına yeniden yazar (null kontrolünü etkili bir şekilde korur ancak mesaj içermez).remove, kontrolleri tamamen kaldırır.
R8 varsayılan olarak remove_message kullanır. -processkotlinnullchecks ile ilgili tüm spesifikasyonlar bunu geçersiz kılar. Birden fazla kez belirtilirse en güçlü değer kullanılır.
Bilgileri saklama talimatını tamamlayıcı yöntemlere yaymayı durdurma
Saklama kuralları, desugaring işlemine tabi olan arayüz yöntemleriyle eşleştiğinde R8, daha önce optimizasyona izin verme ve küçültmeye izin verme bitlerini sentezlenmiş tamamlayıcı yöntemlere dahili olarak aktarıyordu.
AGP 9.0'dan itibaren, saklama kuralları artık tamamlayıcı yöntemler için geçerli değildir. Bu durum, 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 bitlerini tamamlayıcı yöntemlere aktararak aşağıdaki kullanım alanı daha önce destekleniyordu:
default/static/privatearayüz yöntemleri içeren bir kitaplığı,minSdk< 24 ve arayüz yöntemlerini koruyan kurallarla DEX'e derleyin.- Uygulamayı, sınıf yolunda kitaplık ve
-applymappingile derleyin. - Uygulamayı ve kitaplığı birleştirin.
disallow
obfuscation biti, tamamlayıcı yöntemlere aktarılmadığından bu işlemin yalnızca -applymapping ile çalıştığını unutmayın. Yani 1. adımda oluşturulan tamamlayıcı sınıfların yöntem adları gizlenir.
Bu kullanım alanı artık minSdk < 24 için desteklenmeyecek. Bu sorunu çözmek için aşağıdakileri yapın:
default/static/privatearayüz yöntemlerini içeren kitaplığı,minSdk< 24 olan sınıf dosyalarına dönüştürün.- Desugaring uygulanmış yapıyı, R8 ve tamamlayıcı sınıflardaki arayüz yöntemlerini koruyan kuralları kullanarak derleyin.
- Uygulamayı, sınıf yolundaki kitaplıkla derleyin.
- Uygulamayı ve desugaring uygulanmış yapıyı birleştirin.
Bunun bir diğer yan etkisi de, arayüz tamamlayıcı yöntemleri içindeki anonim ve yerel sınıflar için iç sınıf ve kapsayan yöntem özelliklerini korumanın artık mümkün olmamasıdır.
Varsayılan olarak oluşturulan kaynak dosyayı r8-map-id-<MAP_ID> olarak değiştirin.
Bu değişiklik, 8.12.0 sürümünden itibaren AGP'de geçerlidir.
Bir sınıf için varsayılan olarak oluşturulan kaynak dosya özelliği, yeniden izleme gerektiğinde (yani gizleme veya optimizasyon etkinleştirildiğinde) SourceFile yerine r8-map-id-<MAP_ID> olur.
Yeni kaynak dosya özelliği, gizlenmiş bir yığın izleme (stack trace) verildiğinde, yeniden izleme için gereken eşleme dosyasının kimliğini ayıklamayı mümkün kılar. Bu özellik, Logcat'te yığın izlemelerin (stack trace) otomatik olarak yeniden izlenmesini desteklemek için kullanılabilir.
Özel kaynak dosya özelliği kullanılıyorsa (-renamesourcefileattribute)
bu özel kaynak dosya özelliği öncelikli olmaya devam eder.
ProGuard uyumluluk modunda (gradle.properties, android.enableR8.fullMode=false içerdiğinde) r8-map-id-<MAP_ID> kaynak dosya özelliğinin yayınlanması yalnızca SourceFile özelliği tutulmadığında geçerli olur. ProGuard uyumluluk modunu kullanan ve eşleme dosyası kimliğini yığın izlemelerine dahil etmek isteyen uygulamalar -keepattributes SourceFile özelliğini kaldırmalıdır (veya R8 tam moduna geçmelidir).
r8-map-id-<MAP_ID> içinde kullanılan harita kimliği, harita karmasının tamamıdır ve daha önce kullanılan harita karmasının 7 karakterlik bir öneki değildir.
L8 desugaring işleminde küçültülmüş sentetik adların kullanımını etkinleştirme
D8 tarafından oluşturulan yapay sınıfların adı normalde $$ExternalSynthetic alt dizesini içerir. Bu dize, sınıfın D8 tarafından oluşturulan bir yapay sınıf olduğunu gösterir.
Ayrıca, sentetik adı sentetik türünü de kodlar (örneğin, Backport, Lambda). Sınıf adları dize havuzunda daha fazla yer kapladığından, bu durum ortaya çıkan DEX boyutunu olumsuz etkiler.
AGP 9.0, L8'i (temel kitaplık desugaring) yapılandırarak 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 kullanmasını sağlar. Yeni sınıf adı, sayısal bir kimlik (ör. $1) kullanır.
-addconfigurationdebugging için desteği kaldır
AGP 9.0, -addconfigurationdebugging desteğini kaldırır. Derleyici artık işaret kullanıldığında uyarı bildiriyor.
D8/R8'den L8 kuralları oluşturma desteğini kaldırma
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ıyor.
Bunun yerine TraceReferences politikasını kullanmanız gerekir.
Daha açık belirtmek gerekirse D8Command.builder.setDesugaredLibraryKeepRuleConsumer ve R8Command.Builder.setDesugaredLibraryKeepRuleConsumer yöntemleri kaldırıldı. --desugared-lib-pg-conf-output desteği de D8 ve R8'in komut satırı seçeneklerinden kaldırıldı.
Düzeltilen sorunlar
Android Gradle eklentisi 9.0.0
| Düzeltilen Sorunlar | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Android Gradle Eklentisi |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Hata analizi |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Hata Analizi Entegrasyonu |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Küçültücü (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||