Версія Android SD SDK від цільової версії SDK


442

Якщо мова йде про розробку програм для Android, чим відрізняється версія Min та Target SDK? Eclipse не дозволить мені створити новий проект, якщо версія Min і Target однакові!


1
З того, що я читаю, це здається, що версія Target SDK не впливає на спосіб складання вашої програми. Саме там потрібно сказати пристрою, що програма працює на тому, що їй не потрібно вмикати будь-які особливі функції сумісності, щоб ваша програма працювала належним чином. Чи це правильно? Мені здається, ви б не знали, яка ваша цільова версія SDK, поки ПІСЛЯ ви не склали та зробили багато тестувань. Чому компілятор не може просто переглянути ваш код і зрозуміти, з якими платформами ваша програма сумісна?
Майкл Новелло

5
Коментоване вище неправильно зрозуміло, чому використовується функція targetSDK. Дивіться мою відповідь нижче для отримання більш детальної інформації.
Стів Хейлі

157
Прийнята відповідь не вірна. Прочитайте відповідь Стіва Х.
tylerl

3
@tylerl Але це не є неправильним, скоріше він посилається на документації Google Android. Я нічого не додав.
Вікас Пацідар

3
Відповідь Карла, на мою думку, є найбільш детальною та точною.
Ілля Коган

Відповіді:


136

android: minSdkVersion

Ціле число, що позначає мінімальний рівень API, необхідний для запуску програми. Система Android не дозволить користувачу встановити додаток, якщо рівень API системи нижче, ніж значення, вказане в цьому атрибуті. Ви завжди повинні декларувати цей атрибут.

android: targetSdkVersion

Ціле число, що позначає рівень API, на який орієнтується додаток.

За допомогою цього набору атрибутів додаток говорить, що він може працювати на старих версіях (аж до minSdkVersion), але був явно перевірений для роботи з вказаною тут версією. Визначення цієї цільової версії дозволяє платформі відключити параметри сумісності, які не потрібні цільовій версії (які в іншому випадку можуть бути включені для підтримки сумісності вперед) або ж включити нові функції, недоступні для старих програм. Це не означає, що ви можете запрограмувати різні функції для різних версій платформи - вона просто інформує платформу, що ви протестували цільову версію, і платформа не повинна виконувати додаткових робіт для підтримки сумісності вперед із цільовою версією.

Для отримання додаткової інформації зверніться до цієї URL-адреси:

http://developer.android.com/guide/topics/manifest/uses-sdk-element.html


За великим рахунком, ви збираєтесь встановити і те саме. Можливо, буде незвичною ситуація, щоб вони встановили різні значення.
jjb

66
Щодо коментаря jjb: я не згоден. Є багато вагомих причин, чому ви могли мати різні minSDK та targetSDK. Дивіться мою відповідь для отримання більш детальної інформації.
Стів Хейлі

871

Коментар, опублікований ОП до питання (в основному вказуючи, що targetSDK не впливає на компіляцію програми), абсолютно помилковий! Вибачте, що тупий.

Коротше кажучи, тут є мета оголосити інший targetSDK від minSDK: Це означає, що ви використовуєте функції SDK вищого рівня, ніж ваш мінімум, але ви забезпечили сумісність назад . Іншими словами, уявіть, що ви хочете використовувати функцію, яка була нещодавно представлена, але вона не є критичною для вашої програми. Потім ви встановите targetSDK на версію, де цю нову функцію було введено, а мінімум на щось нижче, щоб усі могли ще користуватися вашим додатком.

Для прикладу, скажімо, ви пишете додаток, який широко використовує виявлення жестів. Однак кожну команду, яку можна розпізнати жестом, можна виконати також кнопкою або з меню. У цьому випадку жести є «класним додатком», але вони не потрібні. Тому ви встановили цільовий sdk на 7 ("Eclair", коли була введена бібліотека GestureDetection), а minimSDK - на рівень 3 ("Cupcake"), щоб навіть люди з дійсно старими телефонами могли використовувати ваш додаток. Все, що вам потрібно зробити, це переконатися, що ваш додаток перевіряв версію Android, на якій він працював, перш ніж намагатися використовувати бібліотеку жестів, щоб уникнути спроб використовувати його, якщо його не було. (Правда, це датований приклад, оскільки навряд чи хтось досі має телефон v1.5, але був час, коли підтримувався сумісність з v1.

Щоб навести ще один приклад, ви можете скористатися цим, якщо хочете скористатися функцією з пряників чи соти. Деякі люди отримають оновлення незабаром, але багато інших, особливо зі старішим обладнанням, можуть застрягти з Eclair, поки не придбають новий пристрій. Це дозволить вам використовувати деякі цікаві нові функції, але не виключаючи частину вашого можливого ринку.

З блогу розробника Android є дійсно гарна стаття про те, як користуватися цією функцією, і зокрема, як створити код "перевірити функцію, перш ніж її використовувати", який я згадав вище.

До ОП: Я писав це головним чином на користь тому, хто трапляється натрапляти на це питання в майбутньому, оскільки я розумію, що ваше питання було задано давно.


2
Чи можете ви надати точне пояснення, як targetSDKversion впливає на компіляцію програми? Оскільки версія компіляції - це ще одна конфігурація, яку потрібно налаштувати. Дякую заздалегідь
hnviet

9
Я думаю, що Стів переплутався між атрибутом xML android manifest: targetSdkVersion (який не має реального вислову ) і між цільовим властивістю, яке знаходиться у файлі project.properties, що представляє собою те, з чого повинен бути скомпільований код. Скажу ще раз, xml attr targetSdkVersion не має реального значення !!!
AlikElzin-kilaka

3
@kilaka Половина вашого коментаря є дійсною, але друга половина просто неправильна. Я припускав, що хтось використовує однакове значення в XML та project.properties (також доступний через праву клавішу-> властивості в Eclipse), тому ви маєте право вказати, що вони зберігаються в різних місцях. Однак Android Market, безумовно, дбає про те, яке значення ви додаєте в атрибут xml targetSdkVersion. Наприклад, він використовує це, коли визначає, чи повинен ви мати ActionBar або меню сумісності для Honeycomb та вище застосованих програм.
Стів Хейлі

2
@Nate Я не міг сказати, наскільки повільніше цей "згорнутий код" робить час виконання, але я думаю, що розділення та використання декількох APK гірше з точки зору складності коду. Тепер вам потрібно пам’ятати, щоб коментувати / виходити або об'єднуватись через більше гілок у вашому контролі джерела, перш ніж здійснити кожен експорт. На конференції Android в жовтні минулого року вони заявили, що вони представили багатократну систему APK як концесію, але були щасливі, що мало хто її використовує.
Стів Хейлі

2
Але для обробки декількох версій - це те, для чого створені системи управління версіями. Це те, з чим знайомі розробники (більшість програмного забезпечення, мобільне чи ні, випускає трохи різні версії для різних платформ). Ця "функція" для Android не зменшує складність. Це просто підштовхує його до запущеного додатку, і, як свідчить цей потік, створює плутанину. Звичайно, Google буде щасливий, що мало хто користується цим ... що допомагає їм сказати: "Дивіться, ми мали рацію зробити цей упущення в першу чергу". Крім того, деякі не використовують його, оскільки вони ще не знають, що існує.
Нейт

97

Встановлюючи 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 або вище.


Дякуємо за вказівки щодо використання директиви TargetApi.
samir105

@Carl Чи означає це, що я завжди можу встановити targetSdkVersion на будь-яку версію, вищу, ніж мій minSdkVersion (особливо щоб отримати ці покращення інтерфейсу) без необхідності будь-якого тестування ( як такого ), якщо я обмежую свою кодову базу використовувати лише API, доступний у моєму minSdkVersion ?
Damilola Olowookere

Olowookere Еммануель: Якщо я вас правильно зрозумів, то ні, це ще не означає. Як говориться в моїй відповіді, "якщо ви використовуєте будь-які функції, які застаріли на рівні до xx або до нього, код сумісності не буде автоматично застосований версіями ОС на більш високих рівнях API". Отже, якщо ваш код використовує функцію, яка стала доступною, скажімо, на рівні API 8, і ця функція застаріла на рівні 10, то, якщо ви піднімете targetSdkVersion до чого-небудь понад 10, не буде доступний код сумісності, щоб відрегулювати ваше використання ця функція до нового рівня ОС.
Карл

(Продовження): Оскільки, якщо ви залишаєте targetSdkVersion на рівні 8, тоді, поки ви не зможете використовувати функції, запроваджені на вищих рівнях, буде застосований код сумісності, який дозволить вашим використанням функцій рівня 8 працювати під час роботи на більш високі рівні ОС.
Карл

(Продовження): Подумайте про це так: Припустимо, ви написали якийсь код, коли найвищий доступний рівень Android був 8, а ваш targetSdkVersion встановив 8 (тому що це був найвищий рівень на той час). Тепер виходять деякі нові версії Android, а деякі використовувані вами функції рівня 8 стають недоступними. Користувачі, які все ще мають ваш старий APK, не повинні мати помилок, чи не так? Отже, щоб їх не було, код сумісності автоматично застосовується для налаштування старих викликів API, щоб зробити щось розумне, коли вони викликаються, коли користувач працює з новою версією ОС.
Карл

50

Концепція може бути краще представлена ​​на прикладах завжди . У мене виникли проблеми з розумінням цієї концепції, поки я не заглибився у вихідний код Android Framework і не здійснив експерименти, навіть прочитавши всі документи на веб-сайтах розробників Android та пов’язаних з ними потоках stackoverflow. Я поділюсь двома прикладами, які мені дуже допомогли повністю зрозуміти ці поняття.

DatePickerDialog буде виглядати по- різному в залежності від рівня , який ви поклали в targetSDKversion AndroidManifest.xml файлу ( <uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>). Якщо ви встановите значення 10 або менше, ваш DatePickerDialog буде виглядати ліворуч. З іншого боку, якщо ви встановите значення 11 або вище, DatePickerDialog буде виглядати правильно, з таким самим кодом .

Вигляд DatePickerDialog із targetSDKversion 10 або нижче Вигляд DatePickerDialog із targetSDKversion 11 або вище

Код, який я використовував для створення цього зразка, надзвичайно простий. 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.


2
"Ми отримуємо таку користь, як покращення зовнішності із встановленням вищої targetSDKversion, але це несе відповідальність." Якби вони згадували цей рядок у документах, я б його не шукав.
pulp_fiction

@ 김준호 У мене є два питання: 1.) У наведеному вище прикладі вибору дат, якщо ви встановили targetSdkVersion 10 або нижче та запустили додаток на пристрої, на якому працює найновіший Android (наприклад, API 22), вибірка дат все ще відображатиметься як старий на лівій фотографії? 2.) Чи означає це, що я завжди можу встановити targetSdkVersion на будь-яку версію, вищу, ніж мій minSdkVersion (наприклад, щоб отримати такі покращення інтерфейсу, як той хрусткий вибирач дат із більш високих API), без необхідності тестування ( як такої ), якщо я обмежую свою кодову базу використовувати лише API, доступні в моєму minSdkVersion?
Damilola Olowookere

@Olowookere 1) Так. Просто біжи за цим. 2) Ви можете встановити targetSDKVersion будь-яку вподобану вам версію, якщо вона вище, ніж minSDKVersion. Але вам все одно потрібно перевірити, чи добре працює це на цільовій версії. Не має значення, чи дотримуєтесь ви minSDKVersion api чи ні. Пригадайте приклад DatePicker.
김준호

Придумайте випадок, коли ви встановили min-версію 14 та цільову версію sdk на 16, а ви використовували лише apis для 14 чи нижчих версій. Скажіть, ви використовували TextView, який вводиться на рівні api 1. Що буде?
김준호

@ 김준호 Дякую Але за твою другу відповідь я плутаюся. Якщо мій код використовує лише API в minSdkVersion і я націлюю вищий SDK, чому мені потрібно тестувати? Розглядаючи приклад DatePicker, високий targetSdkVersion лише покращив вигляд віджета DatePicker і нічого не зламає, оскільки я не використовував жодного коду в API вище, ніж minSdkVersion. Я хочу лише більш високого targetSdkVersion, тому що я хочу новий вигляд і почуття віджетів, а не те, що я хочу використовувати нові функції, представлені у вищому API
Damilola Olowookere

21

Для тих, хто хоче резюме,

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 не робила великої роботи з її поясненням. Зараз це дуже добре пояснено. Перевірте це тут


"- це максимальна версія, від якої у вас програма успадкувала функції." : це неправильно. Це мінімальна версія, від якої ваш додаток успадкував функції - тобто перша версія, що включає необхідні функції, використовувані вашим додатком.
RichieHH

Англійська мова - хитра мова. Прочитайте мій приклад, поданий у відповіді. Я припускаю, що я маю сенс там. :)
Дарпан

Я не буду педантичним, і англійською мовою є підтримка в цій групі. Хитрість чи не кажучи про те, що "максимальна версія, де додаток підтримує функції", не лише помиляється: її абсолютно 180 градусів неправильно. Саме ПЕРША і мінімальна версія підтримує всі передбачені функції вашої програми без використання резервних режимів / бібліотек сумісності.
RichieHH

9

Якщо у вас є деякі помилки компіляції, наприклад:

<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 дозволяє лише скласти його, але ви запускаєте його на власний ризик.


1
Мене з цим бентежить. Що станеться, якщо пізніше запустити додаток у системі з sdk 10?
Fran Marzoa

Він виконає options.inBitmap і додаток повинен працювати нормально.
NinjaCoder

1

android:minSdkVersionі android:targetSdkVersionобидва є цілим значенням, яке нам потрібно оголосити у файлі маніфесту Android, але обидва мають різні властивості.

android:minSdkVersion:Це мінімально необхідний рівень API для запуску програми для Android. Якщо ми встановимо той самий додаток на нижчій версії API, з’явиться помилка аналізатора, і з’явиться проблема, що не підтримує програму.

android:targetSdkVersion:Версія цільової sdk полягає у встановленні рівня програми для цільового API. якщо цей атрибут не задекларований у маніфесті, версія minSdk буде вашою версією TargetSdk. Це завжди вірно, що "встановлення підтримки додатків у всіх вищих версіях API, які ми оголосили як TargetSdk Version". Щоб зробити програму обмеженою ціллю, нам потрібно оголосити maxSdkVersion у нашому файлі маніфесту ...


0

Якщо ви робите програми, які потребують небезпечних дозволів і встановлюєте targetSDK 23 або вище, ви повинні бути обережними. Якщо ви не перевірите дозволи на час виконання, ви отримаєте SecurityException, і якщо ви використовуєте код всередині пробного блоку, наприклад, відкриту камеру, ви можете виявити помилку, якщо не перевірити logcat.


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