Ошибка слияния манифеста при использовании динамических функций и вариантов сборки

С динамическими функциональными модулями можно определить в 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. Итак, я фактически создал три файла:

  1. главный
<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>
  1. отлаживать

    <dist:module
        dist:instant="false"
        dist:title="@string/somefeature">
        <dist:delivery>
            <dist:install-time />
        </dist:delivery>
        <dist:fusing dist:include="true" />
    </dist:module>
    

  2. релиз

    <dist:module
        dist:instant="false"
        dist:title="@string/somefeature">
        <dist:delivery>
            <dist:on-demand />
        </dist:delivery>
        <dist:fusing dist:include="true" />
    </dist:module>
    

Другие вопросы по тегам