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

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
Şekil 1. 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:

  1. Android Gradle eklentisini 3.0.0 veya daha yeni bir sürüme güncelleyin.
  2. Java 8 dili özelliklerini kullanan her modül için (kaynak kodunda veya bağımlılıklar üzerinden) 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"
    }
}

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ümesi
  • java.util.function
  • java.util.{Map,Collection,Comparator} öğesine son eklenenler
  • İsteğe bağlılar (java.util.Optional, java.util.OptionalInt ve java.util.OptionalDouble) ve bazı yeni sınıflar
  • java.util.concurrent.atomic uygulamasına bazı eklemeler (AtomicInteger, AtomicLong ve AtomicReference 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:

  1. Android Gradle eklentisini 4.0.0 (veya sonraki bir sürüme) sürümüne 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")
}

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.