Czy można używać oprogramowania Java 8 dla systemu Android?


609

Przeszukując internet, nie jest jasne, czy Java 8 jest obsługiwana dla rozwoju Androida, czy nie.

Zanim pobiorę / skonfiguruję Javę 8, czy ktoś może wskazać mi jakąkolwiek „oficjalną” dokumentację, która mówi, że Java 8 jest lub nie jest obsługiwana dla rozwoju Androida.


21
Nie wiem o oficjalnym oświadczeniu, ale Java 8 (edycja: JDK 8) działa dobrze z Android SDK dla mnie. Windows 8.1 64-bitowy tutaj.
Hoang Huynh

2
W tym poście toczyła
Aboalnaga

2
@HoangHuynh możesz używać JDK 6 lub nowszego do programowania Androida. Jednak kompilacja obsługuje Javę w wersji 6 (i 7 w przypadku KitKat). Myślę, że OP miał na myśli także wersję Java (nie JDK)
waqaslam

13
Java 8 jest OFICJALNIE obsługiwana w systemie Android N. android-developers.blogspot.com/2016/03/...
Jay

Odpowiedzi:


189

java 8

Android obsługuje wszystkie funkcje języka Java 7 i podzbiór funkcji języka Java 8, które różnią się w zależności od wersji platformy.

Aby sprawdzić, które funkcje Java 8 są obsługiwane

Użyj funkcji języka Java 8

Zdecydowaliśmy się dodać obsługę funkcji języka Java 8 bezpośrednio do obecnego zestawu narzędzi javac i dx, a także przestać używać łańcucha narzędzi Jack. W tym nowym kierunku istniejące narzędzia i wtyczki zależne od formatu pliku klasy Java powinny nadal działać. W przyszłości funkcje języka Java 8 będą natywnie obsługiwane przez system kompilacji Androida. Naszym celem jest uruchomienie go w ramach Android Studio w nadchodzących tygodniach i chcieliśmy udostępnić tę decyzję wcześniej.

Przyszłość obsługi funkcji języka Java 8 w systemie Android

Użytkownicy Eclipse:

W przypadku starych programistów, którzy preferują Eclipse, Google przestaje wspierać narzędzia programistyczne dla Androida Eclipse

jeśli zainstalowałeś JDK Java 8, spróbuj, jeśli pojawią się jakiekolwiek problemy, spróbuj ustawić kompilator na 1.6 w Eclipse z menu okna → PreferencjeJavaKompilator . Java 7 również będzie działać:

Preferencje Eclipse -> Java -> Kompilator

Java 7 lub nowsza jest wymagana, jeśli celujesz w system Android 5.0 lub nowszy.

zainstaluj wiele JDK i spróbuj.


2
Czy Java 8 zmieniła sposób działania kodu bajtowego? Jeśli nie, teoretycznie powinno być dozwolone używanie dowolnej wersji Javy, o ile się ona kompiluje.
Ben Leggiero,

6
Prawidłowe pytanie brzmi: co się stanie, jeśli użyjesz nowych funkcji w Javie 8, która nie istnieje w Javie 7, aby zbudować aplikację na Androida? aby być bezpiecznym, postępuj zgodnie z oficjalnymi instrukcjami.
inż. Samer T

12
@ BenC.R.Leggiero nie ma nowego kodu bajtowego w Javie 8, ale znaczenia i struktury instrukcji zostały zmienione stackoverflow.com/questions/28228450/… stackoverflow.com/questions/16143684/…
phuclv

17
Nie zamieszczaj w odpowiedzi odpowiedzi „Aktualizacja N”. Przepisz go, aby mieć aktualne informacje. W przeciwnym razie SO będzie za kilka lat tak samo trudna do uzyskania informacji, jak fora, które zastąpiła.
Aleksandr Dubinsky

1
Odpowiedź musi być zaktualizowana. Java 8 będzie obsługiwany od wersji Android Studio 3.0 i Gradle Plugin 3.0.
Юрій Мазуревич

350

AKTUALIZACJA 2017/11/04 - Android Studio 3.0 ma teraz natywną obsługę Java 8. Nie gradle-retrolambda jest już potrzebny. Zobacz https://developer.android.com/studio/write/java8-support.html

Powyższy link zawiera również instrukcje migracji, jeśli używasz gradle-retrolambda. Oryginalna odpowiedź poniżej:


Android nie obsługuje Java 8. Obsługuje tylko Java 7 (jeśli masz KitKat) i nadal nie ma wywoływanej dynamiki, tylko nowy cukier składniowy.

Jeśli chcesz używać lambdas, jednej z głównych funkcji Java 8 w systemie Android, możesz użyć gradle-retrolamba . Jest to zależna od wersji kompilacja, która integruje retrolambda, narzędzie konwertujące kod bajtowy Java 8 z powrotem na Javę 6/7. Zasadniczo, jeśli ustawisz kompilator w Android Studio na kompilowanie kodu bajtowego Java 8, co pozwoli na lambdas, przekonwertuje go z powrotem na kod bajtowy Java 6/7, który z kolei zostanie przekonwertowany na kod bajtowy dalvik. To hack, jeśli chcesz wypróbować niektóre funkcje JDK 8 w Androidzie zamiast oficjalnego wsparcia.


13
Trudno było go uruchomić, ale kiedy rzeczywiście wykonałem właściwe instrukcje, działało to dobrze. Uwaga dla użytkowników Eclipse: Eclipse nie działa z tym dobrze, sugeruję migrację do Android Studio (będę tęsknić za Eclipse, ale tak już musi być!)
Simon Forsberg

2
Nitpick: klauzule multi-catch z Java 7 NIE są obsługiwane przez system Android.
csvan

11
Obsługiwany jest tryb Multi-catch, tylko funkcja JDK7 nieobsługiwana przez system Android to try-with-resources
Matthieu Harlé

12
Java 7 współpracuje ze wszystkimi wersjami Androida. Jeden wyjątek: try-with-resourcesdziała tylko od Kitkat.
Dmitrij Zajcew

2
@Simon André Forsberg (uwaga: bezwstydna wtyczka!) - jeśli chodzi o brak obsługi interfejsu API strumienia Java 8, możesz skorzystać z mojej biblioteki pod adresem sourceforge.net/projects/streamsupport - wyraźnie dotyczy on obsługi systemu Android.
Stefan Zobel

99

Rzeczywiście możesz użyć gradle-retrolamba zależności kompilacji stopniowej do korzystania z Java 8 dla rozwoju Androida.

Poniżej znajduje się kompletny przewodnik, który ostatnio śledziłem, aby uruchomić wyrażenia lambda dla rozwoju Androida. Oryginalne źródło tego przewodnika jest wymienione na końcu.

W tym przewodniku zostanie zaprezentowana metoda wprowadzenia niektórych funkcji Java 8 do Narzędzi programistycznych dla systemu Android, szczególnie ukierunkowana na środowisko Eclipse IDE. Jednak kroki opisane w tym przewodniku można również dostosować do nowego środowiska programistycznego powstania Google, Android Studio. Opiera się na wydaniu społecznościowym popularnego IntelliJ Idea IDE autorstwa JetBrains, a ostatnio został zaktualizowany do wersji beta przez Google na początku lipca 2014 r., Nieco przed napisaniem tego przewodnika. Eclipse pozostanie ważnym środowiskiem programistycznym, przynajmniej przez jakiś czas, a biorąc pod uwagę fakt, że większość projektów na Androida zostało opracowanych przy użyciu Eclipse, metoda wprowadzania nowych funkcji Java 8, takich jak wyrażenia lambda do ADT, wydaje się bardzo przydatna dla programistów.

Android Development opiera się na niestandardowej implementacji Java o nazwie Apache Harmony Project, która została zakończona w 2011 roku. Najczęściej stosowaną składnią Java w Android Development jest Java 6 (wersja 1.6), a Java 7 (wersja 1.7) jest również częściowo obsługiwana na edycja KitKat (Android 4.4. +). Dlatego funkcje Java 8, takie jak wyrażenia lambda, nie mogą być używane bezpośrednio w tworzeniu aplikacji na Androida bez zastosowania drobnych poprawek w narzędziach programistycznych. Na szczęście te konstrukcje są w zasadzie niektórymi ulepszeniami „cukru syntaktycznego”, które dają programistom wady takich rzeczy jak „anonimowe klasy” i mogą być przetłumaczone na klasy Java 6 lub Java 7.

Najnowsze podejście do tłumaczenia kodu źródłowego Java 8 na niższe wersje Java nazywa się RetroLambda . Ta biblioteka sprawia, że ​​programiści uruchamiają kod Java 8 z wyrażeniami lambda na Javie 7 lub nawet niższej. Niestety funkcje Java 8 inne niż wyrażenia lambda nie są na razie obsługiwane przez RetroLambda, ale koncepcja wyrażeń lambda jest największym skokiem na platformie Java 8 i jest świetnym narzędziem dla programistów Androida.

Szczegóły dotyczące tej biblioteki można znaleźć na stronie GitHub:

https://github.com/orfjackal/retrolambda#getting-started

Ponadto wtyczka Gradle dla RetroLambda utworzona przez innego programistę umożliwia implementację kompilacji opartych na Gradle w projektach Java lub Android. Jednak deweloper wspomina tylko o integracji tej wtyczki ze środowiskiem Android Studio. Szczegóły można znaleźć na stronie GitHub:

https://github.com/evant/gradle-retrolambda

Korzystanie z tych infrastruktur w środowisku programistycznym opartym na środowisku Eclipse nie jest możliwe bezpośrednio, ale jest wykonalne i zostanie przedstawione w tym przewodniku.

Przygotowanie

W tym przewodniku założono, że czytelnik ma podstawową wiedzę na temat programowania w Androidzie i jest oparty na wersji 22.6.2 programu ADT, ponieważ wydaje się, że w najnowszej wersji 23.0.2 programu ADT występują problemy z tworzeniem folderów układu. Szczegółowe informacje na temat tego problemu można znaleźć pod następującym linkiem:

http://code.google.com/p/android/issues/detail?id=72591

Kroki w tym przewodniku zostaną podane dla 64-bitowej maszyny programistycznej Windows 8.1, ale można je łatwo dostosować do innych platform. Nowy system kompilacji Gradlebędzie wykorzystywany do procesów kompilacji / czyszczenia, a także zapewniona zostanie procedura instalacji. Ponadto, zarówno JDK 8i JDK 7muszą współistnieć na maszynie rozwoju. Aby je zainstalować, należy wykonać kroki podane poniżej:

  • Przejdź do strony podglądu wczesnego dostępu JDK 8 http://jdk8.java.net
  • Pobierz JDK 8u20 i zainstaluj go. Instalacja środowiska JRE 8 nie jest konieczna i można go pominąć
  • Przejdź do strony najnowszej stabilnej wersji JDK 7 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
  • Pobierz JDK 7u65 i zainstaluj go. Instalacja JRE 7 ponownie nie jest konieczna i można ją pominąć
  • Dodaj folder domowy JDK 8 i folder JDK 8 bindo swojej %PATH%zmiennej
  • Utwórz nową zmienną środowiskową JAVA_HOMEo wartości ścieżki do folderu domowego JDK 8
  • Utwórz JAVA8_HOMEponownie nową zmienną środowiskową z wartością ścieżki do folderu domowego JDK 8
  • Utwórz nową zmienną środowiskową JAVA7_HOMEo wartości ścieżki do folderu domowego JDK 7
  • Otwórz okno terminala, uruchom java -versionpolecenie i sprawdź, czy Java 8 jest uruchomiona
  • Uruchom javac -versionkomendę w tym samym oknie i sprawdź, czy kompilator Java JDK 8 jest również uruchomiony

Teraz ADT-22.6.2 należy pobrać z następującego linku:

http://dl.google.com/android/adt/22.6.2/adt-bundle-windows-x86_64-20140321.zip

  • Pobierz ADT i rozpakuj jego zawartość do folderu, np D:\adt
  • Zdefiniuj nową zmienną środowiskową wywoływaną ANDROID_HOMEz wartością ścieżki do folderu instalacyjnego ADT, npD:\adt\sdk
  • Dodaj swoje Andoid SDK Platform Toolsi Andoid SDK Toolsfoldery, np. D:\adt\sdk\toolsI D:\adt\sdk\platform-tools, do swojej %PATH%zmiennej
  • Jeśli chcesz, utwórz skrót do Eclipse IDE. Znajduje się w folderze instalacyjnym narzędzia ADT, npD:\adt\eclipse
  • Uruchom Eclipse IDE i utwórz przestrzeń roboczą, np D:\adt\workspace
  • Kliknij Android SDK Managerprzycisk znajdujący się na pasku narzędzi
  • Wybierz Android SDK Build tools Rev. 19.1i Android Support Librarytylko. Odznacz wszystko inne i zainstaluj te dwa pakiety.

Jeśli wszystko pójdzie dobrze, ADT uruchomi się.

Zdecydowanie zaleca się również instalację następujących narzędzi:

  • Obsługa Eclipse Kepler Java 8: Sprawia, że ​​Eclipse rozpoznaje nowe rozszerzenia składni Java 8 i pozwala pozbyć się irytującego red dotsedytora kodu Java. Może być zainstalowany Help -> Install New Softwarew Eclipse. Wpisz http://download.eclipse.org/eclipse/updates/4.3-P-builds/ w Work withpolu i kontynuuj instalację.

  • Nodeclipse / Enide Gradle: Służy głównie do wyróżnienia słów kluczowych w języku Groovy. Groovy jest używany jako DSL dla skryptów kompilacji Gradle. Wtyczkę można zainstalować za pośrednictwem Eclipse Marketplace. Jednak Eclipse w ADT-22.6.2 nie występuje Eclipse Marketplace Client. Dlatego najpierw musisz zainstalować Eclipse Marketplace Clientza pomocą Install New Softwarenarzędzia w Eclipse. Wpisz http //: download.eclipse.org/mpc/kepler/ w Work withpolu i kontynuuj instalację. Po zainstalowaniu Eclipse Marketplace Client, można szukać Nodeclipse/Enide Gradlew Eclipse Marketplace Clienti zainstalować go.

  • Genymotion Virtual Device: Jest to świetny zamiennik domyślnego oprogramowania Android Virtual DeviceADT. AVD jest denerwująco kłopotliwy i ciągle zawiesza się bez powodu. Genymotion pozwala przygotować Android VD za pomocą CyanogenModobrazów, które są wykonywane przez Oracle VirtualBox . Licencja dla jednego użytkownika jest bezpłatna i można ją pobrać ze strony http://www.genymotion.com . Wymagany jest tylko login i można go również zintegrować z Eclipse. Szczegóły można znaleźć pod:

https://cloud.genymotion.com/page/doc/#collapse8

Poniżej znajduje się zrzut ekranu urządzenia wirtualnego CyanogenMod z systemem Android 4.3,

wprowadź opis zdjęcia tutaj

Można to uznać za pełnoprawne urządzenie z Androidem działające na komputerze osobistym z procesorem x86 lub x64. Aby korzystać z usług Google, takich jak Google PlayStorena tym urządzeniu wirtualnym, gappsobraz używanej wersji Androida musi zostać flashowany na urządzeniu. Właściwy gappsobraz urządzenia można pobrać ze strony CyanogenMod:

http://wiki.cyanogenmod.org/w/Google_Apps

Instalacja stopniowa jest opcjonalna, ponieważ zapewnia ją także sam zestaw SDK systemu Android, ale zdecydowanie zaleca się jej oddzielną instalację. Instalację można przeprowadzić, wykonując następujące kroki:

  • Przejdź do strony internetowej Gradle: http://www.gradle.org/

  • Kliknij Downloads

  • W obszarze Previous Releaseswybierz wersję 1.10 i pobierz plik gradle-1.10-all.zip lub gradle-1.10-bin.zip
  • Rozpakuj jego zawartość do folderu, np D:\adt\gradle
  • Zdefiniuj nową zmienną środowiskową wywoływaną GRADLE_HOMEz wartością ścieżki do folderu instalacyjnego Gradle, npD:\adt\gradle
  • Dodaj folder binarny Gradle, np. D:\adt\gradle\binDo %PATH%zmiennej
  • Otwórz okno terminala i uruchom gradle -vpolecenie i sprawdź, czy działa poprawnie. Jeśli do tego momentu dojdziesz pomyślnie, oznacza to, że jesteś gotowy do stworzenia swojej pierwszej aplikacji na Androida przy użyciu funkcji Java 8.

Aplikacja demonstracyjna

Zostanie utworzona prosta aplikacja, aby zademonstrować użycie narzędzi opisanych w poprzedniej sekcji. Możesz po prostu wykonać poniższe kroki, aby uzyskać wgląd w używanie wyrażeń lambda w Narzędziach dla programistów Androida:

  • Uruchom Eclipse IDE i utwórz nową aplikację na Androida, wybierając File -> New -> Other -> Android -> Android Application Project
  • Wypełnij poniższy formularz, jak pokazano poniżej:

wprowadź opis zdjęcia tutaj

  • Po prostu kliknij Nextprzycisk na poniższych formularzach i Finishprzycisk na ostatnim. Poczekaj, aż ADT zakończy ładowanie projektu
  • Kliknij projekt prawym przyciskiem myszy, wybierz go New -> Folderi nazwijbuilders
  • Kliknij gen (Generated Java Files)folder prawym przyciskiem myszy i usuń go. Gradle wkrótce wygeneruje dla nas te same pliki i dodamy je do s build path. Thefolderu projektu gen` utworzonego przez domyślnego konstruktora Ant nie jest już potrzebny, a artefakty w tym folderze będą przestarzałe
  • Utwórz następujące pliki wsadowe w buildersfolderze:

    • gradle_build.cmd
    • gradle_post_build.cmd
    • gradle_clean.cmd
  • Wypełnij te pliki wsadowe w następujący sposób:

gradle_build.cmd:

wprowadź opis zdjęcia tutaj

gradle_post_build.cmd:

wprowadź opis zdjęcia tutaj

gradle_clean.cmd:

wprowadź opis zdjęcia tutaj

  • Odznacz opcję Project -> Build Automaticallymenu
  • Kliknij projekt prawym przyciskiem myszy, a następnie zaznacz Properties -> Buildersi odznacz wszystkie domyślne programy budujące dostarczone przez ADT
  • Kliknij Newprzycisk w tym samym oknie, wybierz Programi kliknijOK
  • Pojawi się okno konfiguracji nowego konstruktora. Wypełnij zakładki w następujący sposób:

Main Karta nowej konfiguracji Konstruktora

wprowadź opis zdjęcia tutaj

Refresh Karta nowej konfiguracji Konstruktora

wprowadź opis zdjęcia tutaj

Environment Karta nowej konfiguracji Konstruktora

wprowadź opis zdjęcia tutaj

Build Options Karta nowej konfiguracji Konstruktora

wprowadź opis zdjęcia tutaj

  • Utwórz drugi konstruktor o nazwie, Gradle_Post_Buildktóry używa gradle_post_build.cmdjako swojego programu. Wszystkie pozostałe ustawienia tego konstruktora muszą być dokładnie takie same z poprzednio utworzonym konstruktorem. Ten konstruktor będzie odpowiedzialny za kopiowanie artefaktów utworzonych przez proces kompilacji do binfolderu.
  • Utwórz trzeci konstruktor o nazwie, Gradle_Cleanerktóry używa gradle_clean.cmdjako programu. Tylko Run the builderustawienie na ostatniej karcie musi być ustawione jako During a Clean. Wszystkie pozostałe ustawienia tego konstruktora muszą być identyczne z pierwszym konstruktorem. Ten konstruktor będzie odpowiedzialny za czyszczenie artefaktów utworzonych przez proces kompilacji, jak sugeruje nazwa.

Nowi budowniczowie HelloLambdaprojektu

wprowadź opis zdjęcia tutaj

  • Kliknij projekt prawym przyciskiem myszy i wybierz Export
  • Wybierz Android -> Generate Gradle Build Filesi kliknijNext
  • Wybierz projekt w następnym oknie i kliknij Finish
  • Przejdź do folderu głównego swojego projektu i usuń pliki gradleworaz gradlew.bat. Usuń także gradlefolder
  • Wróć do Eclipse i wybierz Project -> Cleanopcję menu. Wypełnij formularz, który pokazuje się w następujący sposób:

Clean Project Okno

wprowadź opis zdjęcia tutaj

  • Kliknij OKi poczekaj, aż proces czyszczenia się zakończy
  • Dodaj fragment kodu Java podany poniżej zaraz po wywołaniu setContentViewfunkcji w swojej MainActivityklasie:

wprowadź opis zdjęcia tutaj

  • Zmień początek build.gradlepliku do sourceCompatibilitysekcji w następujący sposób:

wprowadź opis zdjęcia tutaj

  • Kliknij projekt prawym przyciskiem myszy i wybierz Properties -> Java Compiler opcję i ustaw wszystkie poziomy zgodności na Java 8. Dzięki temu Eclipse rozpozna nowe konstrukcje Java 8, takie jak wyrażenia lambda.
  • Kliknij No w oknie powiadomienia
  • Kliknij projekt prawym przyciskiem myszy i wybierz Build project. Eclipse rozpocznie budowę projektu.

Proces kompilacji wprowadź opis zdjęcia tutaj

  • Kliknij projekt prawym przyciskiem myszy i przejdź do Properties -> Java Build Path. Dodaj następujące foldery do ścieżki kompilacji (również pokazane na poniższym obrazku):

    • build\source\buildConfig\debug
    • build\source\r\debug

wprowadź opis zdjęcia tutaj

Eclipse będzie teraz mógł rozpoznawać R.javai buildConfig.javapliki i nie będzie wyświetlał żadnych, red dotsktóre oznaczałyby błędy związane z plikami zasobów projektu.

  • Utwórz nowy Run Configurationdla docelowej platformy Android, klikając projekt prawym przyciskiem myszy, a następnie wybierając Run As -> Run Configurations. Na przykład ta aplikacja demonstracyjna wygląda tak, jak pokazano poniżej na Genymotion VD:

Aplikacja HelloLambda

wprowadź opis zdjęcia tutaj

W LogCatoknie można zauważyć, że fragment kodu z prostym wyrażeniem lambda działa poprawnie

wprowadź opis zdjęcia tutaj

Źródło: Korzystanie z wyrażeń lambda Java 8 w narzędziach dla programistów Androida


Ale czy będziesz w stanie debugować ten kod za pomocą debugera systemu Android? Zgaduję, że stosy / numery linii nie byłyby kompatybilne. Wydaje się, że jest to poważna wada programowania Java 8 na Androida.
Zombie

2
@Zombies Tak, nadal możesz go debugować. Wszystko działa dobrze.
Korniltsev Anatoly

42

Kliknij ten link, aby uzyskać nowe aktualizacje. Użyj funkcji języka Java 8

Stara odpowiedź

Począwszy od wersji zapoznawczej Androida N, obsługa Androida ograniczona liczba funkcji Java 8 znajduje się w części Funkcje języka Java 8

Aby zacząć korzystać z tych funkcji, musisz pobrać i skonfigurować Android Studio 2.1 oraz zestaw SDK podglądu Androida N, który zawiera wymagany zestaw narzędzi Jacka i zaktualizowaną wtyczkę dla systemu Android w wersji Gradle. Jeśli nie masz jeszcze zainstalowany Android SDK Preview N, zobacz skonfigurowany do Develop dla Androida N .

Obsługiwane funkcje językowe i interfejsy API języka Java 8

Android nie obsługuje obecnie wszystkich funkcji językowych Java 8. Jednak przy opracowywaniu aplikacji ukierunkowanych na podgląd Androida N dostępne są teraz następujące funkcje:

Domyślne i statyczne metody interfejsu

Wyrażenia lambda (dostępne również na poziomie API 23 i niższych)

Powtarzalne adnotacje

Referencje metod (dostępne również na poziomie API 23 i niższych)

Istnieje kilka dodatkowych funkcji Java 8, które obsługują system Android. Pełne szczegóły można znaleźć w funkcjach językowych Java 8

Aktualizacja

Uwaga: Android N opiera implementację wyrażeń lambda na klasach anonimowych. Takie podejście pozwala im być kompatybilnym wstecz i działać na starszych wersjach Androida. Aby przetestować wyrażenia lambda we wcześniejszych wersjach, pamiętaj, aby przejść do pliku build.gradle i ustawić compileSdkVersion i targetSdkVersion na 23 lub niższą.

Aktualizacja 2

Teraz stabilne wydanie Androida studio 3.0 obsługuje biblioteki Java 8 i funkcje języka Java 8 (bez kompilatora Jack).


Coś nie zrozumiałem. Czy jest jakiś wymóg minSdkVersion?
WindRider

Myślę, że tylko wyrażenia lambda są kompatybilne wstecz, inne funkcje Java 8 będą działać tylko na N (lub przyszłej wersji). Nie testowałem tego, ale rozumiem to z dokumentów Androida. Tak więc dla funkcji Java 8 minSdkVersion ma wartość N, inną niż wyrażenie lambda

Więc ... jeszcze kilka lat, zanim N zostanie liderem na desce rozdzielczej. :(
WindRider

Niestety tak. lub dopóki Android jakoś nie zapewni kompatybilności wstecznej, takiej jak lambda

1
@WindRider, możesz użyć minSdkVersion 15 i nowszych. Obecnie używam minSdkVersion 17 w moim projekcie Androida z Lambdas i wszystko działa.
YYamil

22

Tak, Android obsługuje teraz Java 8 (24.1.17)

Teraz jest to możliwe

Ale musisz uruchomić rom urządzenia na java 1.8 i włączyć „jackOptions”, aby go uruchomić. Jack to nazwa nowego kompilatora Androida z Javą 8

https://developer.android.com/guide/platform/j8-jack.html

dodaj te linie do build_gradle

    android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Java 8 wydaje się być działającym silnikiem Java w Android Studio 2.0, ale po sprawdzeniu nadal nie akceptuje składni java 8 i nie można teraz wybrać kompilatora z Android Studio. Możesz jednak użyć wtyczki Scala, jeśli potrzebujesz funkcjonalnego mechanizmu programowania w swoim kliencie z Androidem.

wprowadź opis zdjęcia tutaj


1
Scala byłaby bardzo ciężka do spakowania za pomocą apk
TechSpellBound

Zapoznaj się z tym rozwiązaniem dotyczącym zaktualizowanego Androida Studio 2.0, ponieważ dokonali oni aktualizacji ograniczonych opcji konfiguracji.
Gaurav Sharma

19

Android używa Java, która rozgałęzia się z Java 6.

Jak z Android SDK w wersji 19, można użyć Java 7 cech robiąc to . Nie ma jeszcze pełnej obsługi Java 8 (jeszcze).


1
jesteś ratownikiem. Czy wiesz, czy istnieje również coś, co implementuje try-with-resources w podobny sposób?
galets

@ galets nie ma jeszcze sposobu, ale postawiłbym na dodanie Google w pewnym momencie w przyszłości. Dodatkowe informacje, patrz: stackoverflow.com/questions/16921337/...
chaqke

16

Natywna Java 8 pojawia się na Androidzie! Wreszcie!

usuń wtyczkę Retrolambda i blok retrolambda z pliku build.gradle każdego modułu:

Aby wyłączyć Jacka i przejść do domyślnego zestawu narzędzi, po prostu usuń blok jackOptions z pliku build.gradle modułu

Aby rozpocząć korzystanie z obsługiwanych funkcji języka Java 8, zaktualizuj wtyczkę Androida do wersji 3.0.0 (lub nowszej)

Począwszy od Androida Studio 3.0, funkcje języka Java 8 są teraz natywnie obsługiwane przez Androida:

  • Wyrażenia lambda
  • Odnośniki do metod
  • Wpisz adnotacje (obecnie informacje o adnotacjach typu nie są dostępne w czasie wykonywania, ale tylko w czasie kompilacji);
  • Powtarzające się adnotacje
  • Domyślne i statyczne metody interfejsu (na poziomie API 24 lub wyższym, brak obsługi natychmiastowego uruchomienia);

Również od poziomu minimum 24 API dostępne są następujące API Java 8:

  • java.util.stream
  • java.util.function
  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.AnnotatedElement.getAnnotationsByType (klasa)
  • java.lang.reflect.Method.isDefault ()

Dodaj następujące wiersze do build.gradle modułu aplikacji, aby poinformować projekt o poziomie języka:

 android {
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }

Wyłącz obsługę funkcji języka Java 8, dodając następujące elementy do pliku gradle.properties :

android.enableDesugar=false

Jesteś skończony! Możesz teraz używać natywnego java8!


14

Android OFICJALNIE obsługuje Javę 8 od Androida N.

Dostępne są ogłoszenia funkcji , ogłoszenie w języku Java 8 to:

Ulepszona obsługa języka Java 8 - Cieszymy się, że wprowadzamy funkcje języka Java 8 na Androida. Dzięki kompilatorowi Jack'a dla Androida możesz teraz korzystać z wielu popularnych funkcji języka Java 8, w tym lambdów i innych, w wersjach Androida już od Gingerbread. Nowe funkcje pomagają zredukować kod płyty grzewczej. Na przykład lambdas mogą zastępować anonimowe klasy wewnętrzne podczas dostarczania detektorów zdarzeń. Niektóre funkcje języka Java 8 - takie jak domyślne i statyczne metody, strumienie i interfejsy funkcjonalne - są teraz dostępne również w wersji N i nowszej. Dzięki Jackowi nie możemy się doczekać bliższego śledzenia języka Java przy jednoczesnym zachowaniu kompatybilności wstecznej.


W tej chwili nadal jest dość błędny, na przykład Instant Run nie działa z lambdas: jeśli zmienisz jakiś kod w funkcji lambda, zmiana nie zostanie przyjęta.
adriendenat

12

Możemy używać Java 8 przy użyciu:

  1. W build.gradle (Project: myProject) dodaj następujące

    classpath 'me.tatarka:gradle-retrolambda:x.x.x' //x.x.x is recent version
  2. W build.gradle (Module: myModule) dodaj następujące

    apply plugin: 'me.tatarka.retrolambda'
    
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

1
Czym różni się od pierwszej odpowiedzi, która zalecała retro lambda?
Maarten Bodewes

2
@ MaartenBodewes Wydaje się, że zwrócił uwagę, że stało się znacznie prostsze niż zaakceptowana odpowiedź. Patrz medium.com/android-news/…
TechSpellBound

Nie używaj tego. Wtyczka jest
wadliwa

11

AKTUALIZACJA 2020/01/17

Android Studio 4.0 obejmuje obsługę wielu interfejsów API języka Java 8 przy użyciu techniki zwanej desugaring, bez wymagania minimalnego poziomu interfejsu API dla Twojej aplikacji:
https://developer.android.com/studio/preview/features#j8-desugar

W tej wersji obsługiwany jest następujący zestaw interfejsów API:

  • Strumienie sekwencyjne ( java.util.stream)
  • Podzbiór java.time
  • java.util.function
  • Najnowsze dodatki do java.util.{Map,Collection,Comparator}
  • Opcjonalne ( java.util.Optional, java.util.OptionalIntijava.util.OptionalDouble ) oraz kilka innych nowych klas przydatnych w powyższych interfejsach API
  • Niektóre dodatki do java.util.concurrent.atomic(nowe metody, na AtomicInteger, AtomicLongi AtomicReference)
  • ConcurrentHashMap (z poprawkami błędów dla Androida 5.0)

Aby obsługiwać te interfejsy API języka, D8 kompiluje osobny plik DEX biblioteki, który zawiera implementację brakujących interfejsów API i dołącza go do Twojej aplikacji. Proces wyłączania przepisuje kod aplikacji, aby zamiast tego korzystać z tej biblioteki w czasie wykonywania.

Aby włączyć obsługę tych interfejsów API języka, dołącz następujące build.gradlepliki do pliku modułu :

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 {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4'
}

ORYGINALNY POCZTA Z 2017 ROKU

Android Studio 3.0 zaczął zapewniać wbudowaną obsługę niektórych funkcji języka Java 8, którymi są:

  • Wyrażenia lambda
  • Odnośniki do metod
  • Wpisz adnotacje (informacje są dostępne w czasie kompilacji, ale nie w czasie wykonywania)
  • Powtarzające się adnotacje
  • Domyślne i statyczne metody interfejsu

Począwszy od poziomu API 24, dostępne są następujące API Java 8:

  • java.util.stream
  • java.util.function
  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.AnnotatedElement.getAnnotationsByType(Class)
  • java.lang.reflect.Method.isDefault()

Poza tym try-with-resources wsparcie zostało rozszerzone na wszystkie poziomy API Androida.

Więcej funkcji Java 8 zostanie dodanych w przyszłości.

Aby rozpocząć korzystanie z obsługiwanych funkcji języka Java 8, zaktualizuj wtyczkę Androida do wersji 3.0.0-alpha1 (lub nowszej) i dodaj następujące elementy do pliku build.gradle modułu:

android {
  ...
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Więcej informacji na stronie:
https://developer.android.com/studio/write/java8-support.html


Czego nie rozumiem, co Android Studio ma wspólnego ze wsparciem java8 (czy wcześniej Intellij go nie miał) ?! Czy to oznacza, że ​​jeśli użyję gradle na terminalu do skompilowania projektu, to się nie skompiluje ?!
cesarferreira,

1
@cesarferreira Musisz zaktualizować wtyczkę Androida do najnowszej wersji (która jest obecnie 2.4.0-alpha6). Sprawdź blok cytatów w odpowiedzi.
Idolon,

Dodanie go do modułu (nie aplikacji), w którym pracuję, było haczykiem. Dodanie do modułu aplikacji nie pomogło.
Surekha

6

Łatwy sposób

Możesz włączyć obsługę java 1.8 dla projektu Android.

  • Otwarta struktura projektu

    • Albo naciskając Ctrl + Shift + Alt + S

    • Lub File > Project Structure

  • Zaktualizuj Zgodność źródła i Zgodność docelową do 1.8 w oknie dialogowym Struktura projektu, jak pokazano (kliknij Plik> Struktura projektu).

wizerunek

Lub możesz użyć gradle

 android {
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }

Synchronizuj projekt. I to wszystko!

Uwaga: obsługę Java 1.8 można włączyć dla Androida Studio 3.0.0 lub nowszego. Zobacz dokumentację do dalszego czytania.


To rozwiązanie działało dla mnie: stackoverflow.com/a/55467237/4698320
Däñish Shärmà

5

Kiedy zadałem to pytanie prawie 2 lata temu, odpowiedź naprawdę brzmiała „oficjalnie” nie, ale jak wskazano w odpowiedzi ekcr1, możesz uzyskać jedną z najbardziej oczekiwanych funkcji (lambdas), jeśli będziesz używać retrolamby. W tym czasie nadal korzystałem z Eclipse, ponieważ Android Studio był w trybie „podglądu”, więc nigdy nie podążałem tą ścieżką.

Dziś myślę, że „oficjalna” odpowiedź wciąż brzmi „nie” i chociaż retrolamba nadal wydaje się dobrą drogą, istnieje inna opcja dla tych, którzy chcą zejść nieco „nieoficjalną” drogą, mianowicie Kotlin.

Dzisiaj Kotlin osiągnął 1.0.0. Dla tych, którzy nie znają Kotlin, więcej informacji można znaleźć na ich stronie internetowej tutaj:

https://kotlinlang.org

lub obejrzyj ten filmik z przemową Jake'a Whartona

https://www.youtube.com/watch?v=A2LukgT2mKc


4

Najnowsze wiadomości:

Google ogłasza, że ​​w systemach Android N i Android Studio 2.1+ platforma będzie obsługiwać Javę 8. Wydano również stabilną wersję studia 2.1.

Nareszcie możemy użyć wyrażeń lambda. Koniec filtrowania listy dla pętli. Horeeey


4

Dodaj tę konfigurację build.gradle i synchronizuj gradate:

android {
    ...
    defaultConfig {
        ...
        jackOptions {
            enabled true
        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        // or
        //sourceCompatibility 1.8
        //targetCompatibility 1.8
    }
}

1
To jest poprawny sposób na dodanie obsługi projektów Java 8 dla Androida. Minusem jest to, że natychmiastowe uruchomienie nie działa obecnie, gdy jack jest włączony.
Ionut Negru,

Nie pełne wsparcie.
Ahmad Aghazadeh

2

Google właśnie ogłosił, że Java 8 będzie natywnie obsługiwana przez system Android i że zestaw narzędzi Jacka przestanie działać:

Zdecydowaliśmy się dodać obsługę funkcji języka Java 8 bezpośrednio do obecnego zestawu narzędzi javac i dx, a także przestać używać łańcucha narzędzi Jack. W tym nowym kierunku istniejące narzędzia i wtyczki zależne od formatu pliku klasy Java powinny nadal działać. W przyszłości funkcje języka Java 8 będą natywnie obsługiwane przez system kompilacji Androida. Naszym celem jest uruchomienie go w ramach Android Studio w nadchodzących tygodniach i chcieliśmy udostępnić tę decyzję wcześniej.

Więcej informacji tutaj: https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html


2

Tak. Wkrótce będziemy używać Java 8!

Zdecydowaliśmy się dodać obsługę funkcji języka Java 8 bezpośrednio do obecnego zestawu narzędzi javac i dx, a także przestać używać łańcucha narzędzi Jack. W tym nowym kierunku istniejące narzędzia i wtyczki zależne od formatu pliku klasy Java powinny nadal działać. W przyszłości funkcje języka Java 8 będą natywnie obsługiwane przez system kompilacji Androida. Naszym celem jest uruchomienie go w ramach Android Studio w nadchodzących tygodniach i chcieliśmy udostępnić tę decyzję wcześniej.

https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html


2

dodaj tę linię do modułu lvl build gradel

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }


1

Napisałem podobną odpowiedź na podobne pytanie na temat przepełnienia stosu, ale oto część tej odpowiedzi.

Android Studio 2.1:

Nowa wersja Androida Studio (2.1) obsługuje funkcje Java 8. Oto fragment postu blogspot Android Developers :

... Wersja Android Studio 2.1 zawiera obsługę nowego kompilatora Jacka i obsługę Java 8 .

...

Aby korzystać z funkcji języka Java 8 podczas programowania z N Developer Preview, musisz użyć kompilatora Jack. Kreator nowego projektu [Plik → Nowy → Projekt] generuje prawidłowe konfiguracje dla projektów kierowanych na N.


Przed Android Studio 2.1:

Android nie obsługuje jeszcze Java 1.8 (obsługuje tylko do 1.7), więc nie można używać funkcji Java 8, takich jak lambdas.

Ta odpowiedź zawiera więcej szczegółów na temat kompatybilności Android Studio ; w Stanach:

Jeśli chcesz używać lambdas, jednej z głównych funkcji Java 8 w systemie Android, możesz użyć gradle-retrolamba

Jeśli chcesz dowiedzieć się więcej na temat używania gradle-retrolambda, ta odpowiedź zawiera wiele szczegółowych informacji na ten temat .


Cześć Farbod! Używam AndroidStudio 2.2.2 Mój "SDK Location"(to jest na Macu FWIW) mówi tylko: "/Users/me/Library/Android/sdk" Czy używam Java8 - jak korzystać z Java8? Dzięki!
Fattie,

1

Pomyślałem, że opublikuję zaktualizowaną odpowiedź dla tych, którzy szukają czegoś bardziej aktualnego.

Obecnie Android i Android Studio obsługują podzbiór funkcji Java 8. Według dokumentacji Androida znajdującej się na ich stronie internetowej Google mówi:

Obsługa funkcji języka Java 8 wymaga nowego kompilatora o nazwie Jack. Jack jest obsługiwany tylko w Android Studio 2.1 i nowszych wersjach. Jeśli więc chcesz korzystać z funkcji języka Java 8, musisz zbudować aplikację za pomocą Androida Studio 2.1.

Jeśli masz już zainstalowany Android Studio, upewnij się, że dokonałeś aktualizacji do najnowszej wersji, klikając Pomoc> Sprawdź dostępność aktualizacji (na Macu, Android Studio> Sprawdź aktualizacje). Jeśli nie masz jeszcze zainstalowanego IDE na stacji roboczej, pobierz Android Studio tutaj.

Obsługiwane funkcje językowe i interfejsy API języka Java 8

Android nie obsługuje wszystkich funkcji języka Java 8. Jednak podczas opracowywania aplikacji ukierunkowanych na system Android 7.0 (interfejs API na poziomie 24) dostępne są następujące funkcje:

  • Domyślne i statyczne metody interfejsu Wyrażenia lambda (dostępne również na poziomie API 23 i niższych)
  • Powtarzalne adnotacje
  • Odnośniki do metod (dostępne również na poziomie API 23 i niższych)
  • Adnotacje typu (dostępne również na poziomie API 23 i niższych)

Ponadto dostępne są również następujące interfejsy API języka Java 8:

Refleksje i interfejsy API związane z językiem:

  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.Method.isDefault () i interfejsy API Reflection związane z powtarzalnymi adnotacjami, takimi jak AnnotatedElement.getAnnotationsByType (klasa)

Interfejsy API narzędzi:

  • java.util.function
  • java.util.stream

Aby korzystać z nowych funkcji języka Java 8, musisz także użyć zestawu narzędzi Jack . Ten nowy zestaw narzędzi Androida kompiluje źródła języka Java w czytelny dla Androida kod bajtowy DEX, ma swój własny format biblioteki .jack i zapewnia większość funkcji łańcucha narzędzi w ramach jednego narzędzia: przepakowywanie, zmniejszanie, zaciemnianie i multideks.

Oto porównanie dwóch łańcuchów narzędzi używanych do tworzenia plików DEX dla Androida:

Legacy javac toolchain:
    javac (.java  .class)  dx (.class  .dex)
    New Jack toolchain:
    Jack (.java  .jack  .dex)

1

Zadałem to pytanie ponad 3 lata temu i oczywiście odpowiedzi zmieniły się na przestrzeni lat. Jak już wiele osób odpowiedziało, od dawna odpowiedź brzmi „ tak” . Nigdy nie aktualizowałem zaakceptowanej odpowiedzi, ponieważ była to wówczas poprawna odpowiedź. (Nie jestem pewien, na czym polegają zasady przepełnienia stosu)

Chciałem tylko dodać kolejną odpowiedź dla tych, którzy wciąż szukają tego tematu. Na dzień 17.05.2017 Google ogłosił również, że Kotlin jest również oficjalnym językiem programowania Androida.

Nie znalazłem oficjalnej informacji prasowej, ale obejrzałem niektóre filmy Google I / O, w których zostało ogłoszone. Oto link do postu na blogu zespołu Kotlin w ogłoszeniu.


1

Dodanie następującego rozwiązało problem dla mnie (Android studio 2.3.2):

build.gradle (projekt)

buildscript {
repositories {
    ...
    jcenter()
}
dependencies {
    ...
    classpath 'me.tatarka:gradle-retrolambda:3.4.0' // DEPENDENCY
    ...
   }
}

build.gradle (moduł: aplikacja)

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda' //PLUGIN

android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    } // SET JAVA VERSION
    ...
}


1

AKTUALIZACJA 28.10.2019

Android Studio 4.0 rozwiązuje ten problem .

Kompilator D8 wstawia backport rodzimych interfejsów API języka Java 8 do pliku APK podczas kompilacji, a aplikacja będzie używać tego kodu zamiast natywnych interfejsów API w czasie wykonywania. Proces ten nazywa się odladzaniem .


0

Wszystkie powyższe rozwiązania nie wydają się działać w 2019 roku w najnowszym Android Studio 3.4+ .

Wymyśliłem idealne i aktualne rozwiązanie do migracji lub uaktualnienia projektu Android Project do Java 8 .

Rozwiązanie: Kliknij Plik -> Struktura projektu -> Moduły -> zakładka Właściwości .

Zmień Zgodność źródłową i docelową na 1.8 (Java 8)

wprowadź opis zdjęcia tutaj



-1

Najłatwiejszy sposób na dodanie obsługi Java 8

 compileOptions {
    targetCompatibility = '1.8'
    sourceCompatibility = '1.8'
 }

Po prostu dodaj go do pliku build.gradle.


zduplikowana odpowiedź, niska jakość
stycznia
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.