Манифест Android-оболочки/подмодуля Gradle объединяется с манифестом основного модуля

У меня есть следующие модули внутри моего проекта, для которых я не могу заставить Gradle правильно объединить манифесты Android:

myproject_alpha
myproject_beta
myproject_lib
myproject_release

Модуль *_lib — это основной модуль проекта, содержащий весь исходный код. Остальные 3 модуля представляют собой «модули-оболочки», которые вносят небольшие изменения в параметр «полномочия» поставщиков контента, изменяют поле «данные» внутри фильтра намерения действия, указанного в манифесте модуля *_lib, а также включают некоторые другие действия, отсутствующие в модуль myproject_release.

В настоящее время у меня есть ошибки слияния манифеста Android между альфа-версией (или бета-версией, или выпуском) и lib. Например, между lib и alpha я вижу следующие 2 ошибки gradle:

Trying to merge incompatible /manifest/application/provider[@name=com.myproject.contentprovider.MyProvider] element:
  <provider
--    @android:authorities="com.myproject.alpha.provider"
  <provider
++    @android:authorities="com.myproject.lib.provider"

:myproject_alpha:processDebugManifest FAILED

Trying to merge incompatible /manifest/application/activity[@name=com.myproject.activity.LoginActivity] element:
  <activity
  @android:name="com.myproject.activity.LoginActivity"
          @android:name="android.intent.action.MAIN">
          @android:name="android.intent.category.LAUNCHER">
  <intent-filter>
          @android:name="android.intent.action.VIEW">
          @android:name="android.intent.category.BROWSABLE">
          @android:name="android.intent.category.DEFAULT">
      <data
--            @android:host="myhost.test.com"
  <activity
  @android:name="com.myproject.LoginActivity"
          @android:name="android.intent.action.MAIN">
          @android:name="android.intent.category.LAUNCHER">
  <intent-filter>
          @android:name="android.intent.action.VIEW">
          @android:name="android.intent.category.BROWSABLE">
          @android:name="android.intent.category.DEFAULT">
      <data
++            @android:host="myhost.com"

:myproject_alpha:processDebugManifest FAILED

Единственный подобный вопрос, который я нашел, был
Gradle: как объединить файлы манифеста Android для разных типов сборки, которым требуется одно и то же действие, но с разными фильтрами намерений. Однако на самом деле это не соответствует моей проблеме, потому что в моем случае «lib» и «alpha» являются взаимозависимыми модулями, а не разными сборками. Буду признателен за отзыв.


person cavega    schedule 20.01.2014    source источник


Ответы (3)


Если вы изучите класс, который объединяет манифесты, вы увидите, что метод mergeNewOrEqual() недостаточно умен для объединения неидентичных элементов. К сожалению, это метод, который используется для объединения поставщиков и действий.

Таким образом, единственным «решением» было бы либо определить элементы только в одном месте, либо дать им одинаковые подписи в обоих определениях.

person Krylez    schedule 20.01.2014
comment
Спасибо за ссылку, было полезно. Мы унаследовали код от сторонней команды, поэтому не уверены, что они когда-либо получали код для сборки в том виде, в котором он есть. На данный момент я отредактировал все манифесты, чтобы использовать одни и те же подписи, и в будущем выпуске я реструктурирую кодовую базу, чтобы лучше использовать gradle. - person cavega; 23.01.2014

У меня есть проблемы с ответом выше, когда я компилирую, я всегда получаю сообщение

Недопустимая инструкция «объединить». Допустимые инструкции: УДАЛИТЬ, ЗАМЕНИТЬ, СТРОГО.

Мне удалось импортировать инструменты, как в ответе @swooby, а затем добавить tools:node="merge" в тег <activity> для запускаемой активности, которую я хочу заменить, а затем добавить

<intent-filter tools:node="remove">
                <action android:name="android.intent.action.MAIN"/>

в панель запуска Activity, что я не хочу иметь значок запуска

Надеюсь это поможет.

person AllDayAmazing    schedule 28.04.2015
comment
Спасибо за обновление. Предыдущее решение, должно быть, немного сгнило. Я убедился, что это работает, как я ожидаю, в обоих вариантах продукта, для которых я его использую, проверив сгенерированный промежуточный манифест. - person Oded; 16.09.2016

Объявите заголовок вашего манифеста следующим образом:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

Затем используйте один из следующих соответствующих атрибутов для любого действия, псевдонима действия, службы, получателя или элемента поставщика, которые вы хотите объединить:

tools:merge="override"
tools:merge="remove"

Эта информация была получена из:
https://android.googlesource.com/platform/tools/base/+/idea133/build-system/manifest-merger/src/main/java/com/android/manifmerger/ManifestMerger.java

person swooby    schedule 25.02.2014
comment
Пожалуйста, объясните, не работает. Как выглядит объединенный манифест? Пожалуйста, предоставьте копию субманифеста и суперманифеста. - person swooby; 08.03.2014
comment
Будет сказано: Попытка объединить несовместимый элемент /manifest/application/activity[@name=#provider#]: - person Alvaro Ardila; 08.03.2014
comment
Какой тип элемента вы пытаетесь объединить? Пожалуйста, предоставьте фрагмент ваших манифестов. - person swooby; 15.03.2014
comment
Ваше решение не работает: ‹Активность android:name=.MainActivity android:uiOptions=splitActionBarWhenNarrow tools:merge=override › Я хочу объединить android:uiOptions, ошибка не удалась - person muyiou; 20.05.2014