The Android Developer Challenge is back! Submit your idea before December 2.

Возможности языка Java 8

В Android N появилась поддержка возможностей языка Java 8, которые можно использовать при разработке приложений для Android N. На данной странице приведены описания новых возможностей языка, поддерживаемых в Android N Preview, объяснено как настроить проект для их использования, а также указаны известные проблемы, с которыми можно столкнуться.

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

Примечание. Использование новых возможностей языка Java 8 не является обязательным требованием при разработке приложений для платформы Android N. Если вы не хотите писать код с использованием возможностей языка Java 8, можно указать Java 7 в качестве значения совместимости для проекта, однако все-равно необходимо будет выполнить компиляцию с JDK 8 для осуществления сборки на платформе Android N.

Поддерживаемые API-интерфейсы и возможности языка Java 8

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

Кроме того, доступны следующие API-интерфейсы для реализации возможностей языка Java 8.

  • API-интерфейсы отражения и языковых функций:
    • java.lang.FunctionalInterface;
    • java.lang.annotation.Repeatable;
    • java.lang.reflect.Method.isDefault();
    • а также API-интерфейсы отражения, связанные с повторяющимися примечаниями, например, AnnotatedElement.getAnnotationsByType(Class).
  • Вспомогательные API:
    • java.util.function.

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

Активация возможностей Java 8 и набора инструментов Jack

Для использования новых возможностей языка Java 8 необходимо также использовать новый набор инструментов Jack. С его помощью Android компилирует языковой источник Java в считываемый Android байткод Dalvik Executable (dex). В Jack предусмотрен собственный формат библиотеки .jack, большинство функциональных возможностей набора инструментов предоставляется в рамках одного инструмента: перекомпоновка, сжатие, обфускация и использование нескольких файлов DEX.

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

  • Старый набор инструментов javac:
    javac (.java --> .class) --> dx (.class --> .dex)
  • Новый набор инструментов Jack:
    Jack (.java --> .jack --> .dex)

Настройка Gradle

Чтобы использовать возможности языка Java 8 и набор инструментов Jack для проекта, добавьте в файл модуля build.gradle следующий код:

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

Известные проблемы

Функция Instant Run, появившаяся в Android Studio 2.0 (Beta), не работает с набором инструментов Jack и будет отключена при его использовании.

Поскольку набор инструментов Jack не создает промежуточные файлы классов при компиляции приложения, инструменты, которые используют такие файлы, пока с Jack не работают. Примеры таких инструментов приведены ниже.

  • Детекторы Lint, работающие c файлами классов.
  • Инструменты и библиотеки, которым требуются файлы классов приложения (например, JaCoCo и Mockito)

Если вы обнаружите другие проблемы во время использования набора инструментов Jack, сообщите о них.