Как sourceCompatibility и targetCompatibility влияют на количество поддерживаемых устройств? - PullRequest
0 голосов
/ 25 сентября 2018

Что я знаю

Я хорошо знаком с общими настройками, найденными в build.gradle

minSdkVersion 21 - означает, что устройство Android должно по крайней мере иметь уровень API Android 21или больше для установки моего приложения

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

targetSdkVersion 26 - означает, что моеприложение было «разработано» для этой версии API Android, чтобы устройство знало, следует ли запускать его в режиме совместимости и т. д.

(это должно быть как можно выше, чтобы разработчики могли обновляться вместе с ним).с любыми устаревшими вызовами API)

Что меня смущает

Но что насчет sourceCompatibility и targetCompatibility, которые указывают версию JDK для использования?Кажется, я получаю противоречивые сообщения.

Например, когда я просматриваю настройки структуры моего проекта в Android Studio, мне кажется, что я получаю рекомендации по использованию JDK по умолчанию, который поставляется с Android Studio - version 1.8.

enter image description here

Однако, когда я читаю другие источники в Интернете, такие как:

Похоже, я получаю сообщение о том, что Android в основном работает наversion 1.7 и поддерживает только небольшое подмножество version 1.8, что предполагает логический выбор version 1.7.

Резюме

Вопрос 1)

Какую версию следует использовать для максимальной совместимости с новыми и старыми устройствами Android?version 1.7 или version 1.8?(Имеет ли это значение? См. Вопрос № 2)

Вопрос 2)

Является ли sourceCompatibility и targetCompatibility (и версия JDK) чем-то, что толькоиспользуется во время компиляции из файлов .java в файлы .class?Таким образом, после генерации Java-байтового кода любая версия (version 1.7 vs version 1.8) больше не будет иметь значения - поскольку байт-код будет одинаковым и совместимым независимо.

Или это то, что будет сохраняться вплоть до конечного пользователя (например, если JVM их телефона Android не умеет читать version 1.8 байт-код, он просто взорвется)

Вопрос 3)

Что произойдет, если я установлю minSdkVersion на очень низкое значение (например, 10) при установке sourceCompatibility и targetCompatibility на очень высокое значение (например, version 1.8)?

Могу ли я слепо полагаться на Android Studio для обнаружения всех возможных несовместимостей?Например, если он успешно создаст APK, я гарантирую, что он будет работать?

Или он все еще будет собираться и позволит пользователям с API >= 10 установить его, но просто взорвется во время выполнения, если JVM устройства пользователя будет работатьне могу запустить version 1.8?

1 Ответ

0 голосов
/ 02 августа 2019

Набор инструментов Android выполняет некоторые дополнительные шаги перед запуском кода на вашем устройстве:

.java -> .class -> .class (desugared) -> .dex

Этоописано здесь: https://developer.android.com/studio/write/java8-support

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

Насколько обратно совместимый десагеринг делает ваш код, зависит от minSdkVersion.Если ваш проект создает комбинацию sourceCompatibility / targetCompatibility и minSdkVersion, что невозможно, компилятор сообщит вам.

Это также относится к байт-коду из сторонних библиотек.Ошибки выглядят так:

Error: Static interface methods are only supported starting with Android N (--min-api 24): okhttp3.Request

(эта конкретная проблема возникла из-за совместимости исходного кода 1.7 с okhttp3 4.0.1 и исчезла при использовании цели 1.8)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...