В моем проекте есть 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.
Как я могу решить эту проблему с повторением?
Вы, конечно, можете контролировать, как объединить ресурс, и можете избежать такого повторения, используя основную папку, проверьте документ здесь, вас может заинтересовать 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 Я отклонил вашу правку, потому что, хотя все, что вы написали, было правдой, я считаю, что это также было ненужным. В приведенной вами ссылке четко указано Это поведение по умолчанию для элементов. В целом, я думаю, что слияние манифестов было разработано для обработки общих случаев без явных инструкций.