File APK Anda hanya bisa berisi satu file
AndroidManifest.xml, namun proyek Android Studio dapat berisi
beberapa—yang disediakan oleh set sumber utama, varian versi, dan pustaka
yang diimpor. Jadi saat membangun aplikasi, versi Gradle akan menggabung
semua file manifes ke dalam satu file manifes tunggal yang dipaketkan
ke dalam APK Anda.
Alat bantu penggabung manifes mengombinasikan semua elemen XML dari setiap file dengan mengikuti beberapa heuristik penggabungan dan dengan mematuhi preferensi penggabungan yang telah Anda definisikan dengan atribut XML khusus. Laman ini menjelaskan cara kerja penggabungan manifes dan cara menerapkan preferensi penggabungan untuk mengatasi konflik penggabungan.
Tip: Gunakan tampilan Merged Manifest untuk pratinjau hasil manifes gabungan dan menemukan kesalahan konflik.
Prioritas penggabungan
Alat bantu penggabung akan mengombinasikan semua file manifes ke dalam satu file dengan menggabungkannya secara berurutan berdasarkan prioritas setiap file manifes. Misalnya, jika Anda memiliki tiga file manifes, manifes berprioritas terendah akan digabungkan ke prioritas tertinggi berikutnya, kemudian itu digabungkan ke manifes berprioritas tertinggi, seperti diilustrasikan dalam gambar 1.
Gambar 1. Proses menggabungkan tiga file manifes, prioritas terendah (kiri) ke prioritas tertinggi (kanan)
Ada tiga tipe dasar file manifes yang dapat digabung satu sama lain, dan prioritas penggabungannya seperti berikut (prioritas tertinggi terlebih dahulu):
- File manifes untuk varian versi
Jika Anda memiliki beberapa set sumber varian, prioritas manifesnya adalah seperti berikut:
- Manifes varian versi (misalnya
src/demoDebug/) - Manifes tipe versi (misalnya
src/debug/) - Manifes ragam produk (misalnya
src/demo/)Jika Anda menggunakan dimensi ragam, prioritas manifes akan sesuai dengan urutan pencantuman setiap dimensi dalam properti
flavorDimensions(prioritas tertinggi adalah yang pertama).
- Manifes varian versi (misalnya
- File manifes utama untuk modul aplikasi
- File manifes dari sebuah pustaka yang disertakan
Jika Anda memiliki beberapa pustaka, prioritas manifesnya akan mencocokkan urutan dependensi (urutan munculnya dalam blok
dependenciesGradle).
Misalnya, sebuah manifes pustaka digabungkan ke dalam manifes utama, kemudian manifes utama digabungkan ke dalam manifes varian versi.
Catatan: Begitu juga dengan prioritas penggabungan untuk semua set sumber, seperti yang dijelaskan dalam Membangun dengan set sumber.
Penting: Konfigurasi versi dari file
build.gradle akan menggantikan atribut yang bersesuaian di
file manifes gabungan. Misalnya, minSdkVersion dari file build.gradle akan
menggantikan atribut yang sesuai di elemen manifes <uses-sdk>. Agar tidak
bingung, biarkan saja elemen <uses-sdk> dan
definisikan properti ini dalam file build.gradle. Untuk detail
selengkapnya, lihat Mengonfigurasi Versi Anda.
Heuristik konflik penggabungan
Alat bantu penggabung secara logis bisa mencocokkan setiap elemen XML dari satu manifes ke elemen yang bersesuaian di manifes lainnya. (Untuk detail tentang cara kerja pencocokan, lihat apendiks tentang kebijakan penggabungan).
Jika sebuah elemen dari manifes berprioritas lebih rendah tidak cocok dengan elemen apa pun di manifes yang berprioritas lebih tinggi, maka elemen itu akan ditambahkan ke manifes gabungan. Akan tetapi, jika ada elemen yang cocok, maka alat bantu penggabung akan berupaya mengombinasikan semua atribut dari setiap elemen ke dalam elemen yang sama. Jika alat bantu tersebut menemukan bahwa manifes berisi atribut yang sama dengan nilai berbeda, maka akan terjadi konflik penggabungan.
Tabel 1 menggambarkan hasil yang terjadi bila alat bantu penggabung berupaya mengombinasikan semua atribut ke dalam elemen yang sama.
Tabel 1. Perilaku penggabungan default untuk nilai-nilai atribut
| Atribut berprioritas tinggi | Atribut berprioritas rendah | Hasil gabungan atribut |
|---|---|---|
| Tidak ada nilai | Tidak ada nilai | Tidak ada nilai (gunakan nilai default) |
| Nilai B | Nilai B | |
| Nilai A | Tidak ada nilai | Nilai A |
| Nilai A | Nilai A | |
| Nilai B | Kesalahan konflik—Anda harus menambahkan marker aturan penggabungan |
Akan tetapi, ada beberapa situasi ketika alat bantu penggabung berperilaku berbeda untuk menghindari konflik penggabungan:
- Atribut di elemen
<manifest>tidak pernah digabung bersama—hanya atribut dari manifes berprioritas tertinggi yang digunakan. - Atribut
android:requireddi elemen<uses-feature>dan<uses-library>menggunakan penggabungan OR, sehingga jika ada konflik,"true"akan diterapkan dan fitur atau pustaka yang diperlukan oleh satu manifes akan selalu disertakan. - Atribut di elemen
<uses-sdk>selalu menggunakan nilai dari manifes yang berprioritas lebih tinggi, kecuali dalam situasi berikut:- Bila manifes yang berprioritas lebih rendah memiliki nilai
minSdkVersionyang lebih tinggi, maka akan terjadi kesalahan kecuali jika Anda menerapkan aturan penggabunganoverrideLibrary. - Bila manifes yang berprioritas lebih rendah memiliki nilai
targetSdkVersionyang lebih rendah, alat bantu penggabung akan menggunakan nilai dari manifes yang berprioritas lebih tinggi, namun juga menambahkan semua izin sistem yang diperlukan untuk memastikan bahwa pustaka yang diimpor tetap berfungsi dengan benar (seandainya versi Android yang lebih tinggi telah meningkatkan pembatasan izin). Untuk informasi selengkapnya tentang perilaku ini, lihat bagian tentang izin sistem implisit.
- Bila manifes yang berprioritas lebih rendah memiliki nilai
- Elemen
<intent-filter>tidak pernah dicocokkan antar manifes. Masing-masing diperlakukan secara unik dan ditambahkan ke elemen induk biasa di manifes gabungan.
Untuk semua konflik antar atribut lainnya, Anda akan menerima pesan kesalahan dan harus memberi tahu alat bantu penggabung cara mengatasinya dengan menambahkan atribut khusus dalam file manifes yang berprioritas lebih tinggi (lihat bagian berikutnya tentang marker aturan penggabungan).
Jangan bergantung pada nilai-nilai atribut default. Karena semua
atribut unik dikombinasikan ke dalam elemen yang sama, maka hal ini dapat menyebabkan
hasil yang tidak diharapkan jika manifes yang sebenarnya berprioritas lebih tinggi
bergantung pada nilai default suatu atribut tanpa mendeklarasikannya. Misalnya, jika manifes yang berprioritas
lebih tinggi tidak mendeklarasikan atribut android:launchMode,
maka ia akan menggunakan nilai default "standard"; namun jika
manifes yang berprioritas lebih rendah mendeklarasikan atribut ini dengan nilai berbeda, nilai
itu akan diterapkan pada manifes gabungan (yang akan menggantikan nilai default). Jadi Anda
sebaiknya secara eksplisit mendefinisikan setiap atribut sebagaimana yang Anda inginkan. (Nilai default
untuk setiap atribut didokumentasikan dalam Referensi manifes.)
Marker aturan penggabungan
Marker aturan penggabungan adalah sebuah atribut XML yang bisa Anda gunakan untuk menyatakan preferensi tentang cara mengatasi konflik penggabungan atau membuang elemen dan atribut yang tidak diinginkan. Anda bisa menerapkan marker pada keseluruhan elemen atau hanya pada atribut tertentu dalam elemen.
Saat menggabungkan dua file manifes, alat bantu penggabung akan mencari marker ini di file manifes yang berprioritas lebih tinggi.
Semua marker dimiliki oleh namespace tools Android, jadi Anda harus mendeklarasikan
namespace terlebih dahulu dalam elemen <manifest> seperti yang ditampilkan di sini:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp"
xmlns:tools="http://schemas.android.com/tools">
Marker simpul
Untuk menerapkan aturan penggabungan pada keseluruhan elemen XML (ke semua atribut dalam manifes elemen yang diberikan dan ke semua anaknya), gunakan atribut berikut:
tools:node="merge"- Menggabungkan semua atribut dalam tag ini dan semua elemen bersarang bila tidak
terjadi konflik dengan menggunakan heuristik konflik
penggabungan. Ini adalah perilaku default elemen.
Manifes yang berprioritas rendah:
<activity android:name=”com.example.ActivityOne” android:windowSoftInputMode=”stateUnchanged”> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>Manifes yang berprioritas tinggi:
<activity android:name=”com.example.ActivityOne” android:screenOrientation=”portrait” tools:node="merge”> </activity>Hasil manifes gabungan:
<activity android:name=”com.example.ActivityOne” android:screenOrientation=”portrait” android:windowSoftInputMode=”stateUnchanged”> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> tools:node="merge-only-attributes"- Menggabungkan atribut dalam tag ini saja; tidak menggabungkan elemen bersarang.
Manifes yang berprioritas rendah:
<activity android:name=”com.example.ActivityOne” android:windowSoftInputMode=”stateUnchanged”> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>Manifes yang berprioritas tinggi:
<activity android:name=”com.example.ActivityOne” android:screenOrientation=”portrait” tools:node="merge-only-attributes”> </activity>Hasil manifes gabungan:
<activity android:name=”com.example.ActivityOne” android:screenOrientation=”portrait” android:windowSoftInputMode=”stateUnchanged”> </activity> tools:node="remove"- Membuang elemen ini dari manifes gabungan. Walaupun sepertinya Anda
cukup menghapus elemen ini, penggunaannya diperlukan bila
Anda menemukan elemen di manifes gabungan yang tidak dibutuhkan, dan elemen itu
disediakan oleh file manifes yang berprioritas lebih rendah yang berada di luar kendali Anda
(misalnya pustaka yang diimpor).
Manifes yang berprioritas rendah:
<activity-alias android:name=”com.example.alias”> <meta-data android:name=”cow” android:value=”@string/moo”/> <meta-data android:name=”duck” android:value=”@string/quack”/> </activity-alias>Manifes yang berprioritas tinggi:
<activity-alias android:name=”com.example.alias”> <meta-data android:name=”cow” tools:node=”remove”/> </activity-alias>Hasil manifes gabungan:
<activity-alias android:name=”com.example.alias”> <meta-data android:name=”duck” android:value=”@string/quack”/> </activity-alias> tools:node="removeAll"- Seperti
tools:node="remove", namun membuang semua elemen yang cocok dengan tipe elemen ini (dalam elemen induk yang sama).Manifes yang berprioritas rendah:
<activity-alias android:name=”com.example.alias”> <meta-data android:name=”cow” android:value=”@string/moo”/> <meta-data android:name=”duck” android:value=”@string/quack”/> </activity-alias>Manifes yang berprioritas tinggi:
<activity-alias android:name=”com.example.alias”> <meta-data tools:node=”removeAll”/> </activity-alias>
Hasil manifes gabungan:
<activity-alias android:name=”com.example.alias”> </activity-alias>
tools:node="replace"- Mengganti seluruh elemen yang berprioritas lebih rendah. Artinya, jika ada
elemen yang cocok dalam manifes yang berprioritas lebih rendah, abaikan dan gunakan
elemen ini persis sebagaimana munculnya dalam manifes.
Manifes yang berprioritas rendah:
<activity-alias android:name=”com.example.alias”> <meta-data android:name=”cow” android:value=”@string/moo”/> <meta-data android:name=”duck” android:value=”@string/quack”/> </activity-alias>Manifes yang berprioritas tinggi:
<activity-alias android:name=”com.example.alias” tools:node=”replace”> <meta-data android:name=”fox” android:value=”@string/dingeringeding”/> </activity-alias>Hasil manifes gabungan:
<activity-alias android:name=”com.example.alias”> <meta-data android:name=”fox” android:value=”@string/dingeringeding”/> </activity-alias> tools:node="strict"- Menghasilkan kegagalan versi bila elemen di manifes yang berprioritas lebih rendah
tidak persis sama dengan elemen di manifes yang berprioritas lebih tinggi (kecuali jika
telah ditangani oleh marker aturan penggabungan lainnya). Ini menggantikan heuristik konflik penggabungan. Misalnya, jika
manifes yang berprioritas lebih rendah cuma menyertakan atribut ekstra,
versi akan gagal (karena perilaku default menambahkan atribut ekstra ke
manifes gabungan).
Manifes yang berprioritas rendah:
<activity android:name=”com.example.ActivityOne” android:windowSoftInputMode=”stateUnchanged”> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>Manifes yang berprioritas tinggi:
<activity android:name=”com.example.ActivityOne” android:screenOrientation=”portrait” tools:node="strict”> </activity>Ini akan menghasilkan kesalahan penggabungan manifes. Kedua elemen manifes tidak bisa dibedakan sama sekali di mode ketat. Jadi Anda harus menerapkan marker aturan penggabungan lain untuk mengatasi perbedaan ini. (Biasanya, keduanya akan bergabung bersama dengan baik seperti yang ditampilkan dalam contoh di atas untuk
tools:node="merge".)
Marker atribut
Untuk menerapkan aturan penggabungan hanya pada atribut tertentu di tag manifes, gunakan atribut berikut. Setiap atribut menerima satu atau beberapa nama atribut (termasuk namespace atribut), yang dipisah dengan koma.
tools:remove="attr, ..."- Membuang atribut yang ditetapkan dari manifes gabungan. Walaupun
sepertinya Anda bisa saja menghapusnya, atribut ini perlu
digunakan bila file manifes yang berprioritas lebih rendah sengaja menyertakan atribut
ini dan Anda ingin memastikannya tidak dimasukkan ke
manifes gabungan.
Manifes yang berprioritas rendah:
<activity android:name=”com.example.ActivityOne” android:windowSoftInputMode=”stateUnchanged”>Manifes yang berprioritas tinggi:
<activity android:name=”com.example.ActivityOne” android:screenOrientation=”portrait” tools:remove=”android:windowSoftInputMode”>Hasil manifes gabungan:
<activity android:name=”com.example.ActivityOne” android:screenOrientation=”portrait”> tools:replace="attr, ..."- Mengganti atribut yang ditetapkan dalam manifes yang berprioritas lebih rendah dengan
atribut dari manifes ini. Dengan kata lain, selalu mempertahankan
nilai-nilai manifes yang berprioritas lebih tinggi.
Manifes yang berprioritas rendah:
<activity android:name=”com.example.ActivityOne” android:theme=”@oldtheme” android:exported=”false” android:windowSoftInputMode=”stateUnchanged”>Manifes yang berprioritas tinggi:
<activity android:name=”com.example.ActivityOne” android:theme=”@newtheme” android:exported=”true” android:screenOrientation=”portrait” tools:replace=”android:theme,android:exported”>Hasil manifes gabungan:
<activity android:name=”com.example.ActivityOne” android:theme=”@newtheme” android:exported=”true” android:screenOrientation=”portrait” android:windowSoftInputMode=”stateUnchanged”> tools:strict="attr, ..."- Menghasilkan kegagalan versi bila atribut dalam
manifes yang berprioritas lebih rendah ini tidak persis sama dengan yang ada di
manifes yang berprioritas lebih tinggi. Ini adalah perilaku default untuk semua atribut, kecuali untuk
yang memiliki perilaku khusus seperti yang dijelaskan dalam heuristik konflik penggabungan.
Manifes yang berprioritas rendah:
<activity android:name=”com.example.ActivityOne” android:screenOrientation=”landscape”> </activity>Manifes yang berprioritas tinggi:
<activity android:name=”com.example.ActivityOne” android:screenOrientation=”portrait” tools:strict="android:screenOrientation”> </activity>Ini akan menghasilkan kesalahan penggabungan manifes. Anda harus menerapkan marker aturan penggabungan lain untuk mengatasi konflik. (Ingatlah: Ini adalah perilaku default, jadi contoh di atas memiliki hasil yang sama jika Anda membuang
tools:strict="screenOrientation”.)
Anda juga bisa menerapkan beberapa marker ke sebuah elemen seperti berikut.
Manifes yang berprioritas rendah:
<activity android:name=”com.example.ActivityOne”
android:theme=”@oldtheme”
android:exported=”false”
android:allowTaskReparenting="true"
android:windowSoftInputMode=”stateUnchanged”>
Manifes yang berprioritas tinggi:
<activity android:name=”com.example.ActivityOne”
android:theme=”@newtheme”
android:exported=”true”
android:screenOrientation=”portrait”
tools:replace=”android:theme,android:exported”
tools:remove=”android:windowSoftInputMode”>
Hasil manifes gabungan:
<activity android:name=”com.example.ActivityOne”
android:theme=”@newtheme”
android:exported=”true”
android:allowTaskReparenting="true"
android:screenOrientation=”portrait”>
Pemilih marker
Jika Anda ingin menerapkan marker aturan penggabungan hanya ke suatu
pustaka yang diimpor, tambahkan atribut tools:selector bersama
nama paket pustaka.
Misalnya, dengan manifes berikut, aturan penggabungan remove
hanya diterapkan bila file manifes yang berprioritas lebih rendah berasal dari pustaka
com.example.lib1.
<permission android:name="permissionOne"
tools:node="remove"
tools:selector="com.example.lib1">
Jika manifes yang berprioritas lebih rendah berasal dari sumber lain, aturan penggabungan
remove akan diabaikan.
Catatan: Jika Anda menggunakan salah satu marker atribut, maka akan diterapkan ke semua atribut yang ditetapkan di marker.
Gantikan <uses-sdk> untuk pustaka yang diimpor
Secara default, saat mengimpor pustaka dengan nilai minSdkVersion yang
lebih tinggi daripada file manifes utama proyek, akan terjadi kesalahan dan
pustaka tidak bisa diimpor. Agar alat bantu penggabung mengabaikan konflik ini dan
mengimpor pustaka dengan mempertahankan nilai minSdkVersion
yang lebih rendah di aplikasi Anda, tambahkan atribut overrideLibrary ke tag <uses-sdk>.
Nilai atribut bisa berupa salah satu atau beberapa nama paket pustaka
(terpisah-koma), menunjukkan pustaka yang bisa
menggantikan minSdkVersion manifes utama.
Misalnya, jika manifes utama aplikasi Anda menerapkan overrideLibrary
seperti ini:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app"
xmlns:tools="http://schemas.android.com/tools">
<uses-sdk android:targetSdkVersion="22" android:minSdkVersion="2"
tools:overrideLibrary="com.example.lib1, com.example.lib2"/>
...
Maka manifes berikut bisa digabungkan tanpa kesalahan berkenaan dengan
tag <uses-sdk>, dan manifes gabungan akan mempertahankan
minSdkVersion="2" dari manifes aplikasi.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lib1">
<uses-sdk android:minSdkVersion="4" />
...
Izin sistem implist
Beberapa Android API yang semula bebas diakses oleh aplikasi kini
dibatasi oleh izin
sistem di versi terbaru Android. Agar tidak merusak aplikasi yang
mengharapkan akses ke API ini, versi terbaru Android memungkinkan aplikasi
melanjutkan akses ke API itu tanpa izin jika telah menyetel
targetSdkVersion ke nilai yang lebih rendah daripada versi yang telah ditambahkan
pembatasan. Perilaku ini secara efektif memberikan izin
implisit ke aplikasi yang mengizinkannya mengakses API tersebut. Jadi, hal ini bisa memengaruhi
manifes gabungan yang memiliki nilai-nilai berbeda untuk targetSdkVersion dengan cara
berikut.
Jika file manifes yang berprioritas lebih rendah memiliki nilai lebih rendah untuk
targetSdkVersion yang memberinya izin implisit,
dan manifes yang berprioritas lebih tinggi tidak memiliki izin implisit
yang sama (karena targetSdkVersion-nya sama dengan atau lebih tinggi
daripada versi yang telah ditambahkan pembatasan), maka alat bantu penggabung
secara eksplisit akan menambahkan izin sistem ke manifes gabungan.
Misalnya, jika aplikasi Anda menyetel targetSdkVersion ke 4 atau yang lebih tinggi dan mengimpor sebuah
pustaka dengan targetSdkVersion disetel ke 3 atau yang lebih rendah, alat bantu penggabung akan menambahkan izin
WRITE_EXTERNAL_STORAGE
ke manifes gabungan. Tabel 2 mencantumkan semua izin
yang bisa ditambahkan ke manifes gabungan.
Catatan: Jika telah menyetel targetSdkVersion aplikasi ke 23 atau yang lebih tinggi, maka Anda harus
menjalankan permintaan izin waktu proses untuk izin yang berbahaya bila aplikasi
berupaya mengakses API yang dilindungi oleh izin itu. Untuk panduan selengkapnya,
lihat Bekerja dengan Izin Sistem.
Tabel 2. Daftar izin yang dapat ditambahkan alat bantu penggabung ke manifes gabungan
| Manifes yang berprioritas lebih rendah mendeklarasikan | Izin yang ditambahkan ke manifes gabungan |
|---|---|
targetSdkVersion adalah 3 atau lebih rendah |
WRITE_EXTERNAL_STORAGE, READ_PHONE_STATE |
targetSdkVersion adalah 15 atau lebih rendah dan menggunakan READ_CONTACTS |
READ_CALL_LOG |
targetSdkVersion adalah 15 atau lebih rendah dan menggunakan WRITE_CONTACTS |
WRITE_CALL_LOG |
Memeriksa manifes gabungan dan menemukan konflik
Bahkan sebelum membangun APK, Anda bisa melihat pratinjau tampilan manifes gabungan
tersebut dengan membuka file AndroidManifest.xml di
Android Studio, kemudian mengeklik tab Merged Manifest di bagian bawah
editor.
Tampilan Merged Manifest menampilkan hasil manifes gabungan di sebelah kiri dan informasi tentang setiap file manifes gabungan di sebelah kanan, seperti yang ditampilkan dalam gambar 2. Elemen yang telah digabung dalam file manifes yang berprioritas lebih rendah disorot dengan warna berbeda di sebelah kiri. Kunci untuk setiap warna ditetapkan pada Manifest Sources di sebelah kanan.
Gambar 2. Tampilan Merged Manifest
File manifes yang menjadi bagian dari versi namun tidak menyumbangkan elemen atau atribut dicantumkan pada Other Manifest Files di sebelah kanan.
Untuk melihat informasi tentang asal elemen, klik elemen tersebut di sebelah kiri maka detailnya akan muncul pada Merging Log di sebelah kanan.
Jika terjadi konflik, maka akan muncul pada Merging Errors di sisi kanan bersama saran mengenai cara mengatasi konflik dengan menggunakan marker aturan penggabungan. Kesalahan tersebut juga tercetak di jendela Event Log (pilih View > Tool Windows > Event Log).
Jika ingin melihat log lengkap mengenai pohon keputusan penggabungan, Anda bisa menemukan
file log tersebut dalam direktori build/outputs/logs/ modul, yang bernama
manifest-merger-buildVariant-report.txt.
Apendiks: Kebijakan penggabungan
Alat bantu penggabung secara logis bisa mencocokkan setiap elemen XML dari satu
file manifes ke elemen yang bersesuaian di file lainnya. Penggabung akan mencocokkan setiap elemen
dengan menggunakan "kunci pencocokan": berupa nilai atribut unik (misalnya android:name) atau
sifat unik alami dari tag itu sendiri (misalnya, hanya boleh ada satu elemen
<supports-screen>). Jika dua manifes memiliki elemen XML yang sama, maka
alat bantu akan menggabungkan kedua elemen dengan menggunakan salah satu dari tiga kebijakan penggabungan:
- Merge
- Mengombinasikan semua atribut yang tidak berkonflik ke dalam tag yang sama dan menggabungkan elemen anak sesuai dengan kebijakan penggabungannya masing-masing. Jika ada atribut yang saling bertentangan, gabungkan bersama dengan marker aturan penggabungan.
- Merge children only
- Tidak mengombinasikan atau menggabungkan atribut (hanya mempertahankan atribut yang disediakan oleh file manifes yang berprioritas tertinggi) dan menggabungkan elemen anak sesuai dengan kebijakan penggabungannya.
- Keep
- Membiarkan elemen “apa adanya" dan menambahkannya ke elemen induk biasa dalam file gabungan. Kebijakan ini hanya digunakan bila sejumlah deklarasi elemen yang sama diperbolehkan.
Tabel 1 mencantumkan setiap tipe elemen, tipe kebijakan penggabungan yang digunakan, dan kunci yang digunakan untuk menentukan elemen yang cocok di antara kedua manifes.
Tabel 3. Kebijakan penggabungan elemen manifes dan kunci pencocokan
| Elemen | Kebijakan penggabungan | Kunci pencocokan |
|---|---|---|
<action>
|
Merge | atribut android:name
|
<activity>
|
Merge | atribut android:name
|
<application>
|
Merge | Hanya ada satu per <manifest>
|
<category>
|
Merge | atribut android:name
|
<data>
|
Merge | Hanya ada satu per <intent-filter>
|
<grant-uri-permission>
|
Merge | Hanya ada satu per <provider>
|
<instrumentation>
|
Merge | atribut android:name
|
<intent-filter>
|
Keep | Tidak ada pencocokan; sejumlah deklarasi dalam elemen induk yang sama diperbolehkan |
<manifest>
|
Merge children only | Hanya ada satu per file |
<meta-data>
|
Merge | android:name attribute
|
<path-permission>
|
Merge | Hanya ada satu per <provider>
|
<permission-group>
|
Merge | atribut android:name
|
<permission>
|
Merge | atribut android:name
|
<permission-tree>
|
Merge | atribut android:name
|
<provider>
|
Merge | atribut android:name
|
<receiver>
|
Merge | atribut android:name
|
<screen>
|
Merge | atribut android:screenSize
|
<service>
|
Merge | atribut android:name
|
<supports-gl-texture>
|
Merge | atribut android:name
|
<supports-screen>
|
Merge | Hanya ada satu per <manifest>
|
<uses-configuration>
|
Merge | Hanya ada satu per <manifest>
|
<uses-feature>
|
Merge | atribut android:name (jika tidak ada, maka atribut
android:glEsVersion)
|
<uses-library>
|
Merge | atribut android:name
|
<uses-permission>
|
Merge | atribut android:name
|
<uses-sdk>
|
Merge | Hanya ada satu per <manifest>
|
| Elemen khusus | Merge | Tidak ada pencocokan; tidak dikenali oleh alat bantu penggabung sehingga selalu disertakan dalam manifes gabungan |