Ошибка слияния манифеста при использовании динамических функций и вариантов сборки
С динамическими функциональными модулями можно определить в AndroidManifest.xml
Модуль должен быть предустановлен:
<dist:module
...
dist:onDemand="false"
dist:title="@string/title_shop">
....
</dist:module>
или нет:
<dist:module
...
dist:onDemand="true"
dist:title="@string/title_shop">
....
</dist:module>
У меня есть два варианта сборки в моем проекте. Модуль должен быть предустановлен в одном варианте, но не в другом.
Идея состоит в том, чтобы иметь этот по умолчанию AndroidManifest.xml
в main
исходный набор:
<dist:module
...
dist:onDemand="true"
dist:title="@string/title_shop">
....
</dist:module>
Для сборочных версий, в которых должен быть предварительно установлен модуль - я создаю AndroidManifest.xml
файл, который переопределяет, что dist:onDemand
собственность на false
:
<dist:module
...
tools:replace="dist:onDemand"
dist:onDemand="false"
...
</dist:module>
К сожалению, это не работает. Слияние манифестов завершается с ошибками:
Ошибки объединения: Ошибка: инструменты: заменить указанное в строке:11 для атрибута dist:onDemand, но новое значение не указано в манифесте магазина, строка 10 Ошибка: проверка не пройдена, выход из манифеста магазина.
У кого-нибудь есть идеи, что тут не так?
1 ответ
Этот ответ сработал для меня. Идея состоит в том, чтобы иметь две копии AndroidManifest.xml, которые идентичны, за исключением
<dist:module
...
tools:node="replace"
dist:onDemand="false">
...
</dist:module>
который заменяет весь элемент.
Инструмент слияния манифеста объединяет все элементы XML из каждого файла, следуя некоторой эвристике слияния. Если инструмент слияния обнаружит, что оба манифеста содержат один и тот же атрибут с разными значениями, возникает конфликт слияния.
Документы: https://developer.android.com/studio/build/manifest-merge
Чтобы расширить ответ Селаено
Если бы я попытался просто debug
а также release
(или каковы бы ни были ваши два типа сборки) AndroidManifests, которые были полными и точными копиями, за исключением изменений в dist:onDemand
линия. Это не сработало. Грейдл кричал мне о пропавшемsrc/main/AndroidManifest.xml
. Итак, я фактически создал три файла:
- главный
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
package="com.example.somefeature">
<application ...>
<activity
android:name=...
</activity>
</application>
<!-- NO dist:module block -->
</manifest>
отлаживать
<dist:module dist:instant="false" dist:title="@string/somefeature"> <dist:delivery> <dist:install-time /> </dist:delivery> <dist:fusing dist:include="true" /> </dist:module>
релиз
<dist:module dist:instant="false" dist:title="@string/somefeature"> <dist:delivery> <dist:on-demand /> </dist:delivery> <dist:fusing dist:include="true" /> </dist:module>