Android Gradle eklentisi 3.0.0 ve sonraki sürümler, tüm Java 7 dili özelliklerini ve platform sürümüne göre farklılık gösteren Java 8 dili özelliklerinin bir alt kümesini destekler. Android Gradle eklentisi 4.0.0 ve sonraki sürümleri kullanarak uygulamanızı oluştururken, uygulamanız için minimum API düzeyi şartı olmadan bazı Java 8 dilindeki API'leri kullanabilirsiniz.
Bu sayfada, kullanabileceğiniz Java 8 dili özellikleri, projenizi bunları kullanacak şekilde doğru şekilde nasıl yapılandıracağınız ve karşılaşabileceğiniz bilinen sorunlar açıklanmaktadır. Java 8 dilinin özelliklerine genel bir bakış için aşağıdaki videoyu izleyin.
Android Gradle eklentisi, belirli Java 8 dil özelliklerini ve bunları kullanan üçüncü taraf kitaplıklarını kullanmak için yerleşik destek sağlar. Varsayılan araç zinciri, Şekil 1'de gösterildiği gibi, sınıf dosyalarının D8/R8 derlemesinin bir parçası olarak desugar
adı verilen bayt kodu dönüşümleri gerçekleştirerek yeni dil özelliklerini uygular.
!["desugar" bayt kodu dönüşümlerini kullanan Java 8 dili özelliği desteği](https://developer.android.com/static/studio/images/write/desugar_diagram.png?authuser=6&hl=tr)
desugar
bayt kodu dönüşümleriyle Java 8 dili özelliği desteği.
Java 8 dili özelliği desteği (Android Gradle Plugin 3.0.0+)
Desteklenen Java 8 dili özelliklerini kullanmaya başlamak için:
- Android Gradle eklentisini 3.0.0 veya daha yeni bir sürüme güncelleyin.
- Java 8 dili özelliklerini kullanan her modül için (kaynak kodunda veya bağımlılıklar üzerinden) 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" } }
Modern
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" } }
Uygulamanızı Android Gradle eklentisi 3.0.0 ve sonraki sürümlerini kullanarak oluştururken, eklenti tüm Java 8 dili özelliklerini desteklemez. Aşağıdaki dil özellikleri tüm API düzeylerinde kullanılabilir:
Java 8 dili özelliği | Notlar |
---|---|
Lambda ifadeleri | Android, lambda ifadelerinin serileştirilmesini desteklemez. |
Yöntem başvuruları | |
Ek açıklamalar yazma | Tür ek açıklama bilgileri yalnızca derleme zamanında kullanılabilir, çalışma zamanında kullanılamaz. Platform, API düzeyi 24 ve önceki sürümlerde TYPE 'i destekler ancak ElementType.TYPE_USE veya ElementType.TYPE_PARAMETER değerlerini desteklemez.
|
Varsayılan ve statik arayüz yöntemleri | |
Ek açıklamaları tekrarlama |
Bu Java 8 dili özelliklerine ek olarak, Android Gradle eklentisinin 3.0.0 ve sonraki sürümleri
try
-with-resources için desteği tüm Android API düzeylerine sunar.
Desugar, MethodHandle.invoke
veya MethodHandle.invokeExact
özelliklerini desteklemez.
Kaynak kodunuzda veya modül bağımlılıklarınızdan biri bu yöntemlerden birini kullanıyorsa minSdkVersion 26
veya daha yüksek bir değeri belirtmeniz gerekir. Aksi takdirde şu 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 kitaplık bağımlılığına dahil olsalar bile invoke
veya invokeExact
yöntemlerini kullanmıyor olabilir. Bu kitaplığı minSdkVersion 25
veya daha düşük bir sürümle kullanmaya devam etmek için kod küçültmeyi etkinleştirerek kullanılmayan yöntemleri kaldırın. Bu işe yaramazsa desteklenmeyen yöntemleri kullanmayan alternatif bir kitaplık kullanmayı düşünün.
Java 8+ dili, Android Gradle eklentisi 3.0.0 ve sonraki sürümlerinde şekeri çıkarır ve eski Android sürümlerinde ek sınıf ve API (java.util.stream.*
gibi) kullanıma sunmaz.
Kısmi Java API şekeri giderme desteği, aşağıdaki bölümde açıklandığı gibi Android Gradle eklentisi 4.0.0 veya sonraki bir sürüm tarafından sağlanır.
Java 8+ API şeker temizleme desteği (Android Gradle Plugin 4.0.0+)
Uygulamanızı Android Gradle eklentisi 4.0.0 veya sonraki bir sürümü kullanarak oluşturuyorsanız bu eklenti, uygulamanız için minimum bir API düzeyi gerektirmeden birkaç Java 8 dilindeki API'lerin kullanımını destekler. Android Gradle eklentisi 7.4.0 veya sonraki sürümleriyle, Java 11 dilindeki bazı API'ler şekersiz veya yüksek kitaplık 2.0.0 ile de kullanılabilir.
Eklenti 4.0.0 ve sonraki sürümler su alma motorunu aynı zamanda Java dili API'lerine genişlettiğinden eski platform sürümleri için bu ek destek mümkündür. Android'in eski sürümlerini destekleyen uygulamalara, yalnızca son Android sürümlerinde bulunan (java.util.streams
gibi) standart dil API'lerini ekleyebilirsiniz.
Android Graadle eklentisi 4.0.0 veya sonraki bir sürümü kullanarak uygulama 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}
öğesine son eklenenler- İsteğe bağlılar (
java.util.Optional
,java.util.OptionalInt
vejava.util.OptionalDouble
) ve bazı yeni sınıflar java.util.concurrent.atomic
uygulamasına bazı eklemeler (AtomicInteger
,AtomicLong
veAtomicReference
için yeni yöntemler)ConcurrentHashMap
(Android 5.0 için hata düzeltmeleriyle)
Android Gradle eklentisi 7.4.0 veya sonraki sürümlerde, java.nio.file
paketinin bir alt kümesi gibi ek Java 11 API'leri desteklenir.
Desteklenen API'lerin tam listesi için Şeker giderme yoluyla kullanılabilen Java 8+ API'leri ve Sugaring yoluyla kullanılabilen Java 11+ API'leri sayfalarını ziyaret edin.
Eklenti, bu dil API'lerini desteklemek için ayrı bir DEX dosyası derler. Bu dosya, eksik API'lerin bir uygulamasını içerir ve uygulamanıza ekler. Su giderme işlemi, uygulamanızın kodunu yeniden yazarak söz konusu kitaplığı çalışma sırasında kullanır.
Android platformunun herhangi bir sürümünde bu dillerdeki API'lere yönelik desteği etkinleştirmek için:
- Android Gradle eklentisini 4.0.0 (veya sonraki bir sürüme) sürümüne 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") }
Modern
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' }
Önceki kod snippet'ini aşağıdaki durumlarda 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 donanımlı testleri bu dil API'lerini kullanır (doğrudan veya kitaplık modülü ya da bağımlılıkları üzerinden). Böylece eksik API'ler, araçlı test APK'nız için sağlanır.
Kitaplık modülünde lint'i ayrı olarak çalıştırmak istiyorsunuz. Bunun amacı, dil API'lerinin geçerli kullanımlarını tanımak ve yanlış uyarılar bildirmekten kaçınmaktır.
API susuzlaştırma işleminin, yalnızca R8 küçültücü kullanıldığında küçültme ile birleştirilebileceğini de unutmayın.
Sürümler
Aşağıdaki tabloda, Java 8+ API kitaplığının sürümleri ve her bir 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-alfa10 |
Java 8+ 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.