"Почему Apache Harmony" или "Как использовать Java 8 на Android"

Большинство из нас уже слышали о крутых функциях Java 8, но Android их не поддержат. Это связано с тем, что Google использует Apache Harmony для Android. Это то, что удерживает нас (разработчиков приложений для Android) от улучшения нашего кода с помощью lambdas, реализации по умолчанию в интерфейсах, включения String и многое другое. Конечно, мы будем работать некоторое время, но что, если некоторые библиотеки, которые мы используем в наших приложениях, начнут использовать функции Java 8? Насколько я знаю, это не сработает (пожалуйста, поправьте меня, если не ошибаетесь). Это создает несовместимость между стандартными Java и Android-Java. Этого не может быть Google, или, по крайней мере, я не могу придумать, почему компания, разрабатывающая широко распространенную операционную систему, не будет постоянно оставаться со старой версией Java.

Вопросы:

  • Почему они используют Apache Harmony?
  • Почему они не могут использовать более новую версию java?
  • Если они не хотят использовать Oracle Java, почему они не могут использовать подмножество OpenJDK (здесь лицензирование noob)?
  • Вы знаете какие-либо планы по обновлению используемой версии Java?
  • Вы знаете какой-либо способ использования классов Java 8 в современных системах Android?

Ответ 1

Почему они используют Harmony Apache?

Потому что Sun отказалась предоставить Google лицензию на Sun (теперь Oracle) Java на условиях, которые были приемлемыми. Google и Sun договорились, но они оказались в стороне от сделки.

Nitpick: на самом деле, библиотеки Android не являются Apache Harmony. Они начались как основанные на Гармонии, но два кодовых раздела расходились. Кроме того, проект Apache Harmony официально был "выбыл" в ноябре 2011 года.

Почему они не могут использовать более новую версию java?

Во-первых, Android не запускает Java (tm). Он работает на языке, который идентичен Java с библиотекой классов, функционально эквивалентной подмножеству библиотеки классов Java (+ Android-специфических библиотек) на виртуальной машине с другим набором инструкций.

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

UPDATE. Начиная с Android 19 (KitKat) и Eclipse ADT 22.6, Android теперь поддерживает языковые расширения Java 7; см. http://tools.android.com/recent/eclipseadt226preview

Если они не хотят Oracle Java, почему они не могут использовать подмножество OpenJDK?

Я не думаю, что переход на OpenJDK изменит что-нибудь. Oracle Java и OpenJDK составляют 99,9%.

В любом случае, могут возникнуть вопросы лицензирования и связанные с этим правовые вопросы. (И чтобы почувствовать это, прочитайте в судебном процессе Oracle против Google..., который понравится.)

Скорее всего, Google не видит достаточной коммерческой ценности для противодействия (массивным) усилиям, которые потребовались бы для его изменения, и сбоя, которое это вызовет экосистеме Android..., которая уже страдает от проблем с фрагментацией.

Знаете ли вы о каких-либо планах по обновлению используемой версии Java?

Нет, я этого не делаю. Это не значит, что планов нет, но если они есть, они не являются публичными.

Знаете ли вы, что можно использовать классы Java 8 для текущих систем Android?

Вы можете их перенести. Или, по крайней мере, вы можете попытаться их перенести. (Некоторые Java-API имеют интимные отношения с собственной кодовой частью JVM... и это может сделать проблему переноса более проблематичной.)

Ответ 2

Знаете ли вы, что можно использовать классы Java 8 для текущих систем Android?

Существует несколько библиотек, которые поддерживают компоненты Java 8 API (см. ниже раздел обновления для встроенной поддержки этих API в последних версиях Android):

  • ThreeTenABP backport of Java 8 API даты и времени, оптимизированный для Android
  • Поддержка потоков - это backport интерфейса Java 8 java.util.function (функциональные интерфейсы) и java.util.stream (потоки) для пользователей Java 6 или 7 дополнены выбранными дополнениями из java.util.concurrent, которые еще не существовали на Java 6.

И вы можете использовать retrolambda (наряду с gradle-retrolambda), чтобы использовать lambdas в разработке Android.

ОБНОВЛЕНИЕ

Однако, начиная с Android Studio 2.4 Preview 4 (в сочетании с Android-плагином 2.4.0-alpha4), есть встроенная поддержка некоторых функций языка Java 8:

  • Лямбда-выражения
  • Ссылки на методы
  • Повторяющиеся аннотации

Вышеупомянутые функции могут использоваться с любым уровнем API Android.

С уровня API 24 мы также можем использовать методы по умолчанию и статические интерфейсы, а также следующий API Java 8:

  • java.util.stream
  • java.util.function
  • java.lang.FunctionalInterface

Уровень API 26 (предварительный просмотр Android O) добавляет поддержку java.time API.

Ответ 3

Update.

Android планирует использовать OpenJDK. Возможно потому, что они думают так же, как вы, и хотят использовать функции Java 8. См. this