Минимальная версия Android SDK против целевой версии SDK

442

Когда речь заходит о разработке приложений для Android, в чем разница между версией Min и Target SDK? Eclipse не позволит мне создать новый проект, если версии Min и Target не совпадают!

Майкл Новелло
источник
1
Из того, что я читаю, похоже, что версия Target SDK не влияет на то, как компилируется ваше приложение. Он просто сообщает устройству, на котором запущено приложение, что ему не нужно включать какие-либо специальные функции совместимости для правильной работы приложения. Это правильно? Мне кажется, что вы не знаете, какая у вас целевая версия SDK, пока ПОСЛЕ того, как вы скомпилировали и провели много испытаний. Почему компилятор не может просто посмотреть на ваш код и выяснить, с какими платформами ваше приложение совместимо само по себе?
Майкл Новелло
5
Комментатор выше неправильно понял, почему кто-то использует функцию targetSDK. Смотрите мой ответ ниже для более подробной информации.
Стив Хейли,
157
Принятый ответ не верен. Пожалуйста, прочитайте ответ Стива Х.
Тайлер
3
@tylerl Но это не так, скорее, это относится к документации Google Android. Я ничего не добавил.
Викас Патидар
3
Ответ Карла самый подробный и точный на мой взгляд.
Илья Коган

Ответы:

136

андроид: minSdkVersion

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

андроид: 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), а минимальный SDK - на уровень 3 («Cupcake»), чтобы даже люди с очень старыми телефонами могли использовать ваше приложение. Все, что вам нужно сделать, это убедиться, что ваше приложение проверило версию Android, на которой оно работало, прежде чем пытаться использовать библиотеку жестов, чтобы не пытаться использовать ее, если она не существует. (Правда, это устаревший пример, поскольку вряд ли у кого-то еще есть телефон v1.5, но было время, когда поддерживалась совместимость с v1.

Чтобы привести другой пример, вы можете использовать это, если вы хотите использовать функцию от Gingerbread или Honeycomb. Некоторые люди получат обновления в ближайшее время, но многие другие, особенно со старым оборудованием, могут застрять в Eclair, пока не купят новое устройство. Это позволило бы вам использовать некоторые интересные новые функции, но не исключая часть вашего возможного рынка.

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

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

Стив Хейли
источник
2
Не могли бы вы дать точное объяснение того, как targetSDKversion влияет на компиляцию приложения? Потому что версия компиляции - это еще одна конфигурация, которую вам нужно настроить. Заранее
спасибо
9
Я думаю, что Стив запутался между атрибутом manifest xml android: targetSdkVersion (который не имеет реального права голоса) и между целевым свойством, которое находится в файле project.properties, который представляет собой то, что должно компилироваться в коде. Скажу еще раз, xml attr targetSdkVersion не имеет реального значения !!!
Алик Эльзин-килака
3
@kilaka Половина вашего комментария действительна, а другая половина просто неверна. Я предполагал, что кто-то использует одно и то же значение в XML и project.properties (также доступно через щелчок правой кнопкой мыши -> свойства в Eclipse), поэтому вы правы, указав, что они хранятся в разных местах. Однако Android Market наверняка заботится о том, какое значение вы указываете в атрибуте xml targetSdkVersion. Например, он использует это при определении, нужно ли вам иметь ActionBar или меню совместимости для приложений сота и выше.
Стив Хейли
2
@Nate Я не могу сказать, насколько медленнее этот «запутанный код» делает среду выполнения, но я думаю, что разделение и использование нескольких APK хуже с точки зрения сложности кода. Теперь вы должны помнить, что нужно комментировать вход / выход или объединять больше веток в вашем контроле исходного кода, прежде чем вы сможете выполнить каждый экспорт. Когда в октябре прошлого года на конференции по Android они сказали, что представили систему множественного APK в качестве уступки, но были рады, что ее использовали очень немногие.
Стив Хейли
2
Но обработка нескольких версий - это то, для чего созданы системы контроля версий. Это то, что разработчики знакомы (большинство программного обеспечения, мобильное или нет, выпускает несколько разные версии для разных платформ). Эта Android-функция не уменьшает сложность. Он просто толкает его в работающее приложение и, как свидетельствует этот поток, создает путаницу. Конечно, Google будет рад, что мало кто его использует ... это помогает им сказать: «Понимаете, мы были правы, сделав это упущение в первую очередь». Плюс, некоторые не используют это, потому что они еще не знают, что это существует.
Nate
97

Когда вы устанавливаете targetSdkVersion = "xx", вы подтверждаете, что ваше приложение работает должным образом (например, было тщательно и успешно протестировано) на уровне API xx.

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

И наоборот, если вы используете какие-либо функции, которые устарели на уровне или до уровня xx, код совместимости не будет автоматически применяться версиями ОС на более высоких уровнях API (которые больше не включают эти функции) для поддержки этих применений. В этой ситуации, ваш собственный код должен иметь специальные положения регистра , которые проверяют уровень API и, если уровень OS обнаружен более высокий один , который больше не имеет данная функция 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 или выше, предполагается, что вы воспользовались функциями, представленными на этом уровне, которые заменяют выделенную кнопку меню (например, например, панель действий), или что вы иным образом обошли необходимость иметь кнопку системного меню; следовательно, трехточечное меню «кнопка совместимости» исчезает. В этом случае, если пользователь не может найти кнопку меню, он не может нажать ее, и это, в свою очередь, означает, что переопределение onCreateOptionsMenu (меню) вашей деятельности может никогда не быть вызвано, что, в свою очередь, означает, что значительная часть функциональности вашего приложения может быть лишена его пользовательского интерфейса. Если, конечно, вы не внедрили панель действий или другие альтернативные средства для доступа пользователей к этим функциям. Если кнопка меню не найдена, она не может нажать ее, а это, в свою очередь, означает, что переопределение onCreateOptionsMenu (меню) вашей активности может никогда не быть вызвано, что, в свою очередь, означает, что значительная часть функциональности вашего приложения может быть лишен своего пользовательского интерфейса. Если, конечно, вы не внедрили панель действий или другие альтернативные средства для доступа пользователей к этим функциям. Если кнопка меню не найдена, она не может нажать ее, а это, в свою очередь, означает, что переопределение onCreateOptionsMenu (меню) вашей активности может никогда не быть вызвано, что, в свою очередь, означает, что значительная часть функциональности вашего приложения может быть лишен своего пользовательского интерфейса. Если, конечно, вы не внедрили панель действий или другие альтернативные средства для доступа пользователей к этим функциям.

minSdkVersion, напротив, устанавливает требование, чтобы версия ОС устройства имела как минимум этот уровень API для запуска вашего приложения. Это влияет на то, какие устройства могут видеть и загружать ваше приложение, когда оно находится в магазине приложений Google Play (и, возможно, в других магазинах приложений). Это способ заявить, что ваше приложение опирается на функции ОС (API или других), которые были установлены на этом уровне, и не имеет приемлемого способа справиться с отсутствием этих функций.

Примером использования minSdkVersion для обеспечения наличия функции, не связанной с API, может быть установка minSdkVersion на 8, чтобы гарантировать, что ваше приложение будет работать только на JIT-версии интерпретатора Dalvik (поскольку JIT был представлен интерпретатору Android на уровне API 8). Поскольку производительность интерпретатора с поддержкой JIT может в пять раз превышать производительность одного из них, у которого отсутствует эта функция, если ваше приложение интенсивно использует процессор, вам может потребоваться API уровня 8 или выше для обеспечения адекватной производительности.

деревенщина
источник
Спасибо за инструкции по использованию директивы TargetApi.
samir105
@Carl Означает ли это, что я всегда могу установить targetSdkVersion на любую версию выше, чем у моего minSdkVersion (особенно для получения этих улучшений пользовательского интерфейса) без необходимости какого-либо тестирования ( как такового ), пока я ограничиваю свою кодовую базу для использования только API, доступных в моем minSdkVersion ?
Дамилола Оловукер
Оловуокере Эммануэль: Если я вас правильно понимаю, то нет, это не значит. Как говорится в моем ответе, «если вы используете какие-либо функции, которые устарели на уровне или до уровня xx, код совместимости не будет автоматически применяться версиями ОС на более высоких уровнях API». Поэтому, если в вашем коде используется функция, которая стала доступна, скажем, на уровне API 8, а эта функция устарела на уровне 10, то, если вы повысите свой targetSdkVersion до уровня выше 10, не будет никакого кода совместимости для настройки использования вами. эта функция на новый уровень ОС.
Карл
(Продолжение): Принимая во внимание, что если вы оставите свой targetSdkVersion на уровне 8, тогда, хотя вы не сможете использовать функции, представленные на более высоких уровнях, будет применяться код совместимости, позволяющий использовать функции уровня 8 при работе на более высокие уровни ОС.
Карл
(Продолжение): Подумайте об этом так: предположим, что вы написали некоторый код, когда самый высокий доступный уровень Android был 8, и вы установили свой targetSdkVersion равным 8 (потому что это был самый высокий уровень в то время). Теперь выходит несколько новых выпусков Android, а некоторые функции 8-го уровня, которые вы использовали, становятся недоступными. Пользователи, у которых все еще есть ваш старый APK, не должны испытывать ошибки, не так ли? Таким образом, чтобы гарантировать, что они этого не делают, автоматически применяется код совместимости, чтобы настроить ваши старые вызовы API, чтобы они выполняли что-то разумное, когда они вызываются, когда пользователь запускает более новую версию ОС.
Карл
50

Идея может быть лучше представлена ​​на примерах, всегда . У меня были проблемы с пониманием этой концепции, пока я не копался в исходном коде фреймворка Android и не провел несколько экспериментов, даже после прочтения всех документов на сайтах разработчиков 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 . Это идет как:

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 должны вызываться в главном потоке, и если нет, система времени выполнения выдает a 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,

РЕДАКТИРОВАТЬ: отказ от ответственности. Конструктор DatePickerDialog, который устанавливает различные темы на основе текущего targetSDKversion (который я показал выше), фактически был изменен в последующем коммите . Тем не менее, я использовал этот пример, потому что логика не изменилась, и этот фрагмент кода ясно демонстрирует концепцию targetSDKversion.

김준호
источник
2
«Мы получаем выгоду, например, улучшение внешнего вида, устанавливая более высокий уровень targetSDKversion, но это идет с ответственностью». Если бы они упомянули эту строку в документах, я бы не стал ее искать.
pulp_fiction
@ 김준호 У меня есть два вопроса: 1.) В приведенном выше примере выбора даты, если вы установили targetSdkVersion на 10 или ниже и запустили приложение на устройстве с последней версией Android (например, API 22), будет ли средство выбора даты по-прежнему отображаться как старое на левой картинке? 2. Означает ли это, что я всегда могу установить targetSdkVersion на любую версию выше, чем у моего minSdkVersion (например, чтобы получить такие улучшения пользовательского интерфейса, как этот хрустящий указатель даты из более высоких API) без необходимости какого-либо тестирования ( как такового ), пока я ограничиваю свою базу кода использовать только API, доступные в моем minSdkVersion?
Дамилола Оловукер
@Olowookere 1) Да. Просто беги за этим. 2) Вы можете установить targetSDKVersion любой версией, которая вам нравится, если она выше, чем minSDKVersion. Но вам все еще нужно проверить, работает ли он нормально на целевой версии. Неважно, придерживаетесь ли вы minSDKVersion API или нет. Вспомните пример DatePicker.
김준호
Вспомните случай, когда вы установили минимальную версию 14 и целевую версию SDK на 16, и вы использовали apis только для 14 или ниже. Скажем, вы использовали TextView, который представлен на уровне API 1. Что произойдет?
김준호
@ 김준호 Спасибо. Но для вашего второго ответа я в замешательстве. Если мой код использует только API в minSdkVersion и я нацеливаюсь на более высокий SDK, зачем мне тестировать? Думая о примере DatePicker, high targetSdkVersion только улучшил внешний вид виджета DatePicker, и ничего не сломалось, потому что я не использовал какой-либо код в API выше minSdkVersion. Я хочу только более высокую цель targetSdkVersion, потому что я хочу новый вид и ощущение виджетов, а не то, что я хочу использовать новые функции, представленные в более высоком API
Damilola Olowookere
21

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

android:minSdkVersion

минимальная версия, пока ваше приложение не поддерживает. Если на вашем устройстве установлена ​​более низкая версия Android, приложение не будет установлено.

пока,

android:targetSdkVersion

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

Ваше приложение будет по-прежнему работать на версиях Android выше, чем указано, targetSdkVersionно сработает совместимость с Android.

Халява -

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 Development Tools (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 просто позволяет вам скомпилировать его, но вы делаете это на свой страх и риск.

WindRider
источник
1
Я смущен по этому поводу. Что произойдет, если вы позже запустите свое приложение в системе с SDK 10?
Фран Марсоа
Он будет работать с оператором options.inBitmap, и приложение должно работать нормально.
NinjaCoder
1

android:minSdkVersionи android:targetSdkVersionоба являются целочисленными значениями, которые мы должны объявить в файле манифеста Android, но оба имеют разные свойства.

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

android:targetSdkVersion:Target sdk version - установить уровень API приложения Target. если этот атрибут не объявлен в манифесте, версия minSdk будет вашей версией TargetSdk. Это всегда верно, что «установка поддержки приложения на все более высокие версии API мы объявили как TargetSdk Version». Чтобы сделать приложение ограниченным, нам нужно объявить maxSdkVersion в нашем файле манифеста ...

Навин Кант Мишра
источник
0

Если вы создаете приложения, для которых требуются опасные разрешения, и для targetSDK установлено значение 23 или выше, вам следует быть осторожным. Если вы не проверяете разрешения во время выполнения, вы получите исключение SecurityException, и если вы используете код внутри блока try, например, открытой камеры, может быть трудно обнаружить ошибку, если вы не проверите logcat.

фракийский
источник
0

Target sdk - это версия, на которую вы хотите нацелиться, а min sdk - минимальная.

Адитья Савант
источник