в чем разница между compilesdkversion и targetsdkversion?

<p>я посмотрел на <a href="http://developer.android.com/sdk/installing/studio-build.html#buildfilebasics">документация</a> для сборки с gradle, но я все еще не уверен, в чем разница между <code>compilesdkversion</code> и <code>targetsdkversion</code>.</p><p>все это говорит:</p><blockquote> <p>свойство <code>compilesdkversion</code> указывает цель компиляции.</p> </blockquote><p>ну, что такое "цель компиляции"?</p><p>я вижу два возможных способа интерпретировать это:</p><ol> <li><code>compilesdkversion</code> - это версия компилятора, используемого при сборке приложения, а <code>targetsdkversion</code> - это <a href="http://developer.android.com/guide/topics/manifest/uses-sdk-element.html">"уровень api, на который ориентировано приложение"</a> . (если бы это было так, я бы предположил, что <code>compilesdkversion</code> должно быть больше или равно <code>targetsdkversion</code>?</li> <li>они имеют в виду одно и то же. "цель компиляции" == "уровень api, на который нацелено приложение"</li> <li>что-то другое?</li> </ol><p>я вижу, что <a href="https://stackoverflow.com/questions/24510219/android-studio-min-skd-version-target-sdk-version-vs-compile-sdk-version">этот вопрос</a> задавался ранее, но один ответ просто цитирует документ, что мне непонятно.</p>

<h3>compilesdkversion</h3><p><code>compilesdkversion</code> - это версия api, для которой компилируется приложение. это означает, что вы можете использовать android функции api, включенные в эту версию api (очевидно, как и все предыдущие версии). если вы попробуете использовать функции api 16, но установите для <code>compilesdkversion</code> значение 15, вы получите ошибку компиляции. если вы установите для <code>compilesdkversion</code> значение 16, вы по-прежнему сможете запускать приложение на устройстве api 15, если пути выполнения вашего приложения не пытаются вызывать какие-либо api, специфичные для api 16.</p><h3>targetsdkversion</h3><p><code>targetsdkversion</code> не имеет никакого отношения к тому, как ваше приложение компилируется или какие api вы можете использовать. предполагается, что <code>targetsdkversion</code> указывает на то, что вы тестировали свое приложение (предположительно вплоть до включительно) в указанной вами версии. это больше похоже на сертификацию или подпись, которую вы предоставляете операционной системе android в качестве подсказки о том, как она должна обрабатывать ваше приложение с точки зрения функций операционной системы.</p><p>например, как <a href="http://developer.android.com/guide/topics/manifest/uses-sdk-element.html">документация</a> гласит:</p><blockquote> <p>например, установка этого значения на "11" или выше позволяет системе применять новую тему по умолчанию (holo) к вашему приложению при работе на android 3.0 или выше ...</p> </blockquote><p>android ос, <strong> во время выполнения </strong>, может изменить стилизацию или иное исполнение вашего приложения в контексте ос на основании этого. значение. есть несколько других известных примеров, на которые влияет это значение, и этот список, вероятно, будет только увеличиваться со временем.</p><p>для всех практических целей большинство приложений захотят установить <code>targetsdkversion</code> в последнюю выпущенную версию api. это гарантирует, что ваше приложение будет выглядеть как можно лучше на самых последних android устройствах. если вы не укажете <code>targetsdkversion</code>, по умолчанию используется <code>minsdkversion</code>.</p>

<p><strong> как путеводитель: </strong></p><pre><code>minsdkversion <= targetsdkversion <= compilesdkversion </code></pre><hr><p><strong> в идеале: </strong></p><pre><code>minsdkversion (lowest possible) <= targetsdkversion == compilesdkversion (latest sdk) </code></pre><hr><p> <a href="https://medium.com/google-developers/picking-your-compilesdkversion-minsdkversion-targetsdkversion-a098a0341ebd#.bpqsg4ili">читать дальше от этого великого поста иана лейка</a> </p>

<p><code>compilesdkversion</code> должна быть самой новой стабильной версией. <code>targetsdkversion</code> должен быть полностью протестирован и меньше или равен <code>compilesdkversion</code>.</p>

<p>позднее к игре ... и выше есть несколько хороших ответов - по сути, <code>compilesdkversion</code>- это версия api, с которой приложение скомпилировано, а <code>targetsdkversion</code>указывает версию, с которой тестировалось приложение.</p><p>я хотел бы дополнить эти ответы следующими примечаниями:</p><ol> <li> <p>это <a href="https://developer.android.com/guide/topics/permissions/requesting.html">\_<code>targetsdkversion</code>влияет на способ запроса разрешений</a> :</p> <ul> <li>если на устройстве запущено android 6.0 (уровень api 23) или выше, <strong> и </strong> <code>targetsdkversion</code>приложения равно 23 или выше, приложение запрашивает разрешения у пользователя во время выполнения.</li> <li>если устройство работает на android 5.1 (уровень api 22) <strong> или </strong> ниже или <code>targetsdkversion</code>приложения равно 22 или ниже, система просит пользователя предоставить разрешения, когда пользователь устанавливает приложение.</li> </ul> </li> <li> <p>если <code>compilesdkversion</code>выше версии, объявленной <code>targetsdkversion</code>вашего приложения, система может включить режимы совместимости, чтобы приложение продолжало работать так, как вы ожидаете. ( <a href="https://developer.android.com/guide/topics/manifest/uses-sdk-element.html">ссылка</a> )</p> </li> <li> <p>с каждым новым android выпуском ...</p> <ul> <li>необходимо увеличить значение <code>targetsdkversion</code>name\_\_, чтобы оно соответствовало последнему уровню api, а затем тщательно протестируйте приложение на соответствующей версии платформы.</li> <li><code>compilesdkversion</code>name\_\_, с другой стороны, изменять не нужно, если вы не добавляете функции, эксклюзивные для новой версии платформы</li> <li>в результате, хотя <code>targetsdkversion</code>часто (изначально) меньше, чем <code>compilesdkversion</code>name\_\_, нередко можно увидеть хорошо поддерживаемое/устоявшееся приложение с <code>targetsdkversion > compilesdkversion</code></li> </ul> </li> </ol>

<p><code>the compilesdkversion</code> - это версия платформы sdk, с которой ваше приложение работает для компиляции и т. д. в процессе разработки (вы всегда должны использовать самую последнюю версию). она поставляется с используемой версией api.</p><p> <a href="https://i.stack.imgur.com/ve1mx.png"><img src="https://i.stack.imgur.com/ve1mx.png" alt="enter image description here"></a> </p><p>вы увидите это в своем файле <code>build.gradle</code>:</p><p> <a href="https://i.stack.imgur.com/n8gub.png"><img src="https://i.stack.imgur.com/n8gub.png" alt="enter image description here"></a> </p><p><code>targetsdkversion:</code> содержит информацию, которую ваше приложение отправляет после процесса разработки в магазин приложений, что позволяет ему <code>target the specified version of the android platform</code>. в зависимости от функциональности вашего приложения оно может ориентироваться на версии api ниже текущей. например, вы можете настроить таргетинг на api 18, даже если текущая версия равна 23.</p><p>внимательно посмотрите на этот официальный google <a href="http://developer.android.com/guide/topics/manifest/uses-sdk-element.html">страница</a> .</p>

<p>я вижу много различий относительно <strong><code>compiledsdkversion</code></strong> в предыдущих ответах, поэтому я попытаюсь немного уточнить здесь, следуя веб-странице android.</p><p><strong> a - что android говорит </strong></p><p>согласно <a href="https://developer.android.com/guide/topics/manifest/uses-sdk-element.html">https://developer.android.com/guide/topics/manifest/uses-sdk-element.html</a> :</p><blockquote> <p>выбор версии платформы и уровня api. при разработке приложения вам нужно будет выбрать версию платформы, для которой вы будете компилировать приложение. <strong> как правило, вы должны скомпилировать свое приложение для самой низкой версии платформы, которую ваше приложение может поддерживать. </strong></p> </blockquote><p>итак, это будет правильный порядок в соответствии с android:</p><p><strong><code>compiledsdkversion = minsdkversion <= targetsdkversion</code></strong></p><p><strong> b - что и другие говорят </strong></p><p>некоторые люди предпочитают всегда использовать самый высокий скомпилированный skdversion. это связано с тем, что они будут полагаться на подсказки кода, чтобы проверить, используют ли они более новые функции api, чем minsdkversion, тем самым либо изменяя код, чтобы не использовать их, либо проверяя версию пользовательского api во время выполнения, чтобы условно использовать их с откатами для более старых версий api.</p><p>подсказки об устаревших видах использования также появляются в коде, давая вам знать, что что-то устарело на более новых уровнях api, так что вы можете реагировать соответствующим образом, если хотите.</p><p>таким образом, это будет правильный порядок в соответствии с другими:</p><p><strong><code>minsdkversion <= targetsdkversion <= compiledsdkversion (highest possible)</code></strong></p><p><strong> что делать? </strong></p><p>это зависит от вас и вашего приложения.</p><p>если вы планируете предлагать различные функции api в соответствии с уровнем api пользователя во время выполнения, используйте опцию b. вы получите подсказки о функциях, которые вы используете при кодировании. просто убедитесь, что вы никогда не используете более новые функции api, чем minsdkversion, без проверки уровня пользовательского api во время выполнения, в противном случае ваше приложение вылетит. этот подход также имеет преимущество в изучении того, что нового и старого в процессе кодирования.</p><p>если вы уже знаете, что нового или старого, и вы разрабатываете одноразовое приложение, которое наверняка никогда не будет обновлено, или вы уверены, что не собираетесь предлагать новые функции api в зависимости от условий, тогда используйте опцию a. вы не будете беспокоиться с устаревшими подсказками, и вы никогда не сможете использовать новые функции api, даже если у вас есть соблазн сделать это.</p>

<p>мои 2 цента: скомпилируйте для любой версии sdk, но будьте осторожны, чтобы не вызывать api, которые не поддерживает ваша "минимальная версия sdk". это означает, что вы можете "скомпилировать" последнюю версию sdk.</p><p>что касается "целевой версии", то это просто относится к тому, на что вы планировали нацелиться в первую очередь и, возможно, проверили. если вы не провели должной осмотрительности, то это способ сообщить android, что ему необходимо выполнить некоторые дополнительные проверки, прежде чем развертывать ваше приложение, скажем, "lollipop", в "oreo".</p><p>таким образом, "целевая версия" явно не ниже вашей "минимальной версии sdk", но она не может быть выше, чем ваша "скомпилированная версия".</p>

<p>не отвечая на ваши прямые вопросы, поскольку уже есть много подробных ответов, но стоит упомянуть, что, вопреки android документации, android studio предлагает использовать то же самое версия для <code>compilesdkversion</code> и <code>targetsdkversion</code>.</p><p> <a href="https://i.stack.imgur.com/lxwp6.png"><img src="https://i.stack.imgur.com/lxwp6.png" alt="enter image description here"></a> </p>

<p>параметры приложения свойств проекта android в visual studio 2017 (15.8.5), кажется, объединяют их или что-то в этом роде:</p><p> <a href="https://i.stack.imgur.com/rkyrn.png"><img src="https://i.stack.imgur.com/rkyrn.png" alt="enter image description here"></a> </p>

<p><strong><em> compiledsdkversion </em></strong>==> какая версия sdk должна компилировать ваш <strong>код</strong> в <strong>байт-код</strong> (используется в среде разработки): лучше использовать последнюю версию sdk.</p><p><strong><em> minsdkversion </em></strong>==> этот элемент используется для установки apk (он используется в производственной среде). например:</p><pre><code>if(client-sdk-version < min-sdk-versoin ) client-can-not-install-apk; else client-can-install-apk; </code></pre>