Skip to content

Most visited

Recently visited

navigation

Penggabungan Beberapa File Manifes

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):

  1. File manifes untuk varian versi

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

    1. Manifes varian versi (misalnya src/demoDebug/)
    2. Manifes tipe versi (misalnya src/debug/)
    3. 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).

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

    Jika Anda memiliki beberapa pustaka, prioritas manifesnya akan mencocokkan urutan dependensi (urutan munculnya dalam blok dependencies Gradle).

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:

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 &lt;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
This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)