"Почему 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