Чим відрізняється compileSdkVersion від targetSdkVersion?


525

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

Все сказане:

compileSdkVersionВластивість визначає мету компіляції.

Що ж таке "ціль компіляції"?

Я бачу два можливі способи інтерпретувати це:

  1. compileSdkVersionце версія компілятора, яка використовується при створенні програми, тоді targetSdkVersionяк "рівень API, на який орієнтується додаток" . (Якби це було так, я вважаю, що compileSdkVersionповинно бути більше або дорівнює targetSdkVersion?
  2. Вони означають те саме. "ціль компіляції" == "рівень API, на який спрямована програма"
  3. Щось ще?

Я бачу, що це питання було задано і раніше, але одна відповідь просто цитує док. Це те, що мені незрозуміло.



2
targetSdkVersion - це те, що працює на вашому пристрої. Тож якщо ваші пристрої працюють нижче, ніж Oreo, тоді не націлюйте на 27.
ІгорГанапольський,

Відповіді:


546

compileSdkVersion

Це compileSdkVersionверсія API, з якою компілюється додаток. Це означає, що ви можете використовувати функції Android API, включені до цієї версії API (як і всі попередні версії, очевидно). Якщо ви спробуєте використовувати функції API 16, але встановлені compileSdkVersionна 15, ви отримаєте помилку компіляції. Якщо встановлено compileSdkVersion16, ви все одно можете запускати додаток на пристрої 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 вище, ніж SDK, з якого ви склали.
coder123

55
Перехід compileSdkVersionна більш високу версію означатиме, що ви хочете використовувати нові API, які включені лише у цей конкретний випуск. Якщо ви не плануєте використовувати якісь особливості Lollipop у вашому додатку, то насправді (зазвичай) немає причин коли-небудь встановити compileSdkVersion21. Однак, ваш додаток, швидше за все, працює на API 21 як є, таким чином ви зміните targetSdkVersionщоб вказати, що ваш додаток працює так, як ви очікуєте (націлений) на API 21, але ви не використовуєте API, характерний для 21 (компілювати), і, таким чином, compileSdkVersionу цьому прикладі ви можете залишитися на рівні 15.
Джефф Міксон

19
Попередження надходить, коли я роблю це в студії Android. У мене є "compileSdkVersion 17" і "targetSdkVersion 22", і це говорить мені, що "targetSdkVersion не повинен бути вище, ніж compileSdkVersion". О, я просто змінив це, і тепер це говорить мені, що targetSdkVersion не є останнім 22, і цей режим сумісності може початися.
Пелпотронік

18
Ця відповідь суперечить тому, що говорить Android Studio. Значення targetSdkVersion має значення менше, ніж для компіляціїSdkVersion
ARK

152

В якості керівництва для oneliner:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Ідеально:

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

Читайте більше з цього чудового поста від Ian Lake


Чи minSdkVersion означає, що canзапуск додатка найнижчого рівня пристрою працює? Імовірно, тому, що він використовує певні API, доступні minSdkVersionвідтепер?
Нітін Бансал

1
@NitinBansal так. Наприклад, якщо minSdkVersion15 (це ICS 4.0.3), пристрої з API 14 (це ICS 4.0) не повинні мати змогу встановлювати додаток. І принаймні поки що додаток працюватиме на 15, 16, 17, 18, 19, (20, але це для старих ОС), 21, 22, 23, 24, 25, 26, 27, 28 і так далі в майбутньому (ймовірно)
Луї Цай

33

compileSdkVersionПовинна бути найновіша стабільна версія. targetSdkVersionПовинні бути повністю перевірені і менше або дорівнює compileSdkVersion.


14
Якась конкретна причина для того, щоб сказати, що targetSdkVersion буде менше, ніж compileSdkVersion? Я вважаю, що це неправильне твердження
Суфіан

6
Думаю, справа в тому, що остання версія є сумісною назад, тому остання версія API може "поводитися" як старіша, якщо встановити targetSdkVersionнижчу. Тож targetSdkVersionповинен бути той, кого ви перевірили і знаєте точну поведінку, і може бути <= остання стабільна.
Продаж Дільсона

Я думаю, що ваше твердження " 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, система може активувати сумісність, щоб ваш додаток продовжував працювати так, як ви очікували. ( ref )

  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, навіть якщо ви спокуситесь це зробити.


2
Я не думаю, що поради Android відрізняються. Існує різниця між "компілювати заявку проти найменшої можливої ​​версії" та компілювати з певною версією SDK. Як правило, ви повинні компілювати (compileSdkVersion) з останньою версією, встановити мінімум (minSdkVersion) якнайнижче та встановити ціль (targetSdkVersion) якомога вище, залежно від тестування чи інших питань сумісності.
Caltor

Хороший момент @Caltor. Я б хотів, щоб вони оновили цей документ, щоб уточнити різницю. <uses-sdk>Документація вкрай розпливчасті та неоднозначні.
Джеремі

2

Мої 2 копійки: компілюйте будь-яку версію SDK, але будьте обережні, щоб не викликати будь-які API, які "мінімальна версія SDK" не підтримує. Це означає, що ви "могли" компілювати проти останньої версії SDK.

Що стосується "цільової версії", то вона просто стосується того, на що ви планували націлити, в першу чергу і, можливо, протестували. Якщо ви ще не зробили належну ретельність, то це спосіб повідомити Android про те, що він повинен здійснити деякі додаткові перевірки, перш ніж він розкриє ваші можливості сказати націлену програму "Lollipop" на "Oreo".

Отже, "цільова версія", очевидно, не нижче, ніж ваша "мінімальна версія SDK", але вона не може бути вище, ніж "складена версія".


1

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

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


0

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

minSdkVersion ==> цей елемент використовується для установки APK (він використовується у виробничому середовищі). Наприклад:

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

0

Швидкий підсумок:

Про minSDKversion дивіться останню запис у ручці Twitter: https://twitter.com/minSdkVersion

TargetSDKversion: перегляньте останню запис у ручці щебетання: https://twitter.com/targtSdkVersion або використовуйте останній рівень API, як вказано на https://developer.android.com/guide/topics/manifest/uses-sdk-element. html

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

maxSdkVersion: порада від Android полягає в тому, щоб не встановлювати це, оскільки ви не хочете обмежувати свою програму не виконувати наступні версії для Android


0

Налаштування програми для властивостей проекту Android у Visual Studio 2017 (15.8.5) поєднують їх:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.