Имеет ли значение ‹uses-sdk› в манифесте для проектов библиотеки Android?

Это все в значительной степени в названии. Хотя я вижу <uses-sdk> во всех примерах AndroidManifest.xml проекта библиотеки, которые я видел, у меня такое ощущение, что это не имеет значения.

На самом деле, я подозреваю, что <uses-permission> тоже не имеет значения, как и все атрибуты <manifest>, кроме package.

Кто-нибудь может подтвердить?


person Andy Dennie    schedule 29.02.2012    source источник
comment
И пока я этим занимаюсь, вопреки тому, что developer.android.com /guide/topics/manifest/ говорит, что это неправда, что manifest.xml ДОЛЖЕН СОДЕРЖАТЬ элемент ‹application› — манифесты проекта библиотеки не нуждаются в этом, если проект библиотеки не содержит приложения.   -  person Andy Dennie    schedule 29.02.2012


Ответы (4)


Начиная с предварительной версии ADT r20 3

Манифесты библиотеки можно объединять с манифестом основного приложения. Это включается в сборке ant, указав свойство

manifestmerger.enabled=true  

[Я не уверен, как включить его в других сборках (например, maven); пожалуйста, прокомментируйте здесь, если вы это понимаете. Я предполагаю, что это преобразуется в аргумент командной строки aapt.]

Различные правила регулируют конфликты и преимущественное поведение.

Что касается поднятых здесь конкретных вопросов (объединение ‹uses-sdk> и ‹uses-permission>), правила для ‹uses-sdk> таковы:

  • minSdkVersion: ошибка, если целевой манифест содержит значение меньше значения lib; оставить целевое значение таким же или большим, чем значение библиотеки, сохранить значение библиотеки в месте назначения, только если там ничего не указано (по умолчанию 1, если не указано ни в одном из них).
  • targetSdkVersion: предупреждение, если целевой манифест содержит значение меньше значения lib; оставьте целевое значение таким же или большим, чем значение библиотеки, сохраните значение библиотеки в месте назначения, только если там ничего не указано (по умолчанию используется объединенное значение minSdkVersion, если оно не указано ни в одном из них).

Правило для ‹uses-permission>: добавьте разрешения библиотеки в место назначения, если их там еще нет. Это нормально, если в обоих случаях одинаковое разрешение.

Если вы используете ADT r20 Preview 2 или более раннюю версию, применяется следующее:

Я создал небольшой проект тестовой библиотеки и тестовое приложение, которое его использует, чтобы самому разобраться в этом. Я предоставил ‹uses-sdk> и ‹uses-permission> в манифесте проекта библиотеки и исключил их оба из манифеста приложения.

В результате значения ‹uses-sdk> и ‹uses-permission> проекта библиотеки НЕ были объединены в приложение во время сборки, о чем свидетельствует проверка установленного приложения на моем устройстве с помощью AppXplore.

Мой тестовый код доступен по адресу https://github.com/adennie/android-library-project-manifest-test.

Я пришел к выводу, что указание ‹uses-sdk> и ‹uses-permission> в манифесте проекта библиотеки Android не влияет на объединенный манифест потребляющего приложения.

person Andy Dennie    schedule 01.05.2012
comment
Я протестировал как ваш образец проекта, так и свой собственный. Я согласен с вами, ‹uses-sdk› в библиотечном проекте — это подробное объявление. - person yorkw; 02.05.2012
comment
Правильно, ничего не делает. Разработчик платформы Android Ксав Дюкроше сообщает об этом в сообщении группы новостей: groups.google.com. /группа/android-разработчики/msg/9db36f18521fca7d - person nmr; 05.05.2012
comment
Справедливости ради, ответ от разработчика Android описывает некоторые варианты использования, в которых вы все еще можете указать значения для этих атрибутов. - person Andy Dennie; 11.05.2012
comment
Используя сборку по умолчанию, предоставленную android-eclipse, я предполагаю, что она включена по умолчанию (по крайней мере, в r21), потому что я продолжаю получать Unable to execute dex: Multiple dex files define Lcom/mypackage/name/Manifest$permission; для разрешения (com.mypackage.name.permission.PERMISSION_NAME), вставленного как в библиотеку, так и в код проекта. Пожалуйста, поправьте меня, если ошибка не имеет значения. - person madlymad; 11.03.2013
comment
@AndyDennie Когда я использую эту строку в своем приложении (использующем библиотеку), весь проект получает ошибки! Что случилось?! - person Dr.jacky; 02.06.2015

возможные варианты использования манифеста в библиотечных проектах:

  1. ты пробовал линт? он может предупредить вас, если ваш проект использует слишком новые классы/методы, которые не могут работать с min-sdk, который вы установили в манифесте. хочешь проверить это? просто нажмите кнопку V-checkbox рядом с диспетчером SDK, как показано здесь: http://tools.android.com/tips/lint/lint-toolbar.png?attredirects=0

  2. манифест может дать другим людям ключ к тому, что требуется для использования проекта.

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

  4. как Google предлагал в прошлом, библиотечные проекты могут иметь некоторое использование манифеста в будущем, будучи объединенными со всеми теми, которые используют библиотечный проект.

Короче говоря, манифест не лишен смысла. это может вам очень помочь.

person android developer    schedule 04.05.2012
comment
Я никогда не говорил, что манифест не имеет смысла для библиотечного проекта. Я сказал, что указывать ‹uses-sdk› и ‹uses-permission› в манифесте библиотечного проекта бессмысленно. - person Andy Dennie; 04.05.2012
comment
Ну, я только что доказал, что оба они не бессмысленны. - person android developer; 05.05.2012
comment
Честно говоря, слово «бессмыслица» было излишним. Я сослался на ваш ответ из моего. - person Andy Dennie; 11.05.2012
comment
да, обратите внимание, что Google считает, что манифесты проектов библиотек должны иметь какое-то поведение слияния с проектами, которые используют . на данный момент они обычно имеют очень небольшую цель, если вообще имеют. - person android developer; 12.05.2012
comment
новое объявление (предварительный просмотр 20 3) теперь поддерживает слияние файлов манифеста для библиотек. больше информации здесь: tools.android.com/download/adt-20-preview - person android developer; 05.06.2012
comment
да, я тоже это заметил. Выглядит интересно. Я обновил свой ответ некоторыми деталями, насколько я мог определить на данный момент. - person Andy Dennie; 05.06.2012

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

Поскольку использование-sdk будет определять версию SDK и т.д..

person Maneesh    schedule 29.02.2012
comment
Но разве информация ‹uses-sdk› из манифеста проекта приложения не имеет значения? - person Andy Dennie; 29.02.2012
comment
да, это содержащий проект, который будет определять использование SDK для своего собственного проекта, а не для библиотеки, но также есть только один файл манифеста для одного проекта. Мало знаю о библиотечных проектах. - person Maneesh; 29.02.2012

Согласно документации , Там написано для <uses-sdk>

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

Предупреждение: Если вы не объявите этот атрибут, система примет значение по умолчанию "1", что указывает на то, что ваше приложение совместимо со всеми версиями Android. Если ваше приложение совместимо не со всеми версиями (например, оно использует API-интерфейсы, представленные на уровне API 3) и вы не объявили правильную версию minSdkVersion, то при установке в системе с уровнем API ниже 3 приложение аварийно завершает работу во время время выполнения при попытке доступа к недоступным API. По этой причине обязательно объявите соответствующий уровень API в атрибуте minSdkVersion.

Атрибут android:maxSdkVersion немного сложен для понимания..doc говорит:

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

И,

Будущие версии Android (помимо Android 2.0.1) больше не будут проверять или применять атрибут maxSdkVersion во время установки или повторной проверки. Однако Google Play продолжит использовать этот атрибут в качестве фильтра при представлении пользователям приложений, доступных для загрузки.

Это предупреждение указывает на отрицательные моменты, которые могут возникнуть, если вы объявите эти атрибуты. Но если вы посмотрите на другую сторону, если вы разрабатываете что-то, что поддерживает какую-то конкретную версию Android, тогда АТРИБУТ наиболее полезен для вы.

Шаг, предпринятый для удаления этого атрибута, заключается в том, чтобы побудить разработчика сделать свое приложение поддерживающим все другие (более новые) версии.

Только если вы разрабатываете с версией 2.0.1^, вы можете сказать Это не нужно писать, но если вы напишете, что Google paly будет использовать это как фильтр для представления пользователя

Итак, мой вывод и совет

используйте элемент <uses-sdk> хотя бы с одним атрибутом android:minSdkVersion

person MKJParekh    schedule 01.05.2012
comment
Спасибо за ваш ответ, однако он, похоже, не затрагивает основной вопрос вопроса, который касается значения ‹uses-sdk› в контексте манифеста библиотечного проекта. - person Andy Dennie; 01.05.2012