Подтвердить что ты не робот

Разница между "Build Target SDK" в Eclipse и Android: targetSdkVersion в AndroidManifest.xml?

Когда я импортирую существующий проект Android в Eclipse, меня попросят выбрать цель сборки SDK как часть процесса.

Зачем мне вводить эту информацию? Как это отличается от значений android:targetSdkVersion/android:minSdkVersion, указанных в AndroidManifest.xml?

Например, в примере приложения Google IO его AndroidManifest говорит android:targetSdkVersion=11, но README говорит, что для проекта Eclipse необходимо настроить уровень API 13 или выше, или будут возникать ошибки компиляции.

4b9b3361

Ответ 1

android:minSdkVersion в файле манифеста означает, что рынок будет фильтровать устройства с более низким уровнем sdk.

target=android-x в файле свойств проекта означает, что Eclipse не позволит использовать методы или классы из sdk выше, чем x. Он покажет ошибки компилятора.

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

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR_MR1)
{
    // here you can use APIs, that appears in Android 2.1
}

Ответ 2

Вот описание каждого атрибута, именно то, что он контролирует, и как вы должны его использовать.

В AndroidManifest.xml:

  • midSdkVersion: используется на рынке Google Play. Самый низкий API, на котором вы сможете запускать свое приложение. Устройства, на которых установлена ​​версия Android старше этого, не будут доступны для установки вашего приложения. Установите для этой версии самую низкую версию Android, которую может поддерживать ваш код (т.е. Он не использует вызовы API, более новые, чем это, не обращая особого внимания на обратную совместимость). Конечно, вы должны протестировать на устройстве или эмуляторе, использующем эту версию.

    Google предоставляет dashboard, дающий вам разбивку количества людей, использующих каждую версию, что может быть полезно при принятии решения о том, чтобы остановить поддержку.

    Примечание. Если вы используете любую из библиотек android-support, вам не следует использовать более старую версию, чем указано в имени библиотеки поддержки. Например, android-support-v4.jar не будет запускаться в версиях Android старше 4.

  • targetSdkVersion: Используется устройствами во время выполнения. Устройства используют это, чтобы решить, следует ли запускать приложение в режиме обратной совместимости. Например, если вы установите это на 10 (Gingerbread) устройства, которые запускают 16 (Jelly Bean), все равно будут использовать визуальный стиль Gingerbread для вашего приложения; например он будет иметь строку заголовка вместо панели действий. Установите это на новейшую версию Android, на которую вы хотите, чтобы ваше приложение выглядело (что вы можете определить только путем тестирования его на более новых версиях, чтобы увидеть, хорошо ли оно выглядит и хорошо себя ведет).

В project.properties или установите через Eclipse Project Build Target значение:

  • target: Используется вашим компьютером во время компиляции. Версия Android, с которой связано ваше приложение. Попытка использовать функции API, более новые, чем это приведет к ошибке. Вы должны установить его так же, как minSdkVersion, если вы не делаете особых действий для обратной совместимости (см. Ниже), чтобы компилятор не позволял вам случайно использовать функции, которые не существуют на старых устройствах ваших пользователей (что приводит к авария).

    Примечание. Для проектов библиотек, которые вы включили, требуется минимум для этого значения. Например, android-support-v7-appcompat содержит файлы ресурсов .xml в res/layout-v14, которые требуют от вас компиляции против API 14 или новее.

Заметка о обратной совместимости:

Существует случай, когда project.properties должен быть выше minSdkVersion: если вы хотите использовать новые функции API, но вы включаете специальный код для обратной совместимости, чтобы он мог работать на старых устройствах. В этом случае вам придется bump project.properties до совпадения с самым старым API, который содержит все функции, которые вы используете.

По возможности используйте Android Support Libraries, чтобы выполнить обратную совместимость, потому что она обычна, хорошо протестирована, проста и позволяет вам выйти project.properties один. Однако иногда библиотеки поддержки не соответствуют вашим потребностям, и в этом случае вам придется использовать такие методы, как this или эти

Ответ 3

В основе вашего вопроса лежит вопрос: какова связь между значением targetSdkVersion, объявленным в манифесте проекта, и целевой объект сборки проекта, выбранный в диалоговом окне Project/Properties/Android для проекта в Eclipse, который выбирает уровень SDK против которое ваше приложение скомпилировано?

Значение minSdkVersion является отвлечением от вашего вопроса; это должно быть меньше или равно targetSdkVersion, но оно напрямую не связано с Project Build Target. Связь между targetSdkVersion и Project Build Target.

После тщательного рассмотрения (вы должны судить сами, имею ли я это право), я пришел к выводу, что targetSdkVersion и Project Build Target всегда должны быть установлены на один и тот же уровень API. Мое рассуждение состоит из двух частей.

** Во-первых, я буду утверждать, что Project Build Target никогда не должна быть ниже, чем targetSdkVersion:

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

Поскольку вы явно хотите получить доступ к некоторым функциям, которые были впервые введены на уровне API targetSdkVersion, имеет смысл, что вы настроили Project Build Target равным тому же уровню API, который указан в вашей целевойSdkVersion. В противном случае API, с которым вы компилируете, не будет включать в себя функции API, которые были причиной настройки targetSdkVersion на выбранный вами уровень.

Итак, очевидно, что вы не хотели бы устанавливать свою цель сборки проекта ниже, чем ваша targetSdkVersion. Но вы когда-нибудь захотите установить его выше? Это приводит нас к второй части аргумента:

** Во-вторых, я буду утверждать, что цель сборки проекта никогда не должна превышать targetSdkVersion:

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

Теперь, если ваше приложение было совершено, чтобы обнаружить такие отсутствующие функции и обработать их отсутствие, это будет оправдывать настройку targetSdkLevel на уровень Project Build Target, так как это именно то значение targetSdkLevel (что вы чтобы обнаруживать и работать с любыми функциями API, присутствующими в вашем targetSdkLevel, но не присутствовать на вашем minSdkLevel), поэтому, если вы это делаете, то нет причин не устанавливать ваш targetSdkLevel на самый высокий уровень, который вы поддерживаете в своем коде в этом (то есть до уровня целевой сборки проекта).

[OK, я только что нашел "причину", чтобы установить уровень сборки проекта выше целевого уровняSdkLevel. Стандартная мягкая клавиатура для уровня API 16 и выше работает неправильно (его обратный пробел работает не так), и поэтому я переместил мой targetSdkLevel на 15, чтобы клавиатура исчезла. Я мог бы изменить свою цель сборки проекта на 15, но я этого не сделал, потому что мне нужен последний код, по теории, что в последнее время, как правило, "улучшено" и, следовательно, "лучше". Это, пожалуй, суеверно. Несмотря на это исключение, приведенные выше аргументы, как правило, действительны.]

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

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

Это, по-видимому, предполагает, что вы должны скомпилировать проект Project Build Target, равный minSdkVersion, а не targetSdkVersion, вопреки тому, о чем я говорил выше. Я привел аргументы в пользу использования targetSdkVersion вместо этого. В частности, если вы пытаетесь использовать функции, присутствующие в targetSdkVersion, но не в minSdkVersion, как вы сможете это сделать, если вы компилируете vs minSdkVersion? Конечно, ваше приложение будет работать на minSdkVersion, потому что вы будете тестировать доступность этих функций (например, через отражение), но у вас не будет таких новых новых элементов API, даже если ваше приложение работает на последних версии Android, если вы скомпилируете с минимальным уровнем SDS SDK.

Таким образом, Project Build Target всегда должна быть такой же, как targetSdkVersion; это мой аргумент. Я не мог найти ни одного материала, который бы объяснял эти отношения с какой-либо ясностью, поэтому вышеупомянутое выведено мной и не подкреплено каким-либо авторитетным источником, и на самом деле приведенная выше цитата из официального источника противоречит моей позиции; поэтому комментарии приветствуются и желательны.

Ответ 4

AFAIK, android:minSdkVersion и тот, который Eclipse запрашивает при выборе проекта, один и тот же. Тем не менее, android:targetSdkVersion - это то место, где вы хотите, чтобы ваше приложение предназначалось для конкретной Android-версии Android, доступной на рынке.

Например, у вас может быть ваш android:minSdkVersion="8" (тот, который Eclipse запрашивает при настройке вашего проекта), потому что вы хотите, чтобы ваше приложение запускалось на устройствах с Froyo (наряду с более высокими версиями Android), Но вы можете захотеть, чтобы ваше приложение действительно предназначалось для пользователей GingerBread или пользователей HoneyComb или пользователей ICS.

РЕДАКТИРОВАТЬ: Пожалуйста, имейте в виду, что ваш targetSdkVersion должен быть равен или больше, чем minSdkVersion. В противном случае это не имеет особого смысла.

Ответ 5

Я не говорю, что цель сборки Eclipse должна быть установлена ​​на что-то меньшее чем minSdkVersion. Я спрашиваю, почему Eclipse автоматически не использует либо minSdkVersion, либо targetSdkVersion в качестве целевого SDK для построения вместо. Почему вы когда-нибудь захотите установить что-то другое?

назовите это функцией. eclipse не предназначен исключительно для Android. если бы никто не думал о добавлении автоматизма к использованию версии sdk, указанной в манифесте, тогда затмение просто не сделает этого. Я не думаю, что за этим много волшебства. Я думаю, что он еще не был добавлен к плану eclipse/android для функций eclipse.

также, так как вы всегда можете изменить версию sdk, указанную в манифесте, имеет смысл также быть гибким в eclipse (вы всегда можете изменить цель eclipse sdk с помощью свойств вашего проекта). как и другие опубликованные, бывают случаи, когда манифест sdk может отличаться от eclipse sdk. (поддержка multi sdk-версии). используя нижний, тогда min-sdk в манифесте не имеет никакого смысла, но здесь получается: если никто еще не написал чекер для плагина eclipse, который проверяет, имеет ли смысл то, что вы делаете, тогда это просто будет возможно.

Ответ 6

Ребята, я провел некоторое тестирование на них и нашел ниже ответ:

minSDKVersion - приложение не будет работать ниже этого sdk

targatSDKVersion - среда выполнения приложения. Для ex-приложения у вас есть последний SDK в устройстве, скажем 21, но вы устанавливаете целевую версию sdk 19, это означает       при запуске приложения на этом устройстве время выполнения (темы и другие пользовательские интерфейсы/классы) будет равно 19.

Project Build Target. Когда вы выбираете целевую версию сборки проекта, это означает, что вы apk или классы будут скомпилированы в соответствии с выбранным sdk.       например, если вы выбираете цель построения проекта 16 и пытаетесь использовать anotation @JavaScriptInterface, она не будет найдена, потому что эта анотация доступна в       выше этой цели.

maxSDKVersion. Это означает, что приложение не будет устанавливать выше, чем sdk.

Ответ 7

Каждая версия Android назначается для android: targetSdkVersion. Более высокая версия проекта не может работать на более низкой версии эмулятора, но возможно наоборот. убедитесь, что ваш sdk обновлен и попробуйте изменить проект на соответствующую версию