Używaj funkcji i interfejsów API w języku Java 8

Wtyczka Androida do obsługi Gradle w wersji 3.0.0 i nowszych obsługuje wszystkie funkcje w języku Java 7 oraz podzbiór funkcji językowych Java 8, które różnią się w zależności od wersji platformy. Kiedy tworząc aplikację przy użyciu wtyczki Androida do obsługi Gradle w wersji 4.0.0 lub nowszej, możesz niektóre interfejsy API w języku Java 8 bez konieczności określania minimalnego poziomu .

Na tej stronie opisujemy dostępne funkcje języka Java 8 oraz sposoby prawidłowego skonfigurować projekt do ich używania oraz wszystkie znane problemy, które mogą wystąpić. Obejrzyj film poniżej, aby poznać funkcje języka Java 8.

Wtyczka Androida do obsługi Gradle zapewnia wbudowaną obsługę niektórych wersji środowiska Java 8. funkcje językowe i biblioteki innych firm, które z nich korzystają. Domyślny łańcuch narzędzi implementuje nowe funkcje językowe, wykonując przekształcenia kodu bajtowego o nazwie desugar w ramach kompilacji D8/R8; plików klas do kodu DEX, jak widać na rysunku 1.

Obsługa funkcji języka Java 8 z użyciem kodu bajtowego „desugar”
    przekształcenia
Rysunek 1. Obsługa funkcji języka Java 8 w języku desugar przekształceniami kodu bajtowego.
.
.

Obsługa funkcji języka Java 8 (wtyczka Androida do obsługi Gradle w wersji 3.0.0 lub nowszej)

Aby zacząć korzystać z funkcji dostępnych w języku Java 8:

  1. Aktualizowanie wtyczki Androida do obsługi Gradle do wersji 3.0.0 lub nowszej.
  2. Dla każdego modułu korzystającego z Javy 8 funkcji językowych (w kodzie źródłowym lub przez zależności), zaktualizuj plik build.gradle lub build.gradle.kts modułu, jak pokazano poniżej:

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

Odlotowe

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

Podczas tworzenia aplikacji za pomocą wtyczki Androida do obsługi Gradle w wersji 3.0.0 lub nowszej Wtyczka nie obsługuje wszystkich funkcji języka Java 8. Ten język funkcje są dostępne na każdym poziomie interfejsu API:

Funkcja językowa Java 8 Uwagi
Wyrażenia lambda Android nie obsługuje serializacji wyrażenia lambda.
Odniesienia do metod  
Wpisywanie adnotacji Informacje o adnotacjach typu są dostępne tylko podczas kompilacji, a nie w czasie działania aplikacji. Platforma obsługuje TYPE w interfejsie API poziomu 24 i niższym, ale nie ElementType.TYPE_USE lub ElementType.TYPE_PARAMETER.
Domyślne i statyczne metody interfejsu  
Powtarzające się adnotacje  

Oprócz tych funkcji języka Java 8 wtyczka Androida do obsługi Gradle wersji 3.0.0 i nowszych try-with-resources na wszystkie poziomy interfejsu Android API.

Desugar nie obsługuje MethodHandle.invoke lub MethodHandle.invokeExact Jeśli Twój kod źródłowy lub jedna z zależności modułów używa jednej z tych metod, musisz określić minSdkVersion 26 lub większą. W przeciwnym razie otrzymasz ten błąd:

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

W niektórych przypadkach moduł może nie korzystać z interfejsu invoke lub invokeExact nawet jeśli należą do zależności biblioteki. Aby nadal korzystać w tej bibliotece z wartością minSdkVersion 25 lub niższą, Aby usunąć, włącz zmniejszanie kodu nieużywanych metod. Jeśli to nie zadziała, użyj innej biblioteki, która nie korzysta z nieobsługiwanych metod.

Usuwanie cudzego języka Java 8 lub nowszego w Gradle Androida wtyczka 3.0.0 lub nowsza i nie tworzy żadnych dodatkowych klas ani interfejsów API (takich jak java.util.stream.*) dostępnych do użytku na starszych wersjach Androida. Obsługa częściowego usuwania cukru przez interfejs Java API jest dostępna z poziomu Gradle Androida wtyczki w wersji 4.0.0 lub nowszej, zgodnie z opisem w następnej sekcji.

Obsługa usuwania cukru w interfejsie API Java 8+ (wtyczka Androida do obsługi Gradle w wersji 4.0.0 lub nowszej)

Jeśli tworzysz aplikację przy użyciu wtyczki Androida do obsługi Gradle w wersji 4.0.0 lub nowszej, rozszerza obsługę wielu interfejsów API w języku Java 8 bez użycia wymaga minimalnego poziomu interfejsu API aplikacji. Z wtyczką Androida do obsługi Gradle w wersji 7.4.0 lub dlatego wiele interfejsów API w języku Java 11 są również dostępne z z biblioteką 2.0.0 lub nowszej.

Dodatkowa obsługa starszych wersji platformy jest możliwa, ponieważ wtyczka 4.0.0 i nowsze rozszerzają silnik usuwania cukru o język Java API. Możesz dołączyć interfejsy API w standardowych językach, które były dostępne tylko w najnowsze wersje Androida (np. java.util.streams) w aplikacjach obsługujących starsze wersji Androida.

Podczas tworzenia aplikacji na Androidzie obsługiwane są te interfejsy API: Wtyczka Gradle w wersji 4.0.0 lub nowszej:

  • Strumienie sekwencyjne (java.util.stream)
  • Podzbiór typu java.time
  • java.util.function
  • Najnowsze dodatki do java.util.{Map,Collection,Comparator}
  • Opcjonalne (java.util.Optional, java.util.OptionalInt i java.util.OptionalDouble) i kilka nowych zajęć
  • Niektóre dodatki do java.util.concurrent.atomic (nowe metody w AtomicInteger, AtomicLong i AtomicReference)
  • ConcurrentHashMap (z poprawkami błędów dla Androida 5.0)

Dzięki wtyczce Androida do obsługi Gradle w wersji 7.4.0 lub nowszej dostępne są dodatkowe interfejsy API w języku Java 11 jako podzbiór pakietu java.nio.file.

Pełną listę obsługiwanych interfejsów API można znaleźć na stronie Interfejsy API Java 8+ dostępne w ramach decugaringu oraz Interfejsy API w języku Java 11+ dostępne w ramach decugaringu.

Aby zapewnić obsługę tych interfejsów API, wtyczka kompiluje osobny plik DEX które zawiera implementację brakujących interfejsów API i obejmuje je w Twojej aplikacji. Proces usuwania odsłuchiwania powoduje przepisanie kodu aplikacji w taki sposób, aby używała tej biblioteki w środowisku wykonawczym.

Aby włączyć obsługę tych interfejsów API w dowolnej wersji Androida platforma:

  1. Aktualizowanie wtyczki Androida do obsługi Gradle do wersji 4.0.0 (lub nowszej).
  2. W module aplikacji dodaj te elementy: Plik build.gradle lub build.gradle.kts:

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

Odlotowe

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'
}

Uwaga: w bibliotece może być również konieczne dołączenie poprzedniego fragmentu kodu pliku build.gradle lub build.gradle.kts modułu, jeśli:

  • Testy instrumentalne modułu biblioteki korzystają z tych interfejsów API bezpośrednio lub za pomocą modułu biblioteki bądź jego zależności). Dzięki temu brakujące interfejsy API są udostępnione dla zinstrumentowanego testowego pakietu APK.

  • Chcesz uruchomić lint w module biblioteki osobno. Ma to pomóc lint rozpozna prawidłowe zastosowania interfejsów API języka i unikaj zgłaszania wartości „false” (fałsz) ostrzeżeniami.

Odsłuchiwanie za pomocą interfejsu API można połączyć z zmniejszaniem, ale tylko przy korzystaniu z reduktora R8.

Wersje

W tabeli poniżej znajdziesz wersje biblioteki interfejsu API Java 8 i nowszych wersji oraz minimalna wersja wtyczki Androida do obsługi Gradle, która obsługuje poszczególne wersje:

Wersja Minimalna wersja wtyczki do obsługi Gradle Androida
1.1.9 4.0.0
1.2.3 7.3.0
2.0.3 7.4.0-alfa10

Szczegółowe informacje o wersjach biblioteki interfejsu Java 8+ API znajdziesz w Plik CHANGELOG.md w repozytorium desugar_jdk_libs GitHub.