Java 8 dili özelliklerini ve API'lerini kullanın

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" bayt kodu dönüşümlerini kullanarak Java 8 dil özelliği desteği
Şekil 1. 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:

  1. Android Gradle eklentisini 3.0.0 veya sonraki bir sürüme güncelleyin.
  2. 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 veya build.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ümesi
  • java.util.function
  • java.util.{Map,Collection,Comparator}'e son eklenen içerikler
  • İsteğe bağlı (java.util.Optional, java.util.OptionalInt ve java.util.OptionalDouble) ve bazı yeni sınıflar
  • java.util.concurrent.atomic'e bazı eklemeler (AtomicInteger, AtomicLong ve AtomicReference'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:

  1. Android Gradle eklentisini 4.0.0 (veya daha yeni bir sürüme) güncelleyin.
  2. Uygulama modülünüzün build.gradle veya build.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.