Android Gradle eklentisi 3.0.0 ve sonraki sürümler, tüm Java 7 dil özelliklerini ve platform sürümüne göre değişen bir Java 8 dil özelliği alt kümesini destekler. Uygulamanızı Android Gradle eklentisi 4.0.0 ve sonraki sürümleri kullanarak derlediğinizde, uygulamanız için minimum API düzeyi gerekmeden bazı Java 8 dil API'lerini kullanabilirsiniz.
Bu sayfada, kullanabileceğiniz Java 8 dil özellikleri, projenizi bu özellikleri kullanacak şekilde doğru şekilde yapılandırma ve karşılaşabileceğiniz bilinen sorunlar açıklanmaktadır. Java 8 dil özelliklerine genel bakış için aşağıdaki videoya bakın.
Android Gradle eklentisi, belirli Java 8 dil özelliklerini ve bunları kullanan üçüncü taraf kitaplıklarını kullanma konusunda yerleşik destek sağlar. Varsayılan araç seti, sınıf dosyalarının DEX koduna D8/R8 derlemesi kapsamında desugar
olarak adlandırılan bayt kodu dönüşümleri gerçekleştirerek yeni dil özelliklerini uygular (Şekil 1'de gösterilmiştir).

desugar
kod dönüştürmelerini kullanarak Java 8 dil özelliği desteği
Java 8 dil özelliği desteği (Android Gradle eklentisi 3.0.0 ve sonraki sürümler)
Desteklenen Java 8 dil özelliklerini kullanmaya başlamak için:
- Android Gradle eklentisini 3.0.0 veya sonraki bir sürüme güncelleyin.
- Java 8 dil özelliklerini kullanan her modül için (kaynak kodunda veya bağımlılıklar aracılığıyla), modülün
build.gradle
veyabuild.gradle.kts
dosyasını aşağıda gösterildiği gibi güncelleyin:
Kotlin
android { ... // Configure only for each module that uses Java 8 // language features (either in its source code or // through dependencies). compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } // For Kotlin projects kotlinOptions { jvmTarget = "1.8" } }
Groovy
android { ... // Configure only for each module that uses Java 8 // language features (either in its source code or // through dependencies). compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } // For Kotlin projects kotlinOptions { jvmTarget = "1.8" } }
Android Gradle eklentisi 3.0.0 ve sonraki sürümleri kullanarak uygulamanızı derlediğinizde eklenti, Java 8 dilindeki tüm özellikleri desteklemez. Aşağıdaki dil özellikleri her API seviyesinde kullanılabilir:
Java 8 dil özelliği | Notlar |
---|---|
Lambda ifadeleri | Android, lambda ifadelerinin serileştirilmesini desteklemez. |
Yöntem referansları | |
Tür ek açıklamaları | Tür ek açıklama bilgileri yalnızca derleme zamanında kullanılabilir, yürütme zamanında kullanılamaz. Platform, API seviyesi 24 ve altında TYPE 'i destekler ancak ElementType.TYPE_USE veya ElementType.TYPE_PARAMETER 'i desteklemez.
|
Varsayılan ve statik arayüz yöntemleri | |
Yinelenen ek açıklamalar |
Android Gradle eklentisinin 3.0.0 ve sonraki sürümleri, bu Java 8 dil özelliklerine ek olarak
try
-with-resources için desteği tüm Android API düzeylerine genişletir.
Şeker ayrıştırma, MethodHandle.invoke
veya MethodHandle.invokeExact
'i desteklemez.
Kaynak kodunuz veya modül bağımlılıklarınızdan biri bu yöntemlerden birini kullanıyorsa minSdkVersion 26
veya daha yüksek bir sürüm belirtmeniz gerekir. Aksi takdirde aşağıdaki hatayı alırsınız:
Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26
Bazı durumlarda, modülünüz bir kitaplık bağımlılığına dahil edilmiş olsa bile invoke
veya invokeExact
yöntemlerini kullanmıyor olabilir. Bu kitaplığı minSdkVersion 25
veya daha düşük sürümlerde kullanmaya devam etmek için kullanılmayan yöntemleri kaldırmak üzere kod küçültmeyi etkinleştirin. Bu yöntem işe yaramazsa desteklenmeyen yöntemleri kullanmayan alternatif bir kitaplık kullanmayı deneyin.
Java 8 ve sonraki dil özellikleri, Android Gradle eklentisi 3.0.0 ve sonraki sürümlerde şekerleme işlemini gerçekleştirir ve ek sınıfları ve API'leri (java.util.stream.*
gibi) eski Android sürümlerinde kullanılamaz hale getirir.
Kısmi Java API şekerleme kaldırma desteği, aşağıdaki bölümde açıklandığı gibi Android Gradle eklentisi 4.0.0 veya sonraki sürümlerde kullanılabilir.
Java 8 ve sonraki sürümlerde API şekerini kaldırma desteği (Android Gradle eklentisi 4.0.0 ve sonraki sürümler)
Uygulamanızı Android Gradle eklentisi 4.0.0 veya sonraki bir sürümü kullanarak derliyorsanız eklenti, uygulamanız için minimum API düzeyi gerektirmeden çeşitli Java 8 dil API'lerinin kullanılmasına yönelik desteği genişletir. Android Gradle eklentisi 7.4.0 veya sonraki sürümlerde, şeker içermeyen kitaplık 2.0.0 veya sonraki sürümlerle birlikte çeşitli Java 11 dil API'leri de kullanılabilir.
4.0.0 ve sonraki sürümlerin eklentisi, şekerleme kaldırma motorunu Java dili API'lerini de şekerleme kaldırmak için genişlettiğinden eski platform sürümleri için bu ek destek sağlanabilmektedir. Yalnızca son Android sürümlerinde (java.util.streams
gibi) kullanılabilen standart dil API'lerini Android'in eski sürümlerini destekleyen uygulamalara dahil edebilirsiniz.
Android Gradle eklentisi 4.0.0 veya sonraki bir sürümü kullanarak uygulamanızı oluştururken aşağıdaki API grubu desteklenir:
- Sıralı akışlar (
java.util.stream
) java.time
alt kümesijava.util.function
java.util.{Map,Collection,Comparator}
'e son eklenen içerikler- İsteğe bağlı (
java.util.Optional
,java.util.OptionalInt
vejava.util.OptionalDouble
) ve bazı yeni sınıflar java.util.concurrent.atomic
'e bazı eklemeler (AtomicInteger
,AtomicLong
veAtomicReference
'te yeni yöntemler)ConcurrentHashMap
(Android 5.0 için hata düzeltmeleri ile)
Android Gradle eklentisi 7.4.0 veya sonraki sürümlerde java.nio.file
paketinin alt kümesi gibi ek Java 11 API'leri desteklenir.
Desteklenen API'lerin tam listesi için Java 8 ve sonraki sürümlerde şekerleme kaldırma yoluyla kullanılabilen API'ler ve Java 11 ve sonraki sürümlerde şekerleme kaldırma yoluyla kullanılabilen API'ler sayfalarını ziyaret edin.
Bu dil API'lerini desteklemek için eklenti, eksik API'lerin uygulamasını içeren ayrı bir DEX dosyası derleyip uygulamanıza ekler. Şekerleme kaldırma işlemi, uygulamanızın kodunu derleme zamanında bu kitaplığı kullanacak şekilde yeniden yazar. Ayrı bir DEX dosyasına derlenen kaynak kodu, desugar_jdk_libs GitHub deposunda bulunabilir.
Android platformunun herhangi bir sürümünde bu dil API'leri için desteği etkinleştirmek üzere:
- Android Gradle eklentisini 4.0.0 (veya daha yeni bir sürüme) güncelleyin.
- Uygulama modülünüzün
build.gradle
veyabuild.gradle.kts
dosyasına aşağıdakileri ekleyin:
Kotlin
android { defaultConfig { // Required when setting minSdkVersion to 20 or lower multiDexEnabled = true } compileOptions { // Flag to enable support for the new language APIs // For AGP 4.1+ isCoreLibraryDesugaringEnabled = true // For AGP 4.0 // coreLibraryDesugaringEnabled = true // Sets Java compatibility to Java 8 sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } } dependencies { // For AGP 7.4+ coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3") // For AGP 7.3 // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.3") // For AGP 4.0 to 7.2 // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.9") }
Groovy
android { defaultConfig { // Required when setting minSdkVersion to 20 or lower multiDexEnabled true } compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true // Sets Java compatibility to Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { // For AGP 7.4+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' // For AGP 7.3 // coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.3' // For AGP 4.0 to 7.2 // coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.9' }
Aşağıdaki durumlarda önceki kod snippet'ini bir kitaplık modülünün build.gradle
veya build.gradle.kts
dosyasına da eklemeniz gerekebileceğini unutmayın:
Kitaplık modülünün enstrümante edilmiş testleri bu dil API'lerini (doğrudan veya kitaplık modülü ya da bağımlılıkları aracılığıyla) kullanır. Bu, enstrümante edilmiş test APK'nız için eksik API'lerin sağlanmasını sağlar.
Kitaplık modülünde lint'i tek başına çalıştırmak istiyorsunuz. Bu, dil API'lerinin geçerli kullanımlarını tanımasına ve yanlış uyarılar bildirmemesine yardımcı olur.
API'den şeker çıkarma işleminin yalnızca R8 sıkıştırıcısı kullanıldığında sıkıştırma işlemiyle birlikte kullanılabileceğini de unutmayın.
Sürümler
Aşağıdaki tabloda, Java 8 ve sonraki sürümlerin API kitaplığının sürümleri ve her sürümü destekleyen minimum Android Gradle eklentisi sürümü gösterilmektedir:
Sürüm | Minimum Android Gradle eklentisi sürümü |
---|---|
1.1.9 | 4.0.0 |
1.2.3 | 7.3.0 |
2.0.3 | 7.4.0-alpha10 |
Java 8 ve sonraki sürümlerin API kitaplığının sürümleri hakkında ayrıntılı bilgi için desugar_jdk_libs
GitHub deposundaki CHANGELOG.md dosyasını inceleyin.