Якщо мова йде про розробку програм для Android, чим відрізняється версія Min та Target SDK? Eclipse не дозволить мені створити новий проект, якщо версія Min і Target однакові!
Якщо мова йде про розробку програм для Android, чим відрізняється версія Min та Target SDK? Eclipse не дозволить мені створити новий проект, якщо версія Min і Target однакові!
Відповіді:
android: minSdkVersion
Ціле число, що позначає мінімальний рівень API, необхідний для запуску програми. Система Android не дозволить користувачу встановити додаток, якщо рівень API системи нижче, ніж значення, вказане в цьому атрибуті. Ви завжди повинні декларувати цей атрибут.
android: targetSdkVersion
Ціле число, що позначає рівень API, на який орієнтується додаток.
За допомогою цього набору атрибутів додаток говорить, що він може працювати на старих версіях (аж до minSdkVersion), але був явно перевірений для роботи з вказаною тут версією. Визначення цієї цільової версії дозволяє платформі відключити параметри сумісності, які не потрібні цільовій версії (які в іншому випадку можуть бути включені для підтримки сумісності вперед) або ж включити нові функції, недоступні для старих програм. Це не означає, що ви можете запрограмувати різні функції для різних версій платформи - вона просто інформує платформу, що ви протестували цільову версію, і платформа не повинна виконувати додаткових робіт для підтримки сумісності вперед із цільовою версією.
Для отримання додаткової інформації зверніться до цієї URL-адреси:
http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
Коментар, опублікований ОП до питання (в основному вказуючи, що targetSDK не впливає на компіляцію програми), абсолютно помилковий! Вибачте, що тупий.
Коротше кажучи, тут є мета оголосити інший targetSDK від minSDK: Це означає, що ви використовуєте функції SDK вищого рівня, ніж ваш мінімум, але ви забезпечили сумісність назад . Іншими словами, уявіть, що ви хочете використовувати функцію, яка була нещодавно представлена, але вона не є критичною для вашої програми. Потім ви встановите targetSDK на версію, де цю нову функцію було введено, а мінімум на щось нижче, щоб усі могли ще користуватися вашим додатком.
Для прикладу, скажімо, ви пишете додаток, який широко використовує виявлення жестів. Однак кожну команду, яку можна розпізнати жестом, можна виконати також кнопкою або з меню. У цьому випадку жести є «класним додатком», але вони не потрібні. Тому ви встановили цільовий sdk на 7 ("Eclair", коли була введена бібліотека GestureDetection), а minimSDK - на рівень 3 ("Cupcake"), щоб навіть люди з дійсно старими телефонами могли використовувати ваш додаток. Все, що вам потрібно зробити, це переконатися, що ваш додаток перевіряв версію Android, на якій він працював, перш ніж намагатися використовувати бібліотеку жестів, щоб уникнути спроб використовувати його, якщо його не було. (Правда, це датований приклад, оскільки навряд чи хтось досі має телефон v1.5, але був час, коли підтримувався сумісність з v1.
Щоб навести ще один приклад, ви можете скористатися цим, якщо хочете скористатися функцією з пряників чи соти. Деякі люди отримають оновлення незабаром, але багато інших, особливо зі старішим обладнанням, можуть застрягти з Eclair, поки не придбають новий пристрій. Це дозволить вам використовувати деякі цікаві нові функції, але не виключаючи частину вашого можливого ринку.
З блогу розробника Android є дійсно гарна стаття про те, як користуватися цією функцією, і зокрема, як створити код "перевірити функцію, перш ніж її використовувати", який я згадав вище.
До ОП: Я писав це головним чином на користь тому, хто трапляється натрапляти на це питання в майбутньому, оскільки я розумію, що ваше питання було задано давно.
Встановлюючи targetSdkVersion = "xx", ви підтверджуєте, що ваш додаток працює належним чином (наприклад, ретельно і успішно перевірено) на рівні API xx.
Версія Android, що працює на рівні API вище xx, автоматично застосує код сумісності для підтримки будь-яких функцій, на які можна покластися, які були доступні на рівні xx або раніше, але які тепер застаріли на вищому рівні цієї версії Android.
І навпаки, якщо ви використовуєте будь-які функції, які застаріли на рівні xx або раніше , код сумісності не буде автоматично застосований версіями ОС на більш високих рівнях API (які більше не включають ці функції) для підтримки цих застосувань. У цій ситуації у вашому власному коді повинні бути спеціальні застереження, що перевіряють рівень API, і якщо виявлений рівень ОС є вищим, який більше не має заданої функції API, ваш код повинен використовувати альтернативні функції, які доступні у працюючих ОС Рівень API.
Якщо цього не зробити, то деякі функції інтерфейсу можуть просто не з’являтися, які зазвичай викликають події у вашому коді, і вам може бути відсутня важлива функція інтерфейсу, необхідна користувачеві для запуску цих подій та доступу до їх функціональності (як у приклад нижче).
Як зазначено в інших відповідях, ви можете встановити targetSdkVersion вище minSdkVersion, якщо ви хочете використати деякі функції API, спочатку визначені на більш високих рівнях API, ніж ваш minSdkVersion, і вжили заходів для того, щоб ваш код міг виявити та обробляти відсутність цих функцій на нижчі рівні, ніж targetSdkVersion.
Щоб попередити розробників спеціально перевірити мінімальний рівень API, необхідний для використання функції, компілятор видасть помилку (а не лише попередження), якщо код містить виклик до будь-якого методу, який був визначений на пізнішому рівні API, ніж minSdkVersion, навіть якщо targetSdkVersion перевищує або дорівнює рівню API, на якому цей метод вперше був доступний. Щоб усунути цю помилку, директива компілятора
@TargetApi(nn)
повідомляє компілятору, що код у межах цієї директиви (який передує або методу, або класу) був написаний для перевірки рівня API щонайменше nn до виклику будь-якого методу, який залежить від наявності принаймні цього рівня API . Наприклад, наступний код визначає метод, який можна викликати з коду в додатку, який має minSdkVersion менше 11 та targetSdkVersion 11 або вище:
@TargetApi(11)
public void refreshActionBarIfApi11OrHigher() {
//If the API is 11 or higher, set up the actionBar and display it
if(Build.VERSION.SDK_INT >= 11) {
//ActionBar only exists at API level 11 or higher
ActionBar actionBar = getActionBar();
//This should cause onPrepareOptionsMenu() to be called.
// In versions of the API prior to 11, this only occurred when the user pressed
// the dedicated menu button, but at level 11 and above, the action bar is
// typically displayed continuously and so you will need to call this
// each time the options on your menu change.
invalidateOptionsMenu();
//Show the bar
actionBar.show();
}
}
Ви також можете оголосити більш високий targetSdkVersion, якби ви протестували на цьому більш високому рівні і все працювало, навіть якщо ви не використовували жодних функцій з рівня API, вищого за ваш minSdkVersion. Це було б просто, щоб уникнути накладних витрат на доступ до коду сумісності, призначеного для адаптації від цільового рівня до мінімального рівня, оскільки ви б підтвердили (за допомогою тестування), що такої адаптації не потрібно.
Прикладом функції інтерфейсу користувача, яка залежить від оголошеного targetSdkVersion, може бути кнопка меню з трьома вертикальними точками, яка з’являється на панелі стану додатків, у яких targetSdkVersion менше 11, коли ці програми працюють під API 11 і вище. Якщо ваш додаток має targetSdkVersion 10 або нижче, передбачається, що інтерфейс вашого додатка залежить від існування спеціальної кнопки меню, і, отже, триточкова кнопка замість цього займає попередні спеціальні апаратні та / або екранні версії цієї кнопки (наприклад, як це видно в Gingerbread), коли в ОС вищий рівень API, для якого більше не передбачається спеціальна кнопка меню на пристрої. Однак якщо встановити targetSdkVersion програми 11 або вище, передбачається, що ви скористалися функціями, запровадженими на тому рівні, які замінюють спеціальну кнопку меню (наприклад, g., панель дій) або що ви іншим чином обійшли необхідність мати кнопку системного меню; отже, три вертикальне меню "кнопка сумісності" зникає. У такому випадку, якщо користувач не може знайти кнопку меню, вона не може натиснути її, а це, в свою чергу, означає, що перекриття функції onCreateOptionsMenu (меню) вашої діяльності ніколи не може бути викликано, що, знову ж таки, означає, що значна частина функцій вашого додатка може бути позбавлена його користувальницького інтерфейсу. Якщо, звичайно, ви не застосували панель дій або якийсь інший альтернативний спосіб для доступу користувача до цих функцій. не знайти кнопку меню, вона не може натиснути її, а це, в свою чергу, означає, що перезавантаження програми onCreateOptionsMenu (меню) може ніколи не викликатися, що, в свою чергу, означає, що значна частина функцій вашого додатка може бути позбавлений інтерфейсу користувача. Якщо, звичайно, ви не застосували панель дій або якийсь інший альтернативний спосіб для доступу користувача до цих функцій. не знайти кнопку меню, вона не може натиснути її, а це, в свою чергу, означає, що перезавантаження програми onCreateOptionsMenu (меню) може ніколи не викликатися, що, в свою чергу, означає, що значна частина функцій вашого додатка може бути позбавлений інтерфейсу користувача. Якщо, звичайно, ви не застосували панель дій або якийсь інший альтернативний спосіб для доступу користувача до цих функцій.
minSdkVersion, навпаки, заявляє вимогу, щоб версія ОС пристрою мала принаймні той рівень API, щоб запустити додаток. Це впливає на те, які пристрої можуть переглядати та завантажувати вашу програму, коли вона знаходиться у магазині додатків Google Play (а також, можливо, і в інших магазинах додатків). Це спосіб констатувати, що ваша програма покладається на ОС (API чи інші) функції, створені на цьому рівні, і не має прийнятного способу вирішити відсутність цих функцій.
Прикладом використання minSdkVersion для забезпечення наявності функції, що не пов’язана з API, було б встановити minSdkVersion на 8, щоб переконатися, що ваш додаток буде працювати лише у версії Dalvik-інтерпретатора з підтримкою JIT (з моменту введення JIT до перекладача Android на рівні 8). Оскільки продуктивність інтерпретатора, що підтримує JIT, може бути в п’ять разів більша за одну, у якої відсутня ця функція, якщо ваш додаток активно використовує процесор, то для забезпечення достатньої продуктивності вам може знадобитися API рівня 8 або вище.
Концепція може бути краще представлена на прикладах завжди . У мене виникли проблеми з розумінням цієї концепції, поки я не заглибився у вихідний код Android Framework і не здійснив експерименти, навіть прочитавши всі документи на веб-сайтах розробників Android та пов’язаних з ними потоках stackoverflow. Я поділюсь двома прикладами, які мені дуже допомогли повністю зрозуміти ці поняття.
DatePickerDialog буде виглядати по- різному в залежності від рівня , який ви поклали в targetSDKversion AndroidManifest.xml файлу ( <uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>
). Якщо ви встановите значення 10 або менше, ваш DatePickerDialog буде виглядати ліворуч. З іншого боку, якщо ви встановите значення 11 або вище, DatePickerDialog буде виглядати правильно, з таким самим кодом .
Код, який я використовував для створення цього зразка, надзвичайно простий. MainActivity.java
виглядає:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClickButton(View v) {
DatePickerDialog d = new DatePickerDialog(this, null, 2014, 5, 4);
d.show();
}
}
І activity_main.xml
виглядає:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickButton"
android:text="Button" />
</RelativeLayout>
Це воно. Це дійсно кожен код, який мені потрібно перевірити.
І ця зміна зовнішності є кришталево зрозумілою, коли ви бачите вихідний код Android OS . Виходить так:
public DatePickerDialog(Context context,
OnDateSetListener callBack,
int year,
int monthOfYear,
int dayOfMonth,
boolean yearOptional) {
this(context, context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB
? com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert
: com.android.internal.R.style.Theme_Dialog_Alert,
callBack, year, monthOfYear, dayOfMonth, yearOptional);
}
Як бачите, рамка отримує поточну targetSDKversion і задає іншу тему. Цей фрагмент коду ( getApplicationInfo().targetSdkVersion >= SOME_VERSION
) можна знайти тут і там в рамках Android.
Ще один приклад - про клас WebView . Публічні методи веб-перегляду класу Webview повинні викликатись у головному потоці, а якщо ні, то система виконання виконує значення RuntimeException
, коли ви встановлюєте targetSDKversion 18 або вище. Така поведінка може бути чітко представлена з її вихідним кодом . Це просто написано так.
sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >=
Build.VERSION_CODES.JELLY_BEAN_MR2;
if (sEnforceThreadChecking) {
throw new RuntimeException(throwable);
}
Доктор Android каже: " Коли Android розвивається з кожною новою версією, деякі поведінки і навіть зовнішність можуть змінитися ". Отже, ми розглянули, як змінюються поведінка та зовнішній вигляд, і як це відбувається.
Підсумовуючи, доктор Android говорить, що " Цей атрибут (targetSdkVersion) інформує систему, яку ви протестували на цільовій версії, і система не повинна дозволяти поведінці сумісності підтримувати сумісність вашого додатка з цільовою версією. " Це справді зрозуміло із випадку WebView. Було нормально, поки JELLY_BEAN_MR2 не вийшов на виклик публічного методу класу WebView у не головній темі. Це нісенітниця, якщо рамка Android кидає RuntimeException на пристрої JELLY_BEAN_MR2. Це просто не повинно дозволяти нововведеним способам поведінки за своїм інтересом, які призводять до летального результату. Отже, що нам потрібно зробити, це перевірити, чи все добре на певних targetSDKversions. Ми отримуємо такі переваги, як покращення зовнішності, встановивши більш високу targetSDKversion,
EDIT: відмова від відповідальності. Конструктор DatePickerDialog, який встановлював різні теми на основі поточної targetSDKversion (що я показав вище), насправді був змінений у наступних комісіях . Проте я використав цей приклад, оскільки логіка не була змінена, і цей фрагмент коду чітко показує концепцію targetSDKversion.
Для тих, хто хоче резюме,
android:minSdkVersion
є мінімальною версією, поки ваша програма не підтримує. Якщо на вашому пристрої встановлена нижча версія Android, додаток не буде встановлюватися.
поки,
android:targetSdkVersion
- це рівень API, до якого ваша програма призначена для роботи. Значить, системі вашого телефону не потрібно використовувати будь-яку поведінку сумісності, щоб підтримувати сумісність вперед, оскільки ви протестували до цього API.
Ваш додаток все ще працюватиме на версіях Android, вищих, ніж дані, targetSdkVersion
але поведінка сумісності андроїда спричинить за собою.
Халява -
android:maxSdkVersion
якщо версія API вашого пристрою вище, додаток не встановлюватиметься. Тобто це максимальний API, до якого ви дозволяєте встановити додаток.
тобто. для MinSDK -4, maxSDK - 8, targetSDK - 8 Мій додаток працюватиме як мінімум на 1.6, але я також використовував функції, які підтримуються лише в 2.2, які будуть видні, якщо він встановлений на пристрої 2.2. Крім того, для maxSDK - 8, ця програма не встановлюватиметься на телефони за допомогою API> 8.
На момент написання цієї відповіді документація Android не робила великої роботи з її поясненням. Зараз це дуже добре пояснено. Перевірте це тут
Якщо у вас є деякі помилки компіляції, наприклад:
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="15" />
.
private void methodThatRequiresAPI11() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.ARGB_8888; // API Level 1
options.inSampleSize = 8; // API Level 1
options.inBitmap = bitmap; // **API Level 11**
//...
}
Ви отримуєте помилку компіляції:
Поле вимагає рівня API 11 (поточний хв. 10): android.graphics.BitmapFactory $ Options # inBitmap
Починаючи з версії 17 Інструментів для розробки Android (ADT), існує одна нова і дуже корисна примітка, @TargetApi
яка може виправити це дуже легко. Додайте його перед методом, який додає проблемну декларацію:
@TargetApi
private void methodThatRequiresAPI11() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.ARGB_8888; // API Level 1
options.inSampleSize = 8; // API Level 1
// This will avoid exception NoSuchFieldError (or NoSuchMethodError) at runtime.
if (Integer.valueOf(android.os.Build.VERSION.SDK) >= android.os.Build.VERSION_CODES.HONEYCOMB) {
options.inBitmap = bitmap; // **API Level 11**
//...
}
}
Зараз немає помилок компіляції, і вона запуститься!
РЕДАКТУВАННЯ: Це призведе до помилки виконання на рівні API нижче 11. 11 або вище він працюватиме без проблем. Отже, ви повинні бути впевнені, що ви викликаєте цей метод на шляху виконання, який захищається перевіркою версії. TargetApi дозволяє лише скласти його, але ви запускаєте його на власний ризик.
android:minSdkVersion
і android:targetSdkVersion
обидва є цілим значенням, яке нам потрібно оголосити у файлі маніфесту Android, але обидва мають різні властивості.
android:minSdkVersion:
Це мінімально необхідний рівень API для запуску програми для Android. Якщо ми встановимо той самий додаток на нижчій версії API, з’явиться помилка аналізатора, і з’явиться проблема, що не підтримує програму.
android:targetSdkVersion:
Версія цільової sdk полягає у встановленні рівня програми для цільового API. якщо цей атрибут не задекларований у маніфесті, версія minSdk буде вашою версією TargetSdk. Це завжди вірно, що "встановлення підтримки додатків у всіх вищих версіях API, які ми оголосили як TargetSdk Version". Щоб зробити програму обмеженою ціллю, нам потрібно оголосити maxSdkVersion у нашому файлі маніфесту ...
Якщо ви робите програми, які потребують небезпечних дозволів і встановлюєте targetSDK 23 або вище, ви повинні бути обережними. Якщо ви не перевірите дозволи на час виконання, ви отримаєте SecurityException, і якщо ви використовуєте код всередині пробного блоку, наприклад, відкриту камеру, ви можете виявити помилку, якщо не перевірити logcat.
Цільовий sdk - це версія, яку ви хочете націлити, а min sdk - мінімальна.