В чем разница между минимальной версией SDK / целевой версией SDK и версией компиляции SDK?

214

В чем различия между "min sdk version / target sdk version" и "compile sdk version"? Я знаю, что означает min и target sdk, но что означает версия sdk для компиляции?

В Eclipse у меня есть min / max и целевой SDK, но в Android Studio есть эти три настройки.

Тобиас
источник
В настоящее время я работаю над приложением, в котором я использовал targetdkversion как 12, и все мои макеты работают очень ненормально, затем я изменяю его обратно на 23, и это работает как шарм, поэтому я считаю, что версия targetdk всегда должна быть такой же, как и скомпилированная версия
Shahid Sarwar

Ответы:

232

Версия min sdk - это самая ранняя версия Android SDK, на которой может работать ваше приложение. Обычно это происходит из-за проблемы с более ранними API, отсутствия функциональности или из-за других поведенческих проблем.

Версия целевой SDK является версия ваша заявка была направлена работать на. В идеале это из-за каких-то оптимальных условий работы. Если бы вы должны были «сделать ваше приложение для версии 19», это то, где это будет указано. Он может работать на более ранних или более поздних выпусках, но это то, к чему вы стремились. Это в основном указывает на то, насколько актуально ваше приложение для использования на рынке и т. Д.

Версия компиляции SDK является версией андроида ваш IDE (или другие средства компиляции я предполагаю) использует , чтобы сделать ваше приложение , когда вы публикуете .apkфайл. Это полезно для тестирования вашего приложения, так как это общая необходимость для компиляции вашего приложения по мере его разработки. Так как это будет версия для компиляции в APK, это, естественно, будет версия вашего выпуска. Также желательно, чтобы это соответствовало вашей целевой версии SDK.

Matt
источник
Моя версия SDK для компиляции и целевая версия SDK совпадают. То есть 21. Мое приложение падает, когда я запускаю его на устройствах с более низким уровнем API. Я новичок в Android, как мне теперь действовать?
prgmrDev
2
@prgmrDev Если ваше приложение дает сбой в версиях ниже 21, вам, вероятно, следует установить минимальную версию SDK равной 21. На самом деле это не приведет к исправлению вашего приложения в целях ниже 21, а просто заметит, что ваше приложение не поддерживается в более низких версиях. У вас также есть возможность определить, что именно нарушает работу вашего приложения (что изменилось в версии 21), и добавить поддержку, чтобы позаботиться об этой зависимости, но я подозреваю, что это будет большая работа, и это не входит в сферу возможностей новичка Android проект.
Мэтт
1
Что произойдет, если я установлю свой minSdkVersion = 14; targetSdkVersion = 23; и скомпилировать SDK до 19?
thadeuszlay
5
@thadeuszlay ваш вопрос не имеет значения, потому что вы должны немного подумать, что если вы хотите запустить версию 23, то как можно скомпилировать ее с 19! Пожалуйста, следуйте формуле minSdkVersion <= targetSdkVersion <= compileSdkVersion
Asad
@ Matt Может ли случиться так, что при использовании compileVersion 26, например, я случайно использую функцию или java API, который не поддерживается в версии 21, то есть min sdk? извините, я не
вижу
83

Формула

minSdkVersion <= targetSdkVersion <= compileSdkVersion

minSdkVersion - это маркер, который определяет минимальную версию Android, на которую приложение сможет установить. Также он используется Lint для предотвращения вызова API, который не существует. Также это влияет на время сборки. Таким образом, вы можете использовать варианты сборки, чтобы переопределить minSdkVersion до максимума во время разработки. Это поможет сделать сборку быстрее, используя все улучшения, которые предоставляет нам команда Android. Например, некоторые функции Java 8 доступны только из определенной версии minSdkVersion.

targetSdkVersion - говорит системе Android, чтобы включить определенные изменения поведения.

Например:

  • Начиная с Android 6.0 (уровень API 23) Runtime Permissionsбыли введены. Если вы установили targetSdkVersion22 или ниже, ваше приложение не запрашивает у пользователя разрешения во время выполнения.

  • Начиная с Android 8.0 (уровень API 26), все notificationsдолжны быть назначены каналу, иначе он не появится. На устройствах под управлением Android 7.1 (уровень API 25) и ниже пользователи могут управлять уведомлениями только для каждого приложения (фактически каждое приложение имеет только один канал на Android 7.1 и ниже).

  • Начиная с Android 9 (уровень API 28) Web-based data directories separated by process. Если targetSdkVersion28+ и вы создаете несколько WebViewв разных процессах, вы получитеjava.lang.RuntimeException

compileSdkVersion - фактически это версия платформы SDK и сообщает Gradle, какой Android SDK использует для компиляции. Если вы хотите использовать новые функции или отлаживать .javaфайлы из Android SDK, вам следует позаботиться о compileSdkVersion. Еще один пример - использование AndroidX, которое вынуждает использовать compileSdkVersion- уровень 28. compileSdkVersion не включен в ваш APK : он используется исключительно на compile time. Изменение вашего compileSdkVersion не меняет поведение во время выполнения. Он может генерировать, например, новые предупреждения / ошибки компилятора. Поэтому настоятельно рекомендуется всегда компилировать с последним SDK. Вы получите все преимущества новых проверок компиляции в существующем коде, избежите новых устаревших API и будете готовы использовать новые API. Еще один фактcompileSdkVersion >= Support Library version

Вы можете прочитать больше об этом здесь . Также я бы порекомендовал вам взглянуть на пример перехода на Android 8.0.

yoAlex5
источник
9
Лучший ответ здесь, потому что он фактически объясняет практическую разницу между targetSdkVersion и compileSdkVersion
Дин Уайлд
@ yoAlex5 Спасибо за ваш ответ. Я вижу много случаев, когда targetSdkVersion и compileSdkVersion совпадают. Почему андроид, сделанный как два отдельных, не может быть достаточным для обработки, или есть какая-то конкретная причина, по которой нужно сделать два отдельных поля?
Манджу
@Manju, вы можете найти больше в SO thread stackoverflow.com/questions/26694108/…
yoAlex5
@ yoAlex5 что ты имеешь в виду под «системой Android для включения определенных изменений поведения», не могли бы вы объяснить
k_kumar
@atishr «конкретные изменения поведения» перечислены в блоке «Например»
yoAlex5
74

Версия min sdk - это минимальная версия операционной системы Android, необходимая для запуска вашего приложения.

Версия целевого SDK является версией Android , что ваше приложение было создано , чтобы работать дальше.

Версия компиляции SDK является версией Android , что инструменты для сборки использует для компиляции и сборка приложения, чтобы освободить, выполнение или отладку.

Обычно версия SDK для компиляции и целевая версия SDK совпадают.

anuraagy
источник
23
А когда они не одинаковые плюсы / минусы?
powder366
4

compileSdkVersion : compileSdkVersion - это версия API, для которой компилируется приложение. Это означает, что вы можете использовать функции Android API, включенные в эту версию API (очевидно, как и все предыдущие версии). Если вы попробуете использовать функции API 16, но установите для compileSdkVersion значение 15, вы получите ошибку компиляции. Если вы установите compileSdkVersion в 16, вы все равно сможете запустить приложение на устройстве API 15.

minSdkVersion : версия min sdk - это минимальная версия операционной системы Android, необходимая для запуска вашего приложения.

targetSdkVersion : целевая версия sdk - это версия, на которую нацелено ваше приложение.

Винай Джон
источник