Mengelola file manifes

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Halaman ini menjelaskan cara kerja penggabungan manifes dan cara menerapkan preferensi penggabungan untuk mengatasi konflik penggabungan. Untuk pengantar file manifes aplikasi, lihat ringkasan manifes aplikasi.

Menggabungkan beberapa file manifes

File APK atau Android App Bundle hanya dapat berisi satu file AndroidManifest.xml, tetapi project Android Studio dapat berisi beberapa file manifes yang disediakan oleh set sumber utama, varian build, dan library yang diimpor. Jadi, saat mem-build aplikasi, build Gradle akan menggabungkan semua file manifes ke dalam satu file manifes tunggal yang dikemas ke dalam aplikasi Anda.

Alat penggabung manifes mengombinasikan semua elemen XML dari setiap file dengan mengikuti heuristik penggabungan dan dengan mematuhi preferensi penggabungan yang telah didefinisikan dengan atribut XML khusus.

Tips: Gunakan tampilan Manifes Gabungan yang dijelaskan di bagian berikut, untuk melihat pratinjau hasil manifes gabungan dan menemukan error konflik.

Menggabungkan prioritas

Alat penggabung akan mengombinasikan semua file manifes ke dalam satu file secara berurutan berdasarkan prioritas setiap file manifes. Misalnya, jika Anda memiliki tiga file manifes, manifes berprioritas terendah akan digabungkan ke manifest prioritas tertinggi berikutnya, lalu digabungkan lagi ke dalam manifes berprioritas tertinggi, seperti diilustrasikan dalam gambar 1.

Gambar 1. Proses menggabungkan tiga file manifes, prioritas terendah ke dalam prioritas tertinggi.

Ada tiga jenis dasar file manifes yang dapat digabungkan satu sama lain, dan prioritas penggabungannya adalah sebagai berikut (prioritas tertinggi terlebih dahulu):

  1. File manifes untuk varian build Anda

    Jika Anda memiliki beberapa set sumber untuk varian, prioritas manifesnya adalah sebagai berikut:

    • Manifes varian build (seperti src/demoDebug/)
    • Manifes jenis build (seperti src/debug/)
    • Manifes ragam produk (seperti src/demo/)

      Jika Anda menggunakan dimensi ragam, prioritas manifes akan menyesuaikan urutan pencantuman setiap dimensi dalam properti flavorDimensions (prioritas tertinggi adalah yang pertama).

  2. File manifes utama untuk modul aplikasi
  3. File manifes dari library yang disertakan

    Jika Anda memiliki beberapa library, prioritas manifesnya akan dicocokkan dengan urutan kemunculannya dalam blok dependencies Gradle Anda.

Misalnya, sebuah manifes library digabungkan ke dalam manifes utama, lalu manifes utama tersebut digabungkan ke dalam manifes varian build. Perhatikan bahwa prioritas penggabungan ini sama untuk semua set sumber, sebagaimana dijelaskan dalam Mem-build dengan set sumber.

Penting: Konfigurasi build dari file build.gradle akan menggantikan setiap atribut yang terkait dalam file manifes gabungan. Misalnya, minSdk dari file build.gradle atau build.gradle.kts akan menggantikan atribut yang sesuai dalam elemen manifes <uses-sdk>. Untuk menghindari kebingungan, jangan sertakan elemen <uses-sdk> dan tentukan properti ini hanya dalam file build.gradle. Untuk detail lebih lanjut, lihat Mengonfigurasi build Anda.

Menggabungkan heuristik konflik

Alat penggabung secara logis dapat mencocokkan setiap elemen XML dari satu manifes ke elemen yang terkait di manifes lainnya. Untuk mengetahui detail tentang cara kerja pencocokan, lihat prioritas penggabungan di bagian sebelumnya.

Jika elemen dari manifes yang berprioritas lebih rendah tidak cocok dengan elemen apa pun dalam manifes yang berprioritas lebih tinggi, elemen tersebut akan ditambahkan ke manifes gabungan. Namun, jika ada elemen yang cocok, alat penggabung akan mencoba mengombinasikan semua atribut ke dalam satu elemen yang sama. Jika alat ini menemukan bahwa kedua manifes berisi atribut yang sama dengan nilai berbeda, konflik penggabungan akan terjadi.

Tabel 1 menggambarkan kemungkinan hasil ketika alat penggabung mencoba mengombinasikan semua atribut ke dalam elemen yang sama.

Tabel 1. Perilaku penggabungan default untuk nilai atribut

Atribut prioritas tinggi Atribut prioritas rendah Hasil penggabungan atribut
Tidak ada nilai Tidak ada nilai Tidak ada nilai (menggunakan nilai default)
Nilai B Nilai B
Nilai A Tidak ada nilai Nilai A
Nilai A Nilai A
Nilai B Error konflik—Anda harus menambahkan penanda aturan penggabungan

Namun, ada beberapa situasi ketika alat penggabung berperilaku berbeda untuk menghindari konflik penggabungan:

  • Atribut dalam elemen <manifest> tidak pernah digabung, hanya atribut dari manifes prioritas tertinggi yang digunakan.
  • Atribut android:required dalam elemen <uses-feature> dan <uses-library> menggunakan penggabungan OR. Jika terjadi konflik, "true" akan diterapkan dan fitur atau library yang diperlukan oleh satu manifes akan selalu disertakan.
  • Atribut dalam elemen <uses-sdk> selalu menggunakan nilai dari manifes berprioritas lebih tinggi, kecuali dalam situasi berikut:
    • Jika manifes yang berprioritas lebih rendah memiliki nilai minSdk yang lebih tinggi, error akan terjadi kecuali jika Anda menerapkan aturan penggabungan overrideLibrary.
    • Jika manifes yang berprioritas lebih rendah memiliki nilai targetSdkVersion yang lebih rendah, alat penggabungan akan menggunakan nilai dari manifes yang berprioritas lebih tinggi, dan juga menambahkan semua izin sistem yang diperlukan untuk memastikan bahwa library yang diimpor akan terus berfungsi dengan benar (untuk kasus saat versi Android yang lebih tinggi telah meningkatkan pembatasan izin). Untuk mengetahui informasi selengkapnya tentang perilaku ini, lihat bagian tentang izin sistem implisit.
  • Elemen <intent-filter> tidak pernah dicocokkan di antara manifest. Masing-masing diperlakukan secara unik dan ditambahkan ke elemen induk biasa di manifes gabungan.

Untuk semua konflik di antara atribut lainnya, Anda akan menerima pesan error dan harus memberi tahu alat penggabung tentang cara mengatasinya dengan menambahkan atribut khusus dalam file manifes yang berprioritas lebih tinggi (lihat bagian berikutnya tentang penanda aturan penggabungan).

Jangan bergantung pada nilai-nilai atribut default. Karena semua atribut unik dikombinasikan ke dalam elemen yang sama, hal ini dapat menyebabkan hasil yang tidak diharapkan jika manifes yang berprioritas lebih tinggi sebenarnya bergantung pada nilai default suatu atribut tanpa mendeklarasikannya. Misalnya, jika manifes yang berprioritas lebih tinggi tidak mendeklarasikan atribut android:launchMode, manifes tersebut akan menggunakan nilai default "standard". Namun, jika manifes yang berprioritas lebih rendah mendeklarasikannya dengan nilai yang berbeda, nilai tersebut diterapkan ke manifes gabungan yang akan menggantikan nilai default. Anda harus menentukan setiap atribut secara eksplisit seperti yang Anda inginkan. Nilai default untuk setiap atribut didokumentasikan dalam referensi manifes.)

Menggabungkan penanda aturan

Penanda aturan penggabungan adalah atribut XML yang dapat digunakan untuk menyatakan preferensi Anda tentang cara mengatasi konflik penggabungan atau menghapus elemen dan atribut yang tidak diinginkan. Anda dapat menerapkan penanda ke seluruh elemen atau hanya pada atribut tertentu dalam elemen.

Saat menggabungkan dua file manifes, alat penggabung akan mencari penanda ini dalam file manifes yang berprioritas lebih tinggi.

Semua penanda dimiliki oleh namespace tools Android, jadi Anda harus mendeklarasikan namespace ini terlebih dahulu dalam elemen <manifest> seperti yang ditampilkan berikut:

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

Penanda node

Untuk menerapkan aturan penggabungan ke seluruh elemen XML (ke semua atribut dalam elemen manifes yang ditentukan dan ke semua tag turunannya), gunakan atribut berikut:

tools:node="merge"
Gabungkan semua atribut dalam tag ini dan semua elemen bertingkat jika tidak ada konflik dengan menggunakan heuristik konflik penggabungan. Ini adalah perilaku default elemen.

Manifes 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 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 bertingkat.

Manifes 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 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"
Menghapus elemen ini dari manifes gabungan. Digunakan saat Anda menemukan elemen di manifes gabungan yang tidak diperlukan dan disediakan oleh file manifes yang berprioritas lebih rendah yang berada di luar kendali Anda (seperti library yang diimpor).

Manifes 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 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"
Mirip dengan tools:node="remove", tetapi menghapus semua elemen yang cocok dengan jenis elemen ini (dalam elemen induk yang sama).

Manifes 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 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 elemen tersebut dan gunakan elemen ini persis sebagaimana munculnya dalam manifes.

Manifes 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 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 build saat elemen dalam manifes yang berprioritas lebih rendah tidak sama persis dengan elemen dalam manifes yang berprioritas lebih tinggi (kecuali jika telah ditangani oleh penanda aturan penggabungan lainnya). Ini akan menggantikan heuristik konflik penggabungan. Misalnya, jika manifes yang berprioritas lebih rendah menyertakan atribut tambahan, build akan gagal (sedangkan perilaku default akan menambahkan atribut tambahan ke manifes gabungan).

Manifes 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 berprioritas tinggi:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:node="strict">
</activity>

Kode ini akan mengakibatkan error penggabungan manifes. Kedua elemen manifes tidak dapat dibedakan sama sekali di mode ketat. Jadi, Anda harus menerapkan penanda aturan penggabungan lain untuk mengatasi perbedaan ini. (Tanpa tools:node="strict", kedua file ini dapat digabungkan tanpa error, seperti yang ditunjukkan dalam contoh untuk tools:node="merge".)

Penanda 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, ..."
Menghapus atribut yang ditetapkan dari manifes gabungan. Digunakan saat file manifes yang berprioritas lebih rendah menyertakan atribut ini dan Anda ingin memastikan atribut tersebut tidak dimasukkan ke dalam manifes gabungan.

Manifes berprioritas rendah:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">

Manifes 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 manifes yang berprioritas lebih tinggi.

Manifes berprioritas rendah:

<activity android:name="com.example.ActivityOne"
    android:theme="@oldtheme"
    android:exported="false"
    android:windowSoftInputMode="stateUnchanged">

Manifes 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 build setiap kali atribut dalam manifes dengan prioritas lebih rendah tidak sama persis dengan atribut dalam 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 berprioritas rendah:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="landscape">
</activity>

Manifes berprioritas tinggi:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:strict="android:screenOrientation">
</activity>

Kode ini akan mengakibatkan error penggabungan manifes. Anda harus menerapkan penanda aturan penggabungan lain untuk mengatasi konflik. Ini adalah perilaku default, sehingga hasil yang sama terjadi dengan menambahkan tools:strict="screenOrientation" secara eksplisit.

Anda juga dapat menerapkan beberapa penanda ke satu elemen, seperti yang ditunjukkan pada contoh berikut:

Manifes berprioritas rendah:

<activity android:name="com.example.ActivityOne"
    android:theme="@oldtheme"
    android:exported="false"
    android:allowTaskReparenting="true"
    android:windowSoftInputMode="stateUnchanged">

Manifes 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 penanda

Jika Anda hanya ingin menerapkan penanda aturan penggabungan ke suatu library yang diimpor, tambahkan atribut tools:selector dengan nama paket library.

Misalnya, dengan manifes berikut, aturan penggabungan remove hanya diterapkan jika file manifes yang berprioritas lebih rendah berasal dari library 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 aturan ini dengan salah satu penanda atribut, aturan ini akan diterapkan ke semua atribut yang ditetapkan dalam penanda.

Mengganti <uses-sdk> untuk library yang diimpor

Secara default, saat mengimpor library dengan nilai minSdk yang lebih tinggi dari file manifes utama, akan terjadi error dan library tidak dapat diimpor.

Agar alat penggabung mengabaikan konflik ini dan mengimpor library sekaligus mempertahankan nilai minSdk yang lebih rendah di aplikasi Anda, tambahkan atribut overrideLibrary ke tag <uses-sdk>. Nilai atribut dapat berupa satu atau beberapa nama paket library (dipisahkan dengan koma), yang menunjukkan library yang dapat menggantikan minSdk 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 tools:overrideLibrary="com.example.lib1, com.example.lib2"/>
...

Manifes berikut dapat digabungkan tanpa error yang terkait dengan tag <uses-sdk>, dan manifes gabungan akan mempertahankan minSdk="2" dari manifes aplikasi.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.lib1">
   <uses-sdk android:minSdk="4" />
...

Izin sistem implisit

Beberapa Android API yang semula bebas diakses oleh aplikasi kini dibatasi oleh izin sistem di versi terbaru Android.

Agar tidak mengganggu aplikasi yang meminta akses ke API ini, versi terbaru Android memungkinkan aplikasi terus mengakses API tersebut tanpa izin jika targetSdkVersion ditetapkan ke nilai yang lebih rendah dari versi tempat pembatasan telah ditambahkan. Perilaku ini memberi aplikasi izin implisit untuk mengizinkan akses ke API tersebut. Manifes gabungan yang memiliki nilai berbeda untuk targetSdkVersion dapat terpengaruh.

Jika file manifes yang berprioritas lebih rendah memiliki nilai yang lebih rendah untuk targetSdkVersion yang memberinya izin implisit, dan manifes yang berprioritas lebih tinggi tidak memiliki izin implisit yang sama (karena targetSdkVersion miliknya sama dengan atau lebih tinggi dari versi yang telah ditambahkan pembatasan), alat penggabung akan secara eksplisit menambahkan izin sistem ke manifes gabungan.

Misalnya, jika aplikasi Anda menetapkan targetSdkVersion ke 4 atau yang lebih tinggi dan mengimpor library dengan targetSdkVersion yang ditetapkan ke 3 atau lebih rendah, alat penggabung akan menambahkan izin WRITE_EXTERNAL_STORAGE ke manifes gabungan.

Tabel 2 mencantumkan semua izin yang dapat ditambahkan ke manifes gabungan:

Tabel 2. Daftar izin yang dapat ditambahkan oleh alat penggabung ke manifes gabungan

Manifes 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 mem-build aplikasi, Anda dapat melihat pratinjau tampilan manifes gabungan Anda. Untuk melihat pratinjau, lakukan langkah berikut:

  1. Di Android Studio, buka file AndroidManifest.xml.
  2. Klik tab Manifes Gabungan di bagian bawah editor.

Tampilan Manifes Gabungan menampilkan hasil manifes gabungan di sebelah kiri, dan informasi tentang setiap file manifes gabungan di sebelah kanan, seperti yang ditampilkan pada gambar 2.

Elemen yang digabungkan dari file manifes berprioritas lebih rendah disorot dalam warna yang berbeda di sebelah kiri. Kunci untuk setiap warna ditentukan dalam Manifest Sources.

Gambar 2. Tampilan Manifes Gabungan

File manifes yang merupakan bagian dari build tetapi tidak menyumbangkan elemen atau atribut tercantum dalam File Manifes Lainnya.

Untuk melihat informasi tentang asal elemen, klik elemen tersebut di panel sebelah kiri, dan detail akan muncul dalam Merging Log.

Jika terjadi konflik, detailnya akan muncul dalam Merging Error dengan rekomendasi tentang cara mengatasinya menggunakan penanda aturan penggabungan.

Error ini juga dicetak di jendela Event Log. Untuk melihatnya, pilih View > Tool Windows > Event Log.

Untuk melihat log lengkap tentang hierarki keputusan penggabungan, Anda dapat menemukan file log dalam direktori build/outputs/logs/ modul Anda, yang bernama manifest-merger-buildVariant-report.txt.

Menggabungkan kebijakan

Alat penggabung manifes secara logis dapat mencocokkan setiap elemen XML dari satu file manifes ke elemen yang terkait di file lainnya. Penggabung akan mencocokkan setiap elemen dengan menggunakankunci 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, alat penggabung akan menggabungkan kedua elemen dengan menggunakan salah satu dari tiga kebijakan penggabungan:

Gabungkan
Mengombinasikan semua atribut yang tidak berkonflik ke dalam tag yang sama dan menggabungkan elemen turunan sesuai kebijakan penggabungannya masing-masing. Jika terdapat atribut yang saling bertentangan, gabungkan dengan penanda aturan penggabungan.
Gabungkan turunan saja
Tidak mengombinasikan atau menggabungkan atribut (hanya mempertahankan atribut yang disediakan oleh file manifes yang berprioritas tertinggi) dan menggabungkan elemen turunan sesuai kebijakan penggabungannya.
Pertahankan
Membiarkan elemen “apa adanya" dan menambahkannya ke elemen induk biasa dalam file gabungan. Kebijakan ini hanya digunakan jika sejumlah deklarasi elemen yang sama diperbolehkan.

Tabel 3 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> Gabungkan Atribut android:name
<activity> Gabungkan Atribut android:name
<application> Gabungkan Hanya ada satu per <manifest>.
<category> Gabungkan Atribut android:name
<data> Gabungkan Hanya ada satu per <intent-filter>.
<grant-uri-permission> Gabungkan Hanya ada satu per <provider>.
<instrumentation> Gabungkan Atribut android:name
<intent-filter> Pertahankan Tidak ada pencocokan; beberapa deklarasi dalam elemen induk diizinkan.
<manifest> Gabungkan turunan saja Hanya ada satu per file.
<meta-data> Gabungkan Atribut android:name
<path-permission> Gabungkan Hanya ada satu per <provider>.
<permission-group> Gabungkan Atribut android:name
<permission> Gabungkan Atribut android:name
<permission-tree> Gabungkan Atribut android:name
<provider> Gabungkan Atribut android:name
<receiver> Gabungkan Atribut android:name
<screen> Gabungkan Atribut android:screenSize
<service> Gabungkan Atribut android:name
<supports-gl-texture> Gabungkan Atribut android:name
<supports-screen> Gabungkan Hanya ada satu per <manifest>.
<uses-configuration> Gabungkan Hanya ada satu per <manifest>.
<uses-feature> Gabungkan Atribut android:name (jika tidak ada, berarti atribut android:glEsVersion)
<uses-library> Gabungkan Atribut android:name
<uses-permission> Gabungkan Atribut android:name
<uses-sdk> Gabungkan Hanya ada satu per <manifest>.
Elemen kustom Gabungkan Tidak ada pencocokan; atribut ini tidak dikenali oleh alat penggabungan dan selalu disertakan dalam manifes gabungan.

Menginjeksi variabel build ke dalam manifes

Jika perlu memasukkan variabel ke dalam file AndroidManifest.xml yang ditentukan dalam file build.gradle, Anda dapat melakukannya dengan properti manifestPlaceholders. Properti ini menggunakan peta key-value pair, seperti yang ditunjukkan di bawah ini:

Groovy

android {
    defaultConfig {
        manifestPlaceholders = [hostName:"www.example.com"]
    }
    ...
}

Kotlin

android {
    defaultConfig {
        manifestPlaceholders["hostName"] = "www.example.com"
    }
    ...
}

Selanjutnya, Anda dapat memasukkan salah satu placeholder ke dalam file manifes sebagai nilai atribut:

<intent-filter ... >
    <data android:scheme="https" android:host="${hostName}" ... />
    ...
</intent-filter>

Secara default, alat build juga memberikan ID aplikasi untuk aplikasi dalam placeholder ${applicationId}. Nilai ini selalu cocok dengan ID aplikasi akhir untuk build saat ini, termasuk perubahan menurut varian build. Hal ini berguna saat Anda ingin menggunakan namespace unik untuk ID seperti tindakan intent, bahkan di antara varian build Anda.

Misalnya, jika file build.gradle Anda seperti ini:

Groovy

android {
    defaultConfig {
        applicationId "com.example.myapp"
    }
    flavorDimensions "type
    productFlavors {
        free {
            applicationIdSuffix ".free"
            dimension "type"
        }
        pro {
            applicationIdSuffix ".pro"
            dimension "type"
        }
    }
}

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"
    }
    flavorDimensions += "type"
    productFlavors {
        create("free") {
            applicationIdSuffix = ".free"
            dimension = "type"
        }
        create("pro") {
            applicationIdSuffix = ".pro"
            dimension = "type"
        }
    }
}

Anda dapat memasukkan ID aplikasi dalam manifes Anda, seperti ini:

<intent-filter ... >
    <action android:name="${applicationId}.TRANSMOGRIFY" />
    ...
</intent-filter>

Dan hasil manifes saat Anda membuat ragam produk "free" adalah:

<intent-filter ... >
   <action android:name="com.example.myapp.free.TRANSMOGRIFY" />
    ...
</intent-filter>

Untuk informasi selengkapnya, baca Menetapkan ID aplikasi.