Большинство из нас уже слышали о крутых функциях Java 8, но Android их не поддержат. Это связано с тем, что Google использует Apache Harmony для Android. Это то, что удерживает нас (разработчиков приложений для Android) от улучшения нашего кода с помощью lambdas, реализации по умолчанию в интерфейсах, включения String и многое другое. Конечно, мы будем работать некоторое время, но что, если некоторые библиотеки, которые мы используем в наших приложениях, начнут использовать функции Java 8? Насколько я знаю, это не сработает (пожалуйста, поправьте меня, если не ошибаетесь). Это создает несовместимость между стандартными Java и Android-Java. Этого не может быть Google, или, по крайней мере, я не могу придумать, почему компания, разрабатывающая широко распространенную операционную систему, не будет постоянно оставаться со старой версией Java.
Вопросы:
Почему они используют 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... и это может сделать проблему переноса более проблематичной.)
I don't think that changes OpenJDK anything. Oracle Java and OpenJDK are 99.9% the same.
Здесь говорится, что Oracle JDK is based on the OpenJDK source code
. Почему это может вызвать проблемы, если они оба основаны на одном и том же коде (при условии, что конгруэнтность достаточно велика)?
Знаете ли вы, что можно использовать классы Java 8 для текущих систем Android?
Существует несколько библиотек, которые поддерживают компоненты Java 8 API (см. ниже раздел обновления для встроенной поддержки этих API в последних версиях Android):
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.
Update.
Android планирует использовать OpenJDK. Возможно потому, что они думают так же, как вы, и хотят использовать функции Java 8. См. this