Можно ли использовать Java 8 для разработки под Android?

609

При поиске в Интернете неясно, поддерживается ли Java 8 для разработки под Android или нет.

Прежде чем я скачаю / настрою Java 8, могу ли кто-нибудь указать мне на «официальную» документацию, в которой говорится, что Java 8 поддерживается или не поддерживается для разработки под Android.

NPN
источник
21
Я не знаю об официальном заявлении, но у меня есть Java 8 (редактор: JDK 8), работающий хорошо с Android SDK для меня. Windows 8.1 64 битная здесь.
Хоанг Хюйн
2
В этом посте обсуждались вопросы. Как версия Java для Android связана с версией Java SE?
Aboalnaga
2
@HoangHuynh вы можете использовать JDK 6 или выше для разработки Android. Тем не менее, компиляция поддерживает Java версии 6 (и 7 в случае KitKat). Я думаю, что OP имел в виду также для версии Java (не JDK)
waqaslam
13
Java 8 ОФИЦИАЛЬНО поддерживается в Android N. android-developers.blogspot.com/2016/03/…
Jay
2
возможно, скоро: developer.android.com/preview/j8-jack.html
Рэй Тайек

Ответы:

189

Ява 8

Android поддерживает все функции языка Java 7 и подмножество функций языка Java 8, которые зависят от версии платформы.

Чтобы проверить, какие функции Java 8 поддерживаются

Используйте возможности языка Java 8

Мы решили добавить поддержку функций языка Java 8 непосредственно в текущий набор инструментов javac и dx, а также отказаться от набора инструментов Jack. С этим новым направлением существующие инструменты и плагины, зависящие от формата файла класса Java, должны продолжать работать. В дальнейшем функции языка Java 8 будут изначально поддерживаться системой сборки Android. Мы планируем запустить это как часть Android Studio в ближайшие недели, и мы хотели бы поделиться этим решением с вами раньше.

Будущее поддержки языка Java 8 на Android

Eclipse Users:

Для старых разработчиков, предпочитающих Eclipse, Google перестает поддерживать инструменты разработчика Android Eclipse.

если вы установили Java 8 JDK, то попробуйте, если возникнут какие-либо проблемы, попробуйте установить компилятор как 1.6 в Eclipse из меню окна → НастройкиJavaКомпилятор . Java 7 тоже будет работать:

Настройки Eclipse -> Java -> Компилятор

Java 7 или выше требуется, если вы ориентируетесь на Android 5.0 и выше.

установите несколько JDK и попробуйте.

Eng. Самер Т
источник
2
Изменила ли Java 8 способ работы байт-кода? Если нет, то теоретически можно использовать любую версию Java, если она компилируется.
Бен Легжеро
6
правильный вопрос: что если вы используете новые функции в java 8, которых нет в java 7 для сборки приложения для Android, это нормально? чтобы быть в безопасности, следуйте официальным инструкциям.
англ. Самер Т
12
@ BenC.R.Leggiero В Java 8 нет нового байт-кода, но значения и структуры инструкций были изменены stackoverflow.com/questions/28228450/… stackoverflow.com/questions/16143684/…
phuclv
17
Пожалуйста, не публикуйте "Обновление N" в своем ответе. Перепишите его, чтобы иметь актуальную информацию. В противном случае SO через несколько лет будет так же трудно получить информацию, как и форумы, которые она заменила.
Александр Дубинский
1
Ответ нужно обновить. Java 8 будет поддерживаться начиная с Android Studio 3.0 и Gradle Plugin 3.0.
Юрій Мазуревич
350

ОБНОВЛЕНИЕ 2017/11/04 - Android Studio 3.0 теперь имеет встроенную поддержку Java 8. gradle-retrolambda Теперь больше не требуется. См. Https://developer.android.com/studio/write/java8-support.html.

Приведенная выше ссылка также содержит инструкции по миграции, если вы используете gradle-retrolambda. Оригинальный ответ ниже:


Android не поддерживает Java 8. Он поддерживает только Java 7 (если у вас есть kitkat), и при этом у него нет invokedynamic, только новый синтаксический сахар.

Если вы хотите использовать лямбды, одну из основных функций Java 8 в Android, вы можете использовать gradle-retrolamba . Это зависимая сборка, которая объединяет retrolambda, инструмент, который преобразует байт-код Java 8 обратно в Java 6/7. По сути, если вы установите компилятор в Android Studio для компиляции байт-кода Java 8, тем самым разрешив лямбда-выражения, он преобразует его обратно в байт-код Java 6/7, который затем, в свою очередь, преобразуется в байт-код dalvik. Это хак, если вы хотите попробовать некоторые функции JDK 8 в Android вместо официальной поддержки.

ekcr1
источник
13
Было немного сложно заставить его работать, но как только я действительно следовал правильным инструкциям, это сработало хорошо. Примечание для пользователей Eclipse: Eclipse не очень хорошо с этим работает, я предлагаю перейти на Android Studio (я буду скучать по Eclipse, но сейчас так и должно быть!)
Симон Форсберг,
2
Nitpick: предложения multi-catch из Java 7 НЕ поддерживаются Android.
ЦСВАН
11
Multi-catch поддерживается, только функция JDK7, не поддерживаемая Android, является
пробной
12
Java 7 работает со всеми версиями Android. Единственное исключение: try-with-resourcesработает только с Киткат.
Дмитрий Зайцев
2
@Simon André Forsberg (осторожно: бесстыдный плагин!) - что касается не поддержки потокового API Java 8, вы можете использовать мою библиотеку по адресу sourceforge.net/projects/streamsupport - в ней явно рассматривается поддержка Android.
Стефан Зобель
99

Вы действительно можете использовать gradle-retrolamba зависимость сборки gradle, чтобы использовать Java 8 для разработки Android.

Ниже приведено полное руководство, которому я недавно следовал при запуске лямбда-выражений для разработки под Android. Первоначальный источник этого руководства упоминается в конце.

В этом руководстве будет продемонстрирован метод добавления некоторых функций Java 8 в инструменты разработки Android, специально предназначенные для Eclipse IDE., Однако шаги, которые будут описаны в этом руководстве, также могут быть адаптированы к новой среде разработки восстания Google, Android Studio. Он основан на общедоступной версии популярной среды разработки IntelliJ Idea от JetBrains и недавно был обновлен до своей «бета-версии» компанией Google в начале июля 2014 года, незадолго до написания этого руководства. Eclipse останется выдающейся средой разработки, по крайней мере, на некоторое время, и с учетом того факта, что большинство проектов Android были разработаны с использованием Eclipse, метод добавления новых функций Java 8, таких как лямбда-выражения, в ADT, кажется весьма полезным для разработчиков.

Разработка Android основана на пользовательской реализации Java под названием Apache Harmony Project, которая была прекращена в 2011 году. Наиболее часто используемый синтаксис Java в разработке Android - это Java 6 (v1.6) и Java 7 (v1.7), которые также частично поддерживаются издание KitKat (Android 4.4. +). Поэтому функции Java 8, такие как лямбда-выражения, нельзя использовать непосредственно в разработке приложений для Android без применения некоторых настроек в инструментах разработки. К счастью, эти конструкции в основном представляют собой некоторые улучшения «синтаксического сахара», которые дают разработчикам недостатки таких вещей, как «анонимные классы», и они могут быть переведены в классы Java 6 или Java 7.

Недавний подход для перевода исходного кода Java 8 в более низкие версии Java называется RetroLambda . Эта библиотека заставляет разработчиков запускать код Java 8 с лямбда-выражениями на Java 7 или даже ниже. К сожалению, функции Java 8, отличные от лямбда-выражений, пока не поддерживаются RetroLambda, но концепция лямбда-выражений является самым большим скачком на платформе Java 8, и в любом случае это отличный инструмент для разработчиков Android.

Подробности об этой библиотеке можно найти на странице GitHub:

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

Кроме того, плагин Gradle для RetroLambda, созданный другим разработчиком, позволяет реализовывать сборки на основе Gradle в проектах Java или Android. Тем не менее, разработчик упоминает только об интеграции этого плагина в среду Android Studio. Подробности можно найти на его странице GitHub:

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

К этим инфраструктурам в среде разработки на основе Eclipse нельзя подходить напрямую, но это выполнимо и будет продемонстрировано в этом руководстве.

подготовка

В этом руководстве предполагается, что читатель имеет базовые знания об Android-разработке и основан на ADT версии 22.6.2, поскольку в последней версии ADT 23.0.2, по-видимому, имеются проблемы, такие как создание папки макета. Подробности об этой проблеме можно найти по следующей ссылке:

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

Шаги в этом руководстве будут даны для 64-битной машины для разработки под Windows 8.1, но их легко адаптировать к другим платформам. Новая система сборки Gradleбудет использоваться для процессов сборки / очистки, а также будет предоставлена ​​процедура ее установки. Также оба JDK 8и JDK 7должны сосуществовать на машине разработки. Для их установки необходимо выполнить следующие шаги:

  • Перейти на страницу предварительного просмотра JDK 8 http://jdk8.java.net
  • Скачайте JDK 8u20 и установите его. Установка JRE 8 не требуется, и ее можно пропустить
  • Перейдите на страницу последнего стабильного выпуска JDK 7 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html
  • Скачайте JDK 7u65 и установите его. Установка JRE 7 снова не требуется, и ее можно пропустить
  • Добавьте домашнюю папку JDK 8 и binпапку JDK 8 в свою %PATH%переменную
  • Создайте новую переменную среды JAVA_HOMEсо значением пути к домашней папке JDK 8
  • JAVA8_HOMEСнова создайте новую переменную среды со значением пути к домашней папке JDK 8
  • Создайте новую переменную среды JAVA7_HOMEсо значением пути к домашней папке JDK 7
  • Откройте окно терминала и выполните java -versionкоманду и убедитесь, что Java 8 запущена и работает
  • Запустите javac -versionкоманду в том же окне и убедитесь, что JDK 8 Java-компилятор также запущен и работает

Теперь ADT-22.6.2 необходимо скачать по следующей ссылке:

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

  • Загрузите ADT и разархивируйте его содержимое в папку, например D:\adt
  • Определите новую переменную среды, вызываемую ANDROID_HOMEсо значением пути к папке установки ADT, напримерD:\adt\sdk
  • Добавьте ваши Andoid SDK Platform Toolsи Andoid SDK Toolsпапки, например, D:\adt\sdk\toolsи D:\adt\sdk\platform-tools, к вашей %PATH%переменной
  • Создайте ярлык для Eclipse IDE, если хотите. Он находится в папке установки ADT, например,D:\adt\eclipse
  • Запустите Eclipse IDE и создайте рабочую область, например D:\adt\workspace
  • Нажмите на Android SDK Managerкнопку, которая находится на панели инструментов
  • Выберите Android SDK Build tools Rev. 19.1и Android Support Libraryтолько. Отмените выбор всего остального и установите эти два пакета.

Если все пойдет хорошо, ADT будет запущен.

Также рекомендуется установка следующих инструментов:

  • Поддержка Eclipse Kepler Java 8: она позволяет Eclipse распознавать новые расширения синтаксиса Java 8 и избавляет от назойливости red dotsв редакторе кода Java. Это может быть установлено через Help -> Install New SoftwareEclipse. Введите http://download.eclipse.org/eclipse/updates/4.3-P-builds/ в Work withполе и продолжайте его установку.

  • Nodeclipse / Enide Gradle: в основном используется для выделения ключевых слов на языке Groovy. Groovy используется как DSL для скриптов сборки Gradle. Этот плагин можно установить через Eclipse Marketplace. Однако Eclipse в ADT-22.6.2 не входит в комплект Eclipse Marketplace Client. Поэтому сначала вам нужно установить Eclipse Marketplace Clientс помощью Install New Softwareинструмента в Eclipse. Введите http //: download.eclipse.org/mpc/kepler/ в Work withполе и продолжайте его установку. После установки Eclipse Marketplace Client, вы можете искать Nodeclipse/Enide Gradleв Eclipse Marketplace Clientи установить его.

  • Виртуальное устройство Genymotion: отличная замена стандартному, Android Virtual Deviceкоторый поставляется вместе с ADT. AVD раздражающе громоздок и продолжает падать без всякой причины. Genymotion заставляет вас готовить Android VD, используя CyanogenModизображения, которые выполняются Oracle VirtualBox . Его однопользовательская лицензия бесплатна, и ее можно скачать с http://www.genymotion.com . Требуется только логин, и он также может быть интегрирован в Eclipse. Подробности можно найти под:

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

Ниже приведен скриншот виртуального устройства CyanogenMod на базе Android 4.3,

введите описание изображения здесь

Его можно рассматривать как полноценное устройство Android, работающее на персональном компьютере на базе x86 или x64. Чтобы использовать сервисы Google, как Google PlayStoreна этом виртуальном устройстве, gappsизображение устройства, которое он использует, должно быть перенесено на устройство. Подходящее gappsизображение для устройства можно загрузить с веб-сайта CyanogenMod:

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

Установка Gradle является необязательной, поскольку она также предоставляется самим Android SDK, но настоятельно рекомендуется ее отдельная установка. Установка может быть выполнена, выполнив следующие действия:

  • Перейти на веб-сайт Gradle: http://www.gradle.org/

  • щелчок Downloads

  • Согласно Previous Releasesвыбрать версию 1.10 и скачать либо gradle-1.10-all.zip или gradle-1.10-bin.zip
  • Распакуйте его содержимое в папку, например D:\adt\gradle
  • Определите новую переменную среды, вызываемую GRADLE_HOMEсо значением пути к папке установки Gradle, напримерD:\adt\gradle
  • Добавьте вашу папку Gradle, например D:\adt\gradle\bin, в вашу %PATH%переменную
  • Откройте окно терминала и выполните gradle -vкоманду и убедитесь, что оно работает и работает. Если вы успешно подошли к этому моменту, это означает, что вы готовы создать свое первое приложение для Android с использованием функций Java 8.

Демо-приложение

Будет создано простое приложение для демонстрации использования инструментов, которые были описаны в предыдущем разделе. Вы можете просто следовать приведенным ниже инструкциям, чтобы получить представление об использовании лямбда-выражений в Инструментах разработчика Android:

  • Запустите Eclipse IDE и создайте новое приложение для Android, выбрав File -> New -> Other -> Android -> Android Application Project
  • Заполните форму, как показано ниже:

введите описание изображения здесь

  • Просто нажмите Nextкнопку на следующих формах и нажмите Finishкнопку на последней. Подождите, пока ADT не завершит загрузку проекта
  • Щелкните правой кнопкой мыши по проекту, выберите New -> Folderи назовите егоbuilders
  • Щелкните правой кнопкой мыши gen (Generated Java Files)папку и удалите ее. Gradle скоро сгенерирует те же файлы для нас, и мы добавим их в s build path. Theпапку проекта gen, созданную стандартным компоновщиком Ant по умолчанию, и артефакты в этой папке будут устаревшими.
  • Создайте в buildersпапке следующие командные файлы :

    • gradle_build.cmd
    • gradle_post_build.cmd
    • gradle_clean.cmd
  • Заполните эти командные файлы следующим образом:

gradle_build.cmd:

введите описание изображения здесь

gradle_post_build.cmd:

введите описание изображения здесь

gradle_clean.cmd:

введите описание изображения здесь

  • Отменить выбор Project -> Build Automaticallyпункта меню
  • Щелкните правой кнопкой мыши по проекту и выберите Properties -> Buildersи отмените выбор всех сборщиков по умолчанию, предоставляемых ADT.
  • Нажмите Newкнопку в том же окне, выберите Programи нажмитеOK
  • Откроется окно конфигурации нового сборщика. Заполните его вкладки следующим образом:

Main Вкладка новой конфигурации Builder

введите описание изображения здесь

Refresh Вкладка новой конфигурации Builder

введите описание изображения здесь

Environment Вкладка новой конфигурации Builder

введите описание изображения здесь

Build Options Вкладка новой конфигурации Builder

введите описание изображения здесь

  • Создайте второй сборщик с именем, Gradle_Post_Buildкоторый использует в gradle_post_build.cmdкачестве своей программы. Все остальные настройки этого компоновщика должны точно совпадать с ранее созданным компоновщиком. Этот сборщик будет отвечать за копирование артефактов, созданных процессом сборки, в binпапку.
  • Создайте третий сборщик с именем, Gradle_Cleanerкоторый использует в gradle_clean.cmdкачестве своей программы. Только Run the builderнастройка на последней вкладке должна быть установлена ​​как During a Clean. Все остальные настройки этого компоновщика должны быть точно такими же, как и у первого компоновщика. Этот строитель будет отвечать за очистку артефактов, созданных в процессе сборки, как следует из названия.

Новые строители HelloLambdaпроекта

введите описание изображения здесь

  • Щелкните правой кнопкой мыши по проекту и выберите Export
  • Выберите Android -> Generate Gradle Build Filesи нажмитеNext
  • Выберите проект в следующем окне и нажмите Finish
  • Перейдите в корневую папку вашего проекта и удалите файлы gradlewи gradlew.bat. Также удалите gradleпапку
  • Вернитесь к Eclipse и выберите пункт Project -> Cleanменю. Заполните форму, которая отображается следующим образом:

Clean Project Окно

введите описание изображения здесь

  • Нажмите OKи дождитесь завершения процесса очистки
  • Добавьте приведенный ниже фрагмент кода Java сразу после вызова setContentViewфункции в вашем MainActivityклассе:

введите описание изображения здесь

  • Измените начало build.gradleфайла до sourceCompatibilityраздела следующим образом:

введите описание изображения здесь

  • Щелкните правой кнопкой мыши по проекту, выберите Properties -> Java Compilerопцию и установите все уровни соответствия Java 8. Это позволит Eclipse распознавать новые конструкции Java 8, такие как лямбда-выражения.
  • Нажмите Noв окне уведомлений
  • Щелкните правой кнопкой мыши по проекту и выберите Build project. Затмение начнет строить проект.

Процесс сборки введите описание изображения здесь

  • Щелкните правой кнопкой мыши по проекту и перейдите к Properties -> Java Build Path. Добавьте следующие папки в путь сборки (также показано на рисунке ниже):

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

введите описание изображения здесь

Eclipse теперь сможет распознавать R.javaи buildConfig.javaфайлы, и не будет отображать какие-либо red dotsошибки, связанные с файлами ресурсов проекта.

  • Создайте новую Run Configurationдля целевой платформы Android, щелкнув правой кнопкой мыши по проекту и выбрав Run As -> Run Configurations. Например, это демонстрационное приложение выглядит как показано ниже на Genymotion VD:

Приложение HelloLambda

введите описание изображения здесь

В LogCatокне вы можете заметить, что фрагмент кода с простым лямбда-выражением работает правильно

введите описание изображения здесь

Источник: Использование лямбда-выражений Java 8 в инструментах разработчика Android

Суфиян Гори
источник
Но сможете ли вы отладить этот код с помощью отладчика Android? Я думаю, что стеки / номера строк не совместимы. Похоже, главный недостаток разработки с Java 8 на Android.
Зомби
2
@ Зомби Да, вы все еще можете отладить его. Все работает просто отлично.
Корнильцев Анатолий
42

Перейдите по этой ссылке для новых обновлений. Используйте возможности языка Java 8

Старый ответ

Начиная с версии предварительного просмотра Android N Android поддерживает ограниченные возможности Java 8, см. Языковые функции Java 8

Чтобы начать использовать эти функции, вам необходимо загрузить и настроить Android Studio 2.1 и Android N Preview SDK, который включает в себя необходимый набор инструментов Jack и обновленный плагин Android для Gradle. Если вы еще не установили Android N Preview SDK, см. Раздел «Настройка для разработки для Android N» .

Поддерживаемые языковые функции и API Java 8

Android в настоящее время не поддерживает все функции языка Java 8. Однако при разработке приложений для Android N Preview теперь доступны следующие функции:

Стандартные и статические методы интерфейса

Лямбда-выражения (также доступны на уровне API 23 и ниже)

Повторяемые аннотации

Ссылки на метод (также доступны на уровне API 23 и ниже)

Есть некоторые дополнительные функции Java 8, которые поддерживает Android, вы можете увидеть полную информацию из Java 8 Language Features

Обновить

Примечание: Android N основывает свою реализацию лямбда-выражений на анонимных классах. Такой подход позволяет им быть обратно совместимыми и исполняемыми на более ранних версиях Android. Чтобы проверить лямбда-выражения в более ранних версиях, не забудьте перейти к файлу build.gradle и установить для compileSdkVersion и targetSdkVersion значение 23 или ниже.

Обновление 2

Теперь стабильная версия Android Studio 3.0 поддерживает библиотеки Java 8 и функции языка Java 8 (без компилятора Jack).


источник
Я чего-то не поняла. Есть ли какие-либо требования к minSdkVersion?
WindRider
Я думаю, что только лямбда-выражения обратно совместимы, другие функции Java 8 будут работать только на N (или будущей версии). Я не проверял это, но это то, что я понимаю из документов Android. Итак, для функций Java 8 minSdkVersion равно N, кроме лямбда-выражения
Итак ... еще несколько лет, пока N не станет лидером в приборной панели. :(
WindRider
К сожалению, да. или пока Android каким-то образом не обеспечит обратную совместимость, как лямбда
1
@WindRider, вы можете использовать minSdkVersion 15 и выше. В настоящее время я использую minSdkVersion 17 в своем проекте Android с Lambdas, и все работает.
YYamil
22

Да, Android теперь поддерживает Java 8 (24.1.17)

Теперь это возможно

Но вам нужно будет запустить ваше устройство на Java 1.8 и включить «jackOptions» для его запуска. Джек - это имя нового компилятора Android, работающего под управлением Java 8.

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

добавить эти строки в build_gradle

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

Похоже, что Java 8 работает под управлением Java в Android Studio 2.0, но он все еще не принимает синтаксис java 8 после того, как я проверил, и вы не можете сейчас выбрать компилятор из Android Studio. Однако вы можете использовать плагин Scala, если вам нужен механизм функционального программирования в вашем Android-клиенте.

введите описание изображения здесь

SiVi
источник
1
Scala будет очень тяжело упаковывать с помощью apk
TechSpellBound
Пожалуйста, обратитесь к этому решению для обновленной Android Studio 2.0, поскольку они сделали обновления для ограниченных параметров конфигурации.
Гаурав Шарма
19

Android использует Java, который разветвляется от Java 6.

На Android SDK версии 19, вы можете использовать Java 7 функций , делая это . Нет полной поддержки Java 8 (пока).

chaqke
источник
1
Вы спасатель. Знаете ли вы, есть ли что-то, что могло бы реализовать try-with-resources аналогичным образом?
Галец
@galets пока нет, но я бы поспорил, что Google добавит его в будущем. Дополнительная информация, см: stackoverflow.com/questions/16921337/...
chaqke
16

Родная Java 8 прибывает на Android! В заключение!

удалите плагин Retrolambda и блок retrolambda из файла build.gradle каждого модуля:

Чтобы отключить Jack и переключиться на набор инструментов по умолчанию, просто удалите блок jackOptions из файла build.gradle вашего модуля.

Чтобы начать использовать поддерживаемые функции языка Java 8, обновите плагин Android до версии 3.0.0 (или выше).

Начиная с Android Studio 3.0, функции языка Java 8 теперь поддерживаются Android:

  • Лямбда-выражения
  • Ссылки на метод
  • Тип аннотации (в настоящее время информация аннотации типа не доступна во время выполнения, но только во время компиляции);
  • Повторяющиеся аннотации
  • Стандартные и статические методы интерфейса (на уровне API 24 или выше, без поддержки мгновенного запуска);

Также с минимального уровня API 24 доступны следующие API Java 8:

  • java.util.stream
  • java.util.function
  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • java.lang.reflect.AnnotatedElement.getAnnotationsByType (класс)
  • java.lang.reflect.Method.isDefault ()

Добавьте эти строки в build.gradle вашего прикладного модуля, чтобы проинформировать проект об уровне языка:

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

Отключите поддержку функций языка Java 8, добавив в файл gradle.properties следующее :

android.enableDesugar=false

Вы сделали! Теперь вы можете использовать нативный java8!

Давал Дживани
источник
14

Android ОФИЦИАЛЬНО поддерживает Java 8 начиная с Android N.

Объявления о возможностях здесь , объявление о языке Java 8:

Улучшенная поддержка языка Java 8 - Мы рады представить функции языка Java 8 для Android. С помощью компилятора Android для Android теперь вы можете использовать многие популярные функции языка Java 8, включая лямбды и многое другое, в версиях Android, начиная с Gingerbread. Новые функции помогают уменьшить стандартный код. Например, лямбды могут заменять анонимные внутренние классы при предоставлении прослушивателей событий. Некоторые функции языка Java 8 - такие как стандартные и статические методы, потоки и функциональные интерфейсы - теперь также доступны для версий N и выше. С Джеком мы с нетерпением ждем возможности более внимательно отслеживать язык Java, сохраняя обратную совместимость.

сойка
источник
На данный момент он все еще довольно глючный, например, Instant Run не работает с лямбда-выражениями: если вы измените какой-то код внутри вашей лямбда-функции, он не примет это изменение.
Адриенденат
12

Мы можем использовать Java 8, используя:

  1. В build.gradle (Project: myProject) добавьте следующее

    classpath 'me.tatarka:gradle-retrolambda:x.x.x' //x.x.x is recent version
  2. В build.gradle (Модуль: myModule) добавьте следующее

    apply plugin: 'me.tatarka.retrolambda'
    
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
Вишал Радж
источник
1
Чем отличается первый ответ от рекомендуемой ретро лямбды?
Maarten Bodewes
2
@MaartenBodewes Кажется, это указывало на то, что это стало намного проще, чем принятый ответ. См medium.com/android-news/...
TechSpellBound
Не используйте это. Плагин
глючит
11

ОБНОВЛЕНИЕ 2020/01/17

Android Studio 4.0 включает в себя поддержку использования ряда API-интерфейсов языка Java 8 с использованием метода, называемого desugaring, без минимального уровня API для вашего приложения:
https://developer.android.com/studio/preview/features#j8-desugar.

В этом выпуске поддерживается следующий набор API:

  • Последовательные потоки ( java.util.stream)
  • Подмножество java.time
  • java.util.function
  • Недавние добавления в java.util.{Map,Collection,Comparator}
  • Необязательные ( java.util.Optional, java.util.OptionalIntи java.util.OptionalDouble) и некоторые другие новые классы, полезные с вышеупомянутыми API
  • Некоторые дополнения к java.util.concurrent.atomic(новые методы на AtomicInteger, AtomicLongи AtomicReference)
  • ConcurrentHashMap (с исправлениями ошибок для Android 5.0)

Чтобы поддерживать эти языковые API, D8 компилирует отдельный библиотечный DEX-файл, который содержит реализацию отсутствующих API и включает его в ваше приложение. Процесс отладки переписывает код вашего приложения, чтобы вместо этого использовать эту библиотеку во время выполнения.

Чтобы включить поддержку этих языковых API, включите в build.gradleфайл вашего модуля следующее :

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

ОРИГИНАЛЬНАЯ ПОЧТА ОТ 2017

В Android Studio 3.0 появилась встроенная поддержка некоторых функций языка Java 8, а именно:

  • Лямбда-выражения
  • Ссылки на метод
  • Тип аннотации (информация доступна во время компиляции, но не во время выполнения)
  • Повторяющиеся аннотации
  • Стандартные и статические методы интерфейса

Также начиная с уровня API 24 доступны следующие 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()

Кроме того, try-with-resourcesподдержка была распространена на все уровни Android API.

В будущем будет добавлено больше возможностей Java 8.

Чтобы начать использовать поддерживаемые функции языка Java 8, обновите плагин Android до версии 3.0.0-alpha1 (или выше) и добавьте следующее в файл build.gradle вашего модуля:

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

Для получения более подробной информации посетите:
https://developer.android.com/studio/write/java8-support.html

Idolon
источник
Чего я не понимаю, так это то, что андроид студия имеет отношение к поддержке java8 (у интеллигента не было раньше) ?! Означает ли это, что если я использую gradle на терминале для компиляции проекта, он не будет компилироваться ?!
cesarferreira
1
@cesarferreira Вам необходимо обновить плагин Android до последней версии (которая на данный момент 2.4.0-alpha6). Пожалуйста, проверьте блок цитаты в ответе.
Идолон
Добавление его в модуль (не приложение), в котором я работаю, было подвохом. Добавление в модуль приложения не помогло.
Surekha
6

Простой способ

Вы можете включить поддержку java 1.8 для проекта Android.

  • Открытая структура проекта

    • Либо нажав Ctrl + Shift + Alt + S

    • Или File > Project Structure

  • Обновите Совместимость источника и Целевую совместимость до 1.8 в диалоговом окне «Структура проекта», как показано (выберите «Файл»> «Структура проекта»).

образ

Или вы можете использовать Gradle

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

Синхронизировать проект. И это все!

Примечание: поддержка Java 1.8 может быть включена для Android Studio 3.0.0 или выше. Смотрите документацию для дальнейшего чтения.

Khemraj
источник
Это решение сработало для меня: stackoverflow.com/a/55467237/4698320
Даниш Шарма
5

Когда я задавал этот вопрос почти 2 года назад, на самом деле ответ был «официально» - нет, но, как указывает ответ ekcr1, вы можете заставить работать одну из самых ожидаемых функций (лямбда-выражения), если вы используете retrolamba. В то время я все еще использовал Eclipse, так как Android Studio находился в режиме «предварительного просмотра», поэтому я никогда не шел по этому пути.

Сегодня я думаю, что «официального» ответа все еще нет, и хотя ретроламба все еще кажется хорошим путем, есть еще один вариант для тех, кто хочет пойти по несколько «неофициальному» маршруту, а именно Котлин.

Сегодня Котлин достиг 1.0.0. Для тех, кто не знаком с Kotlin, более подробную информацию можно найти на их веб-сайте здесь:

https://kotlinlang.org

или посмотрите это видео с выступлением Джейка Уортона

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

NPN
источник
4

Последние новости:

Google объявляет, что с Android N и Android Studio 2.1+ платформа будет поддерживать Java 8. Также была выпущена стабильная версия студии 2.1.

Наконец мы можем использовать лямбда-выражения. Больше нет фильтра по списку для цикла. Horeeey.

asozcan
источник
4

Добавьте этот конфиг build.gradle и синхронизируйте gradle:

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

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        // or
        //sourceCompatibility 1.8
        //targetCompatibility 1.8
    }
}
Ахмад Агазаде
источник
1
Это правильный способ добавить поддержку Java 8 для проектов Android. Недостатком является то, что мгновенный запуск в настоящее время не выполняется, когда включен разъем.
Ионут Негру
Не полная поддержка.
Ахмад Агазаде
2

Google только что объявил, что Java 8 будет изначально поддерживаться Android и что набор инструментов Jack будет устаревшим:

Мы решили добавить поддержку функций языка Java 8 непосредственно в текущий набор инструментов javac и dx, а также отказаться от набора инструментов Jack. С этим новым направлением существующие инструменты и плагины, зависящие от формата файла класса Java, должны продолжать работать. В дальнейшем функции языка Java 8 будут изначально поддерживаться системой сборки Android. Мы планируем запустить это как часть Android Studio в ближайшие недели, и мы хотели бы поделиться этим решением с вами раньше.

Дополнительная информация здесь: https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html

stamanuel
источник
2

Да. Мы скоро будем использовать Java 8!

Мы решили добавить поддержку функций языка Java 8 непосредственно в текущий набор инструментов javac и dx, а также отказаться от набора инструментов Jack. С этим новым направлением существующие инструменты и плагины, зависящие от формата файла класса Java, должны продолжать работать. В дальнейшем функции языка Java 8 будут изначально поддерживаться системой сборки Android. Мы планируем запустить это как часть Android Studio в ближайшие недели, и мы хотели бы поделиться этим решением с вами раньше.

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

Ajay S
источник
2

добавить эту строку в модуль lvl build gradel

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

yuvrajsinh
источник
1

Я написал аналогичный ответ на похожий вопрос о переполнении стека, но вот часть этого ответа.

Android Studio 2.1:

Новая версия Android Studio (2.1) имеет поддержку функций Java 8. Вот выдержка из поста на блоге разработчиков Android :

... Релиз Android Studio 2.1 включает поддержку нового компилятора Jack и поддержку Java 8 .

...

Чтобы использовать возможности языка Java 8 при разработке с N Developer Preview, вам необходимо использовать компилятор Jack. Мастер создания проекта [Файл → Создать → Проект] создает правильные конфигурации для проектов, ориентированных на N.


До Android Studio 2.1:

Android пока не поддерживает Java 1.8 (он поддерживает только до 1.7), поэтому вы не можете использовать функции Java 8, такие как лямбды.

Этот ответ дает более подробную информацию о совместимости Android Studio ; Здесь утверждается:

Если вы хотите использовать лямбды, одну из основных функций Java 8 в Android, вы можете использовать gradle-retrolamba

Если вы хотите узнать больше об использовании gradle-retrolambda, этот ответ дает много подробностей о том, как это сделать .

Фарбод Саламат-Заде
источник
Привет, Фарбод! Я использую AndroidStudio 2.2.2 Мой "SDK Location"(это на Mac FWIW) просто говорит, "/Users/me/Library/Android/sdk" я использую Java8 - как использовать Java8 ?? Спасибо!
Толстяк
1

Я решил опубликовать обновленный ответ для тех, кто ищет что-то более актуальное.

В настоящее время Android и Android Studio поддерживают подмножество функций Java 8. Согласно документации Android, размещенной на их сайте , Google говорит:

Поддержка функций языка Java 8 требует нового компилятора под названием Jack. Джек поддерживается только на Android Studio 2.1 и выше. Поэтому, если вы хотите использовать языковые функции Java 8, вам нужно использовать Android Studio 2.1 для сборки своего приложения.

Если у вас уже установлена ​​Android Studio, обязательно обновите ее до последней версии, нажав Справка> Проверить наличие обновлений (на Mac, Android Studio> Проверить наличие обновлений). Если на вашей рабочей станции еще не установлена ​​IDE, загрузите Android Studio здесь.

Поддерживаемые языковые функции и API Java 8

Android не поддерживает все функции языка Java 8. Однако при разработке приложений для Android 7.0 (уровень API 24) доступны следующие функции:

  • Стандартные и статические методы интерфейса. Лямбда-выражения (также доступны на уровне API 23 и ниже).
  • Повторяемые аннотации
  • Ссылки на метод (также доступны на уровне API 23 и ниже)
  • Тип аннотации (также доступны на уровне API 23 и ниже)

Кроме того, доступны следующие API языка Java 8:

Reflection и языковые API:

  • java.lang.FunctionalInterface
  • java.lang.annotation.Repeatable
  • API-интерфейсы java.lang.reflect.Method.isDefault () и Reflection, связанные с повторяемыми аннотациями, такими как AnnotatedElement.getAnnotationsByType (Class)

Сервисные API:

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

Чтобы использовать новые возможности языка Java 8, вам также необходимо использовать набор инструментов Jack . Этот новый набор инструментов Android компилирует источники языка Java в читаемый Android байт-код DEX, имеет собственный формат библиотеки .jack и предоставляет большинство функций набора инструментов как часть одного инструмента: переупаковка, сжатие, запутывание и мультидекс.

Вот сравнение двух наборов инструментов, используемых для создания файлов Android DEX:

Legacy javac toolchain:
    javac (.java  .class)  dx (.class  .dex)
    New Jack toolchain:
    Jack (.java  .jack  .dex)
BlackHatSamurai
источник
1

Я задал этот вопрос более 3 лет назад, и, очевидно, ответы изменились за эти годы. Как многие из выше уже ответили, на некоторое время назад ответ стал Да . Я никогда не обновлял принятый ответ, потому что это был правильный ответ в то время. (Я не уверен, что такое политика переполнения стека)

Я просто хотел добавить еще один ответ для тех, кто все еще ищет эту тему. По состоянию на 17.05.2017 Google также объявил, что Kotlin также является официальным языком для разработки под Android.

Я не нашел официального пресс-релиза, но я смотрел некоторые из видео Google I / O, где он был анонсирован. Вот ссылка на блог пост командой Котлин на объявления.

NPN
источник
1

Добавление следующего исправило проблему для меня (Android Studio 2.3.2):

build.gradle (проект)

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

build.gradle (Модуль: приложение)

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

Подмножество Java 8 теперь поддерживается в Android Studio. Просто сделайте настройки Source и Target Compatibility из окна ниже:

Файл -> Структура проекта

Окно настройки

Более подробная информация приведена в ссылке ниже.

https://developer.android.com/studio/write/java8-support.html

Fio
источник
1

ОБНОВЛЕНИЕ 2019/10/28

Android Studio 4.0 решает эту проблему .

Компилятор D8 исправляет бэкпорт нативных API-интерфейсов Java 8 в ваш APK во время компиляции, и ваше приложение будет использовать этот код вместо нативных API-интерфейсов во время выполнения. Процесс называется десугаринг .

styler1972
источник
0

Все вышеперечисленные решения не работают в 2019 году с последней версией Android Studio 3.4+ .

Я нашел идеальное и современное решение для переноса или обновления вашего Android Project на Java 8 .

Решение: Нажмите Файл -> Структура проекта -> Модули -> вкладка Свойства .

Измените Совместимость источника и Целевую Совместимость до 1.8 (Java 8)

введите описание изображения здесь

zackygaurav
источник
-1

Самый простой способ добавить поддержку Java 8

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

Просто добавьте его в свой файл build.gradle.

Бора Савкар
источник
дублированный ответ, низкое качество
JanPl