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

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

все, что он говорит:

на compileSdkVersion свойство указывает цель компиляции.

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

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

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

Я вижу этот вопрос был задан раньше, но один ответ просто цитирует doc, что является неясным для мне.

9 ответов


compileSdkVersion

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

targetSdkVersion

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

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

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

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

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


как руководство oneliner:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

В идеале:

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

подробнее с этого Великого поста Ян Лейк


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


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

я хотел бы дополнить эти ответы с пометкой:

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

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

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

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

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

enter image description here

вы увидите это в ваш :

enter image description here

targetSdkVersion: содержит информацию, с которой ваше приложение поставляется после процесса разработки в app store, что позволяет ему 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

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

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

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

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

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

что делать?

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

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

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


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

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

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


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

enter image description here


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

enter image description here