Android - Как избежать повторения в нескольких файлах манифеста?

В моем проекте есть 3 файла манифеста:

flavour/AndroidManifest.xml
flavourDebug/AndroidManifest.xml
flavourRelease/AndroidManifest.xml

Вот аромат / AndroidManifest.xml:

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

    <uses-permission android:name = "android.permission.READ_CONTACTS" />
</manifest>

Вот flavourDebug / AndroidManifest.xml:

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

    <application android:name = "com.domain.android.MyApplication"
        android:allowBackup = "false"
        android:label = "@string/app_name"
        android:logo = "@drawable/ic_logo"
        android:theme = "@style/Theme.CustomActionBarStyle"
        android:networkSecurityConfig = "@xml/network_security_config"
        tools:replace = "theme">

        // Activity definitions in here

     </application>
</manifest>

Вот flavourRelease / AndroidManifest.xml:

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

    <application android:name = "com.domain.android.MyApplication"
        android:allowBackup = "false"
        android:label = "@string/app_name"
        android:logo = "@drawable/ic_logo"
        android:theme = "@style/Theme.CustomActionBarStyle"
        tools:replace = "theme">

        // Activity definitions in here (these are the EXACT SAME as the ones in flavourDebug/AndroidManifest.xml)

     </application>
</manifest>

Как видите, единственная разница между манифестами отладки и выпуска состоит в том, что в первом выпуске отсутствует android:networkSecurityConfig.

Кроме того, часть // Activity definitions in here точно такая же. Я хочу избежать повторения этого действия. Каждый раз, когда нам нужно что-то изменить в определении Activity (или добавить новое Activity), мы должны сделать это в двух файлах манифеста (Debug и Release).

У меня возникла идея поместить все в основной файл AndroidManifest.xml. Проблема в том, что я бы не смог добавить android:networkSecurityConfig = "@xml/network_security_config"только для отладочных сборок.

В макетах Android эта проблема решается с помощью тега <include>. К сожалению, это недоступно в Manifest.

Как я могу решить эту проблему с повторением?

9
0
705
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ответ принят как подходящий

Вы определенно можете поместить общую часть в flavour/AndroidManifest.xml, а дополнительный атрибут в flavourDebug/AndroidManifest.xml (и указанный xml-файл в каталоге src/flavourDebug/res/xml):

<application
    android:networkSecurityConfig = "@xml/network_security_config" />

Когда вы добавляете атрибут, он должен работать из коробки, без настройки правил слияния (tools:node = "merge" является поведением по умолчанию для большинства элементов).

С Android Studio 3.1 (и, возможно, более ранними версиями) вы можете просмотреть окончательный манифест, а также указать, откуда берется каждый атрибут или элемент, на вкладке Объединенный манифест редактора.

@ parekhkruti26 Я отклонил вашу правку, потому что, хотя все, что вы написали, было правдой, я считаю, что это также было ненужным. В приведенной вами ссылке четко указано Это поведение по умолчанию для элементов. В целом, я думаю, что слияние манифестов было разработано для обработки общих случаев без явных инструкций.

bwt 09.04.2018 11:33

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