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

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

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

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

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

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

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

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

13 ответов

Решение

compileSdkVersion

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

targetSdkVersion

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

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

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

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

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

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

minSdkVersion <= targetSdkVersion <= compileSdkVersion

В идеале:

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

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

Поздно к игре... и есть несколько отличных ответов выше - по сути, что 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

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

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

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

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

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

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

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

Я вижу много различий в 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, даже если у вас есть соблазн сделать это.

compileSdkVersion: compileSdkVersion определяет, какая версия Android SDK будет использоваться gradle для компиляции вашего приложения.

Например: в Android 12 и SDK версии 31 был представлен новый API-интерфейс заставки, который позволяет нам легко реализовать заставку. Если вы хотите использовать этот API в своем приложении, вам необходимо обновить compileSdkVersion до 31 в своем приложении. Только тогда вы сможете использовать этот новый API-интерфейс заставки в своем коде, иначе вы получите ошибку компиляции.

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

      *if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {

// New Splash screen API

} else {

// Old splash screen approach

}*

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

Но изменение только compileSdkVersion фактически не меняет поведение приложения при запуске на устройстве Android. Так как же система Android узнает, может ли она использовать новые функции вашего приложения или нет? Вот тут-то и вступает в игру targetSdkVersion.

targetSdkVersion: targetSdkVersion сообщает системе, для какой версии Android приложение было разработано и протестировано.

Например: В Android 12 изменился внешний вид пользовательских уведомлений. Если ваша targetSdkVersion ниже 31, система предположит, что вы не тестировали эту функцию, и будет отображать уведомления старым способом, чтобы минимизировать риск того, что уведомление не будет отображаться должным образом. Только после обновления целевой версии SDK до 31 будет использоваться новый внешний вид уведомлений.

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

-> изменения в поведении приложений, ориентированных на определенные версии Android.

-> и изменения для всех приложений, независимо от того, какую targetSdkVersion они определяют.

Примером последнего может быть введение одноразовых разрешений в Android 11. Когда устройство использует Android версии 11 или выше и приложение запрашивает разрешение на определение местоположения, пользователь может предоставить временный доступ к этим данным, и приложение должно справиться с этим. регистр правильно независимо от того, предназначен ли он для SDK версии 30 или нет.

Связь между компилируемой и целевой версиями SDK:

-> targetSdkVersion не может быть выше, чем compileSdkVersion просто потому, что мы не можем ориентироваться на вещи, о которых ничего не знаем во время компиляции.

-> В идеале значения compileSdkVersion и targetSdkVersion должны быть равны и оба указывают на последнюю версию SDK.

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

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

if(client-sdk-version   <   min-sdk-versoin )
    client-can-not-install-apk;
else
    client-can-install-apk;

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

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

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

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

компиляцияSdkVersion

compileSdkVersion указывает версию Android SDK, с которой будет скомпилирован ваш код. Это означает, что ваше приложение может использовать все API, включенные в указанную версию и любые предыдущие версии.

Например, если вы установите для compileSdkVersion значение 30, это означает, что ваше приложение может использовать все API, которые были представлены до версии 30. Например, если вы хотите использовать API Camera2, который был представлен в Android 5.0 (уровень API 21) и выше, и вы установили для параметра compileSdkVersion значение 30, ваше приложение может использовать этот API без каких-либо проблем. Однако если вы попытаетесь использовать API, представленный в Android 31 (который еще не выпущен), вы получите ошибку времени компиляции, поскольку этот API еще недоступен в установленной вами версии compileSdkVersion .

targetSdkVersion

targetSdkVersion — это версия Android SDK, для работы которой предназначено приложение. Он указывает уровень API, на котором приложение было протестировано и на котором оно предназначено для работы, а также указывает уровень совместимости, который приложение обеспечивает с новыми версиями Android.

Например, если вы установите для targetSdkVersion значение 30, вы указываете, что ваше приложение предназначено для работы на устройствах под управлением Android 30 или более поздней версии. Это означает, что вы протестировали свое приложение на соответствие API-интерфейсам, представленным в версии 30, и убедились, что ваше приложение корректно работает на этих устройствах. Однако это также означает, что ваше приложение может не использовать преимущества новых функций и API, представленных в более поздних версиях Android, если вы явно не напишете для них код.

Краткое содержание

Таким образом, compileSdkVersion определяет набор API-интерфейсов, которые можно использовать в процессе сборки, а targetSdkVersion указывает уровень API, на котором предназначено приложение, и указывает уровень совместимости, который приложение обеспечивает с более новыми версиями Android.

В идеале значения compileSdkVersion и targetSdkVersion должны быть равны и оба указывают на последнюю версию SDK. Но, конечно, только после того, как вы проверите, что все изменения, внесенные в эту версию, без проблем работают с вашим приложением!

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

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

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

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

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

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

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

Другие вопросы по тегам