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](https://developer.android.com/static/studio/images/write/desugar_diagram.png?authuser=9&hl=pl)
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:
- Aktualizowanie wtyczki Androida do obsługi Gradle do wersji 3.0.0 lub nowszej.
- 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
lubbuild.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
ijava.util.OptionalDouble
) i kilka nowych zajęć - Niektóre dodatki do
java.util.concurrent.atomic
(nowe metody wAtomicInteger
,AtomicLong
iAtomicReference
) 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:
- Aktualizowanie wtyczki Androida do obsługi Gradle do wersji 4.0.0 (lub nowszej).
- W module aplikacji dodaj te elementy:
Plik
build.gradle
lubbuild.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.