Связь между версией ОС, уровнем API и версией Java

Я знаю, что здесь много вопросов об уровне и версии Android API, но это другой вопрос, поэтому, пожалуйста, не помечайте его как дубликат.

Мне интересно, как Java версии 1.6, 1.7, 1.8 ... относится к этим двум. Источник моего замешательства заключается в том, что я пытаюсь использовать метод Pattern.compile с флагом Pattern.UNICODE_CHARACTER_CLASS, как показано ниже.

Pattern pattern = Pattern.compile("\\b" + keywordToCheck + "\\b", Pattern.UNICODE_CHARACTER_CLASS);

Из документов на Pattern.UNICODE_CHARACTER_CLASS он говорит, что он говорит Since: 1.7, что, как я предполагаю, означает, что он доступен в версии Java 1.7 и выше. Я пытаюсь использовать эту строку кода в проекте Android, но каждый раз, когда я запускаю ее на своем устройстве, я получаю:

java.lang.IllegalArgumentException: Unsupported flags: 256

Ниже приведены соответствующие части моего файла build.gradle.

defaultConfig {
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

Насколько я понимаю, это означает, что мое приложение будет использовать любой уровень API 19 и выше, что означает, что оно может работать на Android 4.4 (KitKat) или выше. Устройство, на котором я запускаю приложение, имеет Android 6.0. Как в это вписывается версия Java? Я использую Android Studio 3.0, в котором говорится, что я использую:

Android Studio 3.0
Build #AI-171.4408382, built on October 20, 2017
JRE: 1.8.0_152-release-915-b08 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Mac OS X 10.12.6

Может ли кто-нибудь объяснить мне, почему я получаю эту ошибку, а также взаимосвязь между уровнем API Android, версией и версией Java? Спасибо


person strikerdude10    schedule 10.11.2017    source источник


Ответы (2)


В случае вашего данного примера этот флаг не был добавлен до API 24. Во многих случаях, даже если поддержка данного языкового уровня (например, 7) была добавлена ​​ранее, не означает, что все добавляется мгновенно. Некоторые вещи ждут по какой-то причине, по которой Google ждёт.

Не могу сказать почему, потому что не знаю.

И, как упомянул Гейб, версии Java не обязательно совместимы с Android.

Таким образом, из-за вашего кода, в котором вы используете флаг в API 19 и выше, вы получите сбой в версиях между 19 и 23 и равными им, потому что флаг еще не добавлен.

Также стоит отметить, что совместимость версий не ограничивает версии Java версиями Android. Теперь вы можете, например, запустить Java 8 на любой версии Android, какой захотите. Это совместимость.

Тем не мение. Если вы читаете Языковые функции Android Java 8, там написано (выделено мной) :

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

В качестве примера я использую Java 8, но это применимо практически ко всем версиям Android и java.

По сути:

  • Флаг, который вы используете, не был добавлен до API 24. AFAIK, использование не было добавлено, хотя жестко запрограммированная переменная присутствует.
  • Android не обязательно имеет все API Java, и они различаются в зависимости от версии Android.
  • Версии Java не ограничены API, но доступные функции различаются. Это означает, что вы можете запустить Java 8 на API (случайное число) 12, если хотите.

Между ними нет фиксированной связи (Android [x] = Java [x]). Различные поля / методы / классы могут быть добавлены со временем, мгновенно (после выпуска поддержки для данной версии java) или вообще не добавлены.


Обычная Java и версия Java, используемые в Android, - две очень разные версии, потому что Android основан на платформе, а Java - на основе версии. Вы не можете сравнивать версии между ними, и обе они имеют отдельную документацию.

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

person Zoe    schedule 10.11.2017
comment
Большое спасибо! Одна вещь, которая меня смущает, - это разница между API Oracle и Android. Реализуют ли каждый Oracle и Google этот класс Pattern по отдельности? Я знаю, что у Oracle есть свой JDK 8, делает ли Google свой собственный JDK для Android / Android Studios? Как у одного могла быть поддержка, а у другого нет? - person strikerdude10; 11.11.2017
comment
Язык - Java, но в качестве JDK используется Android SDK. Для сравнения JDK = SDK. Вам по-прежнему нужен комплект разработчика, чтобы получить функции базового языка и некоторые подобные вещи, но интерфейс, который вы в конечном итоге будете использовать, будет через SDK. Oracle - это Java, они сделали класс. Android реализует это в SDK позже для новых версий Android, хотя некоторые чисто языковые вещи (например, лямбда), основанные на компиляторе, будут поддерживать более ранние версии. Поля не будут - person Zoe; 11.11.2017

Когда он говорит, что доступен с версии 1.7, обратите внимание, какие документы вы смотрите - Oracle (официальные документы Java). Так что всегда будет Java-версия. В документации Android всегда будет указана версия Android SDK, доступная с.

Обратите внимание, что Android не всегда на 100% совместим с официальными версиями Java. Это пытается быть, но очевидно, что больших кусков библиотеки просто нет. В случае сомнений смотрите документацию класса Android, а не Oracle.

Что касается версий Java, они в основном не зависят от версий Android. Java 8 только что официально стала полностью поддерживаемой AS3. До этого это считалось экспериментальным. Вы все еще можете использовать Java 7, если хотите. Для Java 8 большинство языковых функций доступно на всех платформах, но для одной или двух требуется минимальная версия SDK 24. Мне известны два похожих на них - это потоки Java и типы аннотаций / повторяющиеся аннотации.

Что касается вашей конкретной проблемы, обратите внимание, что в документации Android говорится о флаге: «Этот флаг не влияет на Android, классы символов Юникода используются всегда». Так что вы можете просто удалить его.

person Gabe Sechan    schedule 10.11.2017
comment
Большое спасибо! Похоже, что этот конкретный флаг не поддерживается до уровня API 24. Не могли бы вы объяснить разницу между Oracle Java и Android Java? Реализует ли Google этот класс Pattern отдельно от Oracle? Или JRE у них разные? Какая разница между двумя? - person strikerdude10; 11.11.2017
comment
Java - это язык. Oracle купила компанию, которая его создала (Sun) и имеет эталонную реализацию. Android использует отдельную реализацию Java - синтаксис такой же, но он не поддерживает все библиотеки (и добавляет многие свои собственные). Точно так же, как у разных компаний есть своя версия C ++ или Javascript. Реализация Google на 100% собственная. Фактически Google использует другой язык байт-кода - dalvik. - person Gabe Sechan; 11.11.2017
comment
А, хорошо, понял. Синтаксис языка тот же (что делает его Java), но все после этого: компилятор, JVM, библиотеки специфичны для Google / Oracle? - person strikerdude10; 11.11.2017
comment
@Reg - это название языка. Язык - это его синтаксис. Тот факт, что or имел (и потерпел неудачу) цель написать один запуск где угодно, не означает, что это не java. Это все равно, что сказать, что проигравшие в Суперкубке не футболисты, потому что они не забили свою цель. Или что я не говорю по-английски, потому что я не поэтичен. Кроме того, поскольку я никогда не видел, чтобы это действительно работало, вы утверждаете, что такой вещи, как java, не существует. - person Gabe Sechan; 08.03.2018
comment
@GabeSechan Я согласен с вами; мой комментарий вводил в заблуждение. Я скорее описывал мнение, которое видел, чем констатировал факты. Я уверен, что пытался придать какой-то смысл сравнению фреймворка Java и фреймворка Android, но я замутил воду, а не сделал ее более ясной. - person Ger; 09.03.2018