В чем разница между compileSdkVersion и targetSdkVersion?

525

Я посмотрел документацию для сборки с Gradle, но я все еще не уверен, в чем разница между compileSdkVersionи targetSdkVersion.

Все это говорит:

compileSdkVersionСвойство определяет цель компиляции.

Ну, что такое "цель компиляции"?

Я вижу два возможных способа интерпретировать это:

  1. compileSdkVersionэто версия компилятора , используемого в создании приложения, в то время как targetSdkVersionэто «уровень API , который целевых приложений» . (Если бы это было так, я бы предположил, compileSdkVersionдолжно быть больше или равно targetSdkVersion?
  2. Они имеют в виду одно и то же. "цель компиляции" == "уровень API, на который нацелено приложение"
  3. Что-то другое?

Я вижу, что этот вопрос задавался ранее, но один ответ просто цитирует документ, что мне непонятно.

coder123
источник
2
targetSdkVersion - это то, что работает на вашем устройстве. Так что, если ваши устройства работают ниже, чем Oreo, тогда не
ставьте

Ответы:

546

compileSdkVersion

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

targetSdkVersion

Это не targetSdkVersionимеет никакого отношения к тому, как ваше приложение компилируется или какие API вы можете использовать. targetSdkVersionПредполагается указать , что вы протестировали приложение на (предположительно до и включая) версию , которую вы укажете. Это больше похоже на сертификацию или подпись, которую вы даете ОС Android в качестве подсказки о том, как она должна обращаться с вашим приложением с точки зрения функций ОС.

Например, в документации говорится:

Например, установка этого значения на «11» или выше позволяет системе применять новую тему по умолчанию (Holo) к вашему приложению при работе на Android 3.0 или выше ...

ОС Android во время выполнения может изменить стилизацию или иное исполнение вашего приложения в контексте ОС в зависимости от этого значения. Есть несколько других известных примеров, на которые влияет это значение, и этот список, вероятно, будет только увеличиваться со временем.

Для практических целей большинство приложений захотят установить targetSdkVersionпоследнюю версию API. Это гарантирует, что ваше приложение будет выглядеть как можно лучше на самых последних устройствах Android. Если вы не укажете targetSdkVersion, то по умолчанию используется minSdkVersion.

Джефф Миксон
источник
14
Нет, targetSdkVersionскорее всего, будет выше, чем compileSdkVersionи по праву. Это означает, что, хотя вы разработали приложение, например, для API 16, оно по-прежнему нормально работает на API 21 (Lollipop), и вам следует увеличить значение targetSdkVersionдо 21, чтобы указать, что для ОС Android нормально применять любые стили Lollipop, которые могут существовать в вашем приложении.
Джефф Миксон
24
По сути, я не понимаю, как вы можете настроить таргетинг на SDK выше, чем на тот, который вы скомпилировали.
coder123
55
Переход compileSdkVersionна более высокую версию будет означать, что вы хотите использовать некоторые новые API, которые включены только в этот конкретный выпуск. Если вы не планируете использовать какие-либо функции, специфичные для Lollipop, в своем приложении, то на самом деле (как правило) нет причин устанавливать compileSdkVersionзначение 21. Однако ваше приложение, скорее всего, будет нормально работать на API 21 как есть, поэтому вы меняете targetSdkVersionчтобы указать, что ваше приложение работает в API 21 так, как вы ожидаете (цель), но вы не используете API-интерфейсы, специфичные для 21 (компиляция), и поэтому compileSdkVersionв этом примере вы можете остаться на уровне 15.
Джефф Миксон
19
Когда я делаю это в Android-студии, появляется предупреждение. У меня есть «compileSdkVersion 17» и «targetSdkVersion 22», и он говорит мне, что «targetSdkVersion не должен быть выше, чем compileSdkVersion». О, просто изменил его, и теперь он говорит мне, что targetSdkVersion не самая последняя 22, и этот режим совместимости может сработать. Вздох.
Pelpotronic
18
Этот ответ противоречит тому, что говорит Android Studio. targetSdkVersion имеет значение, и он должен быть меньше или равен compileSdkVersion
ARK
152

В качестве путеводителя:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Идеально:

minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)

Читайте больше из этого великого поста Яна Лейка

Джимми Кейн
источник
Означает ли, minSdkVersion что приложение самого низкого уровня API-устройства canработает? Предположительно, потому что он использует определенные API, доступные minSdkVersionначиная с?
Нитин Бансал
1
@NitinBansal да. Например, если minSdkVersion15 (то есть ICS 4.0.3), устройства с API 14 (то есть ICS 4.0) не должны иметь возможность устанавливать приложение. И, по крайней мере, на данный момент, приложение будет работать на 15, 16, 17, 18, 19 (20, но это для старой версии OS), 21, 22, 23, 24, 25, 26, 27, 28 и т. Д. в будущем (вероятно)
Луи Цай
33

compileSdkVersionДолжна быть самая новая стабильная версия. Это targetSdkVersionдолжно быть полностью проверено и меньше или равно compileSdkVersion.

androidwifi
источник
14
Есть какая-то конкретная причина, чтобы сказать, что targetSdkVersion будет меньше, чем compileSdkVersion? Я считаю, что это неправильное утверждение
Суфиан
6
Я предполагаю, что суть в том, что последняя версия обратно совместима, поэтому последняя версия API может «вести себя» как старая, если вы установите targetSdkVersionболее низкую версию . Таким образом, это targetSdkVersionдолжен быть тот, который вы проверили и знаете точное поведение, и он может быть <= последней стабильной версией.
Продажи Dielson
Я думаю, что к вашему утверждению « compileSdkVersionдолжна быть новейшая стабильная версия» следует добавить суффикс «которого вы используете функции API». Нет смысла компилировать по API 27 (последний стабильный API на сегодняшний день), если вы используете только функции более низких версий API. Однако последняя стабильная версия может включать некоторые функции, которые автоматически становятся лучше, например повышенная безопасность или эффективная компиляция с обратной совместимостью. Поэтому желательно использовать самую последнюю или хотя бы последнюю стабильную версию, но это «не должно быть» самой последней версией как таковой .
Эрик
27

Позднее к игре ... и есть несколько хороших ответов выше - по сути, это compileSdkVersionверсия API, с которой приложение скомпилировано, а targetSdkVersionуказывает на версию, с которой тестировалось приложение.

Я хотел бы дополнить эти ответы следующими примечаниями:

  1. Это targetSdkVersionвлияет на то, как запрашиваются разрешения :

    • Если устройство работает под управлением Android 6.0 (уровень API 23) или выше, а приложение targetSdkVersion- 23 или выше, приложение запрашивает разрешения у пользователя во время выполнения.
    • Если устройство работает под управлением Android 5.1 (уровень API 22) или ниже, или приложение targetSdkVersionимеет значение 22 или ниже, система просит пользователя предоставить разрешения при установке приложения пользователем.
  2. Если compileSdkVersionона выше, чем версия, заявленная вашим приложением targetSdkVersion, система может включить режимы совместимости, чтобы приложение продолжало работать так, как вы ожидаете. ( ссылка )

  3. С каждым новым выпуском Android ...

    • targetSdkVersion следует увеличить до уровня API, а затем тщательно протестировать приложение на соответствующей версии платформы
    • compileSdkVersionс другой стороны, не нужно менять, если вы не добавляете функции исключительно в новую версию платформы
    • В результате, хотя targetSdkVersionчасто (изначально) меньше, чем compileSdkVersion, нередко можно увидеть хорошо поддерживаемое / устоявшееся приложение сtargetSdkVersion > compileSdkVersion
Остин Д
источник
5
Re: ваше второе замечание, я не думаю, что справочный документ прямо говорит об этом. В нем говорится: «Однако, если уровень API платформы выше, чем версия, объявленная targetSdkVersion вашего приложения, система может включить поведение совместимости, чтобы приложение продолжало работать так, как вы ожидаете». Я думаю, это означает, что если уровень API устройства, на котором вы работаете, новее, чем ваш, targetSdkVersionвы можете увидеть поведение совместимости. Я не верю, что это имеет какое-либо отношение к compileSdkVersion.
Джереми
20

The CompileSdkVersion версия платформы SDK, с которой ваше приложение работает для компиляции и т. д. В процессе разработки (вы всегда должны использовать самую последнюю версию) Поставляется с версией API, которую вы используете

введите описание изображения здесь

Вы увидите это в своем build.gradleфайле:

введите описание изображения здесь

targetSdkVersion:содержит информацию, которую ваше приложение отправляет ПОСЛЕ процесса разработки в магазин приложений, что позволяет TARGET the SPECIFIED version of the Android platform. В зависимости от функциональности вашего приложения оно может ориентироваться на версии API ниже текущей. Например, вы можете настроить таргетинг на API 18, даже если текущая версия равна 23.

Внимательно посмотрите на эту официальную страницу Google .

Оджонугва Джуд Очалифу
источник
9

В compiledSdkVersionпредыдущих ответах я вижу много различий , поэтому постараюсь немного уточнить здесь, следуя веб-странице Android.

A - Что говорит Android

Согласно https://developer.android.com/guide/topics/manifest/uses-sdk-element.html :

Выбор версии платформы и уровня API. При разработке приложения вам нужно будет выбрать версию платформы, для которой вы будете компилировать приложение. В общем случае вы должны скомпилировать свое приложение для самой низкой из возможных версий платформы, которую ваше приложение может поддерживать.

Итак, это будет правильный порядок в соответствии с Android:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

Б - Что говорят другие

Некоторые люди предпочитают всегда использовать самый высокий скомпилированный SkdVersion. Это потому, что они будут полагаться на подсказки кода, чтобы проверить, используют ли они более новые функции API, чем minSdkVersion, таким образом либо изменяя код, чтобы не использовать их, либо проверяя версию пользовательского API во время выполнения, чтобы условно использовать их с откатами для более старых версий API.

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

Таким образом, это будет правильный порядок в соответствии с другими:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

Что делать?

Это зависит от вас и вашего приложения.

Если вы планируете предлагать различные функции API в соответствии с уровнем API пользователя во время выполнения, используйте опцию B. Вы получите подсказки о функциях, которые вы используете при кодировании. Просто убедитесь, что вы никогда не используете более новые функции API, чем minSdkVersion, без проверки уровня пользовательского API во время выполнения, в противном случае ваше приложение вылетит. Этот подход также имеет преимущество в изучении того, что нового и старого в процессе кодирования.

Если вы уже знаете, что нового или старого, и вы разрабатываете одноразовое приложение, которое наверняка никогда не будет обновлено, или вы уверены, что не собираетесь предлагать новые функции API в зависимости от условий, тогда используйте опцию A. Вы не будете беспокоиться с устаревшими подсказками, и вы никогда не сможете использовать новые функции API, даже если у вас есть соблазн сделать это.

CGodo
источник
2
Я не думаю, что совет Android отличается. Там разница между «компиляции приложения против самой низкой возможной версии» и компиляции с определенной версией SDK. Как правило, вам следует скомпилировать (compileSdkVersion) с последней версией, установить минимальное значение min (minSdkVersion) и установить целевое значение (targetSdkVersion) как можно выше в зависимости от тестирования или других проблем совместимости.
Caltor
Хороший вопрос @Caltor. Я хотел бы, чтобы они обновили этот документ, чтобы уточнить разницу. <uses-sdk>Документация крайне расплывчаты и неоднозначны.
Джереми
2

Мои 2 цента: скомпилируйте с любой версией SDK, но будьте осторожны, чтобы не вызывать API, которые не поддерживает ваша «минимальная версия SDK». Это означает, что вы можете «скомпилировать» последнюю версию SDK.

Что касается «целевой версии», то это просто относится к тому, на что вы планировали нацелиться в первую очередь и, возможно, проверили. Если вы не провели должной осмотрительности, то это способ сообщить Android, что он должен выполнить некоторые дополнительные проверки, прежде чем развертывать ваше приложение, скажем, «Lollipop» на «Oreo».

Таким образом, «целевая версия» явно не ниже вашей «минимальной версии SDK», но она не может быть выше, чем ваша «скомпилированная версия».

pcodex
источник
1

Не отвечая на ваши прямые вопросы, поскольку уже есть много подробных ответов, но стоит упомянуть, что в отличие от документации Android, Android Studio предлагает использовать одну compileSDKVersionи ту же версию для и targetSDKVersion.

введите описание изображения здесь

sshturma
источник
0

compiledSdkVersion ==> какая версия SDK должна компилировать ваш код в байт-код (он используется в среде разработки): лучше использовать последнюю версию SDK.

minSdkVersion ==> этот элемент используется для установки APK (он используется в производственной среде). Например:

if(client-sdk-version   <   min-sdk-versoin )
    client-can-not-install-apk;
else
    client-can-install-apk;
M.Namjo
источник
0

Краткое резюме:

Для minSDKversion, смотрите последнюю запись в дескрипторе Twitter: https://twitter.com/minSdkVersion

TargetSDKversion: смотрите последнюю запись в дескрипторе твиттера: https://twitter.com/targtSdkVersion или используйте последний уровень API, как указано на devel https://developer.android.com/guide/topics/manifest/uses-sdk-element. HTML

Скомпилированная версия: сделать так же, как TargetSDKversion

maxSdkVersion: совет от Android - не устанавливать это, поскольку вы не хотите ограничивать свое приложение, чтобы оно не выполнялось в будущих выпусках Android

Куш
источник
0

Параметры приложения свойств проекта Android в Visual Studio 2017 (15.8.5) объединяют их:

введите описание изображения здесь

Саамы
источник