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 uygulamaları için JetBrains'in AGP 9 yükseltme becerisini deneyin. Android Studio'da becerileri kullanma hakkında daha fazla bilgi için Temsilci Modu'nu 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 edinmek 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'yi referans alacak ş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 tüm kullanımları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 çeşitli desteği sonlandırılmış 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 olanak tanır. |
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ö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 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 bu 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 gösterilmeye devam eder 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 varyant 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 geçiş 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 Variant 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 bu özelliği 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 üst 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 düşük 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 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ı koruma seçeneğiniz olur:
| Ö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 varyant 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 özelliği 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ı benimseyin.
|
android. |
InstrumentationTestRunner için desteği sonlandırılan varsayılan androidx.test.runner.AndroidJUnitRunner sınıfını değiştirerek cihaz üzerinde testleri varsayılan olarak bu sınıfla çalıştırın.
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ürecinde optimizasyonlar da etkinleştirilir. Bu optimizasyonlar, çok sayıda Android kitaplığı alt projesi içeren derlemelerin içe aktarma süresini kısaltı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, kaynakta değişiklik yapmadan 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 başarısız olur ve hata verir. 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 oluşturucuyu dolaylı 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'i 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 değerini 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 proguard-android-optimize.txt ile birlikte özel bir proguardFile'da dontoptimize seçeneğini açıkça belirtebilirsiniz. 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 tür yorumlar olup olmadığını 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 devre dışı bırakabilirsiniz. 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 verilmez.
|
false → true |
Oluşturulan kaynakları kaydetmek için androidComponents üzerinde Sources API'sini kullanın.
|
android. |
Gölgeleyici derleme etkinleştirilmişse gölgeleyici 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, artık Play'de desteklenmeyen Wear OS uygulamalarını yerleştirme desteğini kaldırır. 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'te 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 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) } } }Bir dizi AGP sürümünü hedefleyen eklentiler için alıcıyı doğrudan kullanmak, 9.0'dan eski AGP sürümleriyle ikili program uyumludur.
DSL kaldırıldı
Android Gradle eklentisi 9.0'da kaldırılanlar:
AndroidSourceSet.jni, çünkü işlevsel değildi.Kaldırılan yerleşik Wear OS uygulaması desteğiyle ilgili olarak
AndroidSourceSet.wearAppConfigurationName.BuildType.isRenderscriptDebuggable, çünkü işlevsel değildi.DependencyVariantSelection. Bu yöntem,kotlin.android.localDependencySelectionolarak sunulanDependencySelectionile 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, desteği sonlandı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,finalizeDslile değiştirildi.Component.transformClassesWith. Bu,Instrumentation.transformClassesWithile değiştirildi.Component.setAsmFramesComputationMode. Bu,Instrumentation.setAsmFramesComputationModeile değiştirildi.ComponentBuilder.enabled. Bu özelliğin yeriniComponentBuilder.enablealdı.DependenciesInfoBuilder.includedInApk. Bu,includeInApkile değiştirildi.DependenciesInfoBuilder.includedInBundle. Bu,includeInBundleile değiştirildi.GeneratesApk.targetSdkVersion. Bu parametre,targetSdkile değiştirilmiştir.Variant.minSdkVersion. Bu parametre,minSdkile değiştirilmiştir.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.com.android.testeklentisi için geçerli olmadığındanVariantBuilder.enableUnitTest.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.enabledile değiştirildi.Desteği sonlandırılan ve devre dışı bırakılan
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 bunları 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 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.
Keep bilgilerini 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 bitleri tamamlayıcı yöntemlere aktarılarak aşağıdaki kullanım alanı daha önce destekleniyordu:
default/static/privatearayüz yöntemlerini içeren bir kitaplığı,minSdk< 24 ve arayüz yöntemlerini koruyan kurallarla DEX'te derleyin.- Sınıf yolunda kitaplık ve
-applymappingile bir uygulama 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 desteklenmiyor. 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'i 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 companion 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.
Yeniden izleme gerektiğinde (yani gizleme veya optimizasyon etkinleştirildiğinde) bir sınıf için varsayılan olarak yayınlanan kaynak dosya özelliği 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 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 tutulmadığında geçerli olur. ProGuard uyumluluk modunu kullanan ve eşleme dosyası kimliğini yığın izlemelerine dahil etmek 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, 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 (ör. Backport, Lambda). Sınıf adları dize havuzunda daha fazla yer kapladığından bu durum, elde edilen 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ı ve --desugared-lib-pg-conf-output desteği, 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) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||