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 destekler ve platform sürümüne göre değişen Java 8 dili özelliklerinin bir alt kümesi de bulunmaktadır. Zaman uygulamanızı geliştirmek için Android Gradle eklentisi 4.0.0 ve sonraki bir sürümünü kullanarak API düzeyi gerekmeden bazı Java 8 language API'lerini kullanabilirsiniz uygulamasını indirin.

Bu sayfada, kullanabileceğiniz Java 8 dil özellikleri ve bu özellikleri doğru projenizi ve karşılaşabileceğiniz bilinen sorunları belirleyin. Java 8'in dil özelliklerine genel bir bakış için aşağıdaki videoyu izleyin.

Android Gradle eklentisi, belirli Java 8 sürümlerinin kullanımı için yerleşik destek sağlar. dil özellikleri ve bunları kullanan üçüncü taraf kitaplıklar hakkında daha fazla bilgi edinin. Varsayılan araç zinciri uygulayarak yeni dil özelliklerini kullanıma sunuyor. D8/R8 derlemesinin parçası olarak desugar adlı bayt kodu dönüşümleri Şekil 1'de gösterildiği gibi, sınıf dosyalarını DEX koduna dönüştürün.

"desugar" bayt kodu kullanan Java 8 dil özelliği desteği
    dönüşümler
Şekil 1. desugar ile Java 8 dil özelliği desteği dönüşümlerinin nasıl geçtiğini anlamamızı sağlar.
ziyaret edin.
'nı inceleyin.

Java 8 dil özelliği desteği (Android Gradle Eklentisi 3.0.0+)

Desteklenen Java 8 dil özelliklerini kullanmaya başlamak için:

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

Eski

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ı oluştururken eklentisi tüm Java 8 dil özelliklerini desteklemiyor. Şu dil özellikleri tüm API düzeylerinde kullanılabilir:

Java 8 dil özelliği Notlar
Lambda ifadeleri Android, iletilerin serileştirilmesini desteklemez lambda ifadeleri.
Yöntem referansları  
Ek açıklamaları yazma Tür ek açıklaması bilgileri yalnızca derleme zamanında kullanılabilir. çalışma zamanında değil. Platform, TYPE API düzeyi 24 ve önceki sürümlerde kullanılabilir, ancak ElementType.TYPE_USE veya ElementType.TYPE_PARAMETER.
Varsayılan ve statik arayüz yöntemleri  
Tekrarlanan ek açıklamalar  

Bu Java 8 dil özelliklerine ek olarak, Android Gradle eklentisi 3.0.0 ve daha yeni sürümler için Tüm Android API düzeyleri için try-kaynaklarla birlikte.

Desugar desteklemez MethodHandle.invoke veya MethodHandle.invokeExact. 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 değer belirtmelisiniz. Aksi takdirde şu hata oluştu:

Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26

Bazı durumlarda, modülünüz invoke veya invokeExact kullanmıyor olabilir yöntemlerine göz atmanızı öneririm. Kullanmaya devam etmek için minSdkVersion 25 veya daha düşük bir sürümü içeren kaldırmak için kod küçültmeyi etkinleştirin en iyi uygulamaları paylaşacağız. Bu işe yaramazsa şuna benzeyen alternatif bir kitaplık kullanmayı düşünün: desteklenmeyen yöntemleri kullanmıyor.

Android Gradle'da Java 8+ dil özellikleri sadeleştiriliyor eklentisi 3.0.0 ve daha yeni bir sürümle birlikte, herhangi bir ek sınıf ve API gerektirmez. (ör. java.util.stream.*) eski Android sürümlerinde kullanılabilir. Android Gradle'dan kısmi Java API sadeleştirme desteği alabilirsiniz eklentisi 4.0.0 veya üzeri bir sürüm olmalıdır.

Java 8+ API çözümleme desteği (Android Gradle Eklentisi 4.0.0+)

Uygulamanızı Android Gradle eklentisi 4.0.0 veya üstünü kullanarak oluşturuyorsanız eklentisi, API olmadan çeşitli Java 8 dilindeki API'lerin kullanımı için desteğin kapsamını genişletir. Uygulamanız için minimum API düzeyi gerekli. Android Gradle eklentisi 7.4.0 veya API'lerin kullanıma sunulmamış, kitaplık 2.0.0 veya üzeri sürümlerdir.

Eski platform sürümleri için bu ek destek sunulduğundan 4.0.0 ve daha yüksek sürümler API'ler. Yalnızca şurada kullanıma sunulan standart dil API'lerini dahil edebilirsiniz: daha eski sürümleri destekleyen uygulamalarda son Android sürümleri (ör. java.util.streams) Android'in sürümleri.

Uygulamanızı Android kullanarak oluştururken aşağıdaki API grupları desteklenir Gradle eklentisi 4.0.0 veya sonraki sürümler:

  • Sıralı akışlar (java.util.stream)
  • java.time alt kümesi
  • java.util.function
  • java.util.{Map,Collection,Comparator} grubuna yapılan son eklemeler
  • İ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 işlevine yapılan bazı eklemeler (yeni yöntemler açık AtomicInteger, AtomicLong ve AtomicReference)
  • ConcurrentHashMap (Android 5.0 için hata düzeltmeleriyle birlikte)

Android Gradle eklentisi 7.4.0 veya sonraki sürümleri ile ek Java 11 API'leri java.nio.file paketinin bir alt kümesi gibi desteklenir.

Desteklenen API'lerin tam listesi için şu adresi ziyaret edin: Detaylandırma yoluyla kullanıma sunulan Java 8+ API'leri ve Kodsuzluğun azaltılmasıyla Java 11 ve sonraki sürümlerin API'leri kullanılabilir.

Eklenti, bu dil API'lerini desteklemek için ayrı bir DEX dosyası derler eksik API'lerin bir uygulamasını içeren ve uygulamanıza dahil eden bir kod snippet'i ekleyin. Sadeleştirme işlemi, uygulamanızın kodunu yeniden yazar. Bu kitaplık, aşağıdaki adreste kullanılır: belirler.

Android'in herhangi bir sürümünde bu dil API'lerine yönelik desteği etkinleştirmek için platform:

  1. Android Gradle eklentisini güncelleme 4.0.0 (veya üzeri) olarak güncelleyin.
  2. Aşağıdakileri uygulama modülünüze ekleyin: build.gradle veya build.gradle.kts dosyası:

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")
}

Eski

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 bir kitaplığa eklemeniz gerekebileceğini unutmayın aşağıdaki durumlarda modülün build.gradle veya build.gradle.kts dosyasını yükleyin:

  • Kitaplık modülünün araçlı testleri, şu dil API'lerini kullanır (veya veya kitaplık modülü ya da bağımlılıkları) üzerinden satın alabilirsiniz. Böylece, eksik API'ler, araçlarlı test APK'nız için sağlanır.

  • Kitaplık modülünde lint'i ayrı olarak çalıştırmak istiyorsunuz. Bu öneri, Dil API'lerinin geçerli kullanımlarını lint tanıma ve yanlışlık bildirmeden kaçınma uyarılar.

Ayrıca API'lerin sadeleştirilmesinin sadece küçültme ile birlikte kullanılabileceğini unutmayın. kullanırken ortaya çıkar.

Sürümler

Aşağıdaki tabloda Java 8+ API kitaplığının sürümleri ve Her sürümü destekleyen minimum Android Gradle eklentisi sürümü:

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ığı sürümleri hakkında ayrıntılı bilgi için bkz. CHANGELOG.md dosyası desugar_jdk_libs GitHub deposunda.