Setiap project aplikasi harus memiliki file AndroidManifest.xml
(bernama persisi seperti ini) pada root set sumber project. File manifes menjelaskan informasi penting tentang aplikasi Anda ke fitur build Android, sistem operasi Android, dan Google Play.
Di antara banyak hal lain, file manifes diperlukan untuk mendeklarasikan hal berikut:
- Nama paket aplikasi, yang biasanya menyesuaikan namespace kode. Fitur build Android menggunakan ini untuk menentukan lokasi entitas kode saat membuat project Anda. Saat mengemas aplikasi, fitur build akan mengganti nilai ini dengan ID aplikasi dari file build Gradle, yang digunakan sebagai identifier aplikasi di sistem dan Google Play. Baca selengkapnya tentang nama paket dan ID aplikasi.
- Komponen aplikasi, yang meliputi seluruh aktivitas, layanan, penerima siaran, dan penyedia materi. Tiap komponen harus menentukan properti dasar seperti nama Kotlin atau class Java. Komponen tersebut juga mendeklarasikan kemampuan seperti konfigurasi perangkat yang bisa ditangani, dan filter intent yang menjelaskan cara komponen bisa dimulai. Baca selengkapnya tentang komponen aplikasi.
- Izin yang diperlukan aplikasi untuk mengakses bagian sistem atau aplikasi lain yang dilindungi. Ini juga mendeklarasikan semua izin yang harus dimiliki aplikasi jika mereka ingin mengakses materi dari aplikasi ini. Baca selengkapnya tentang izin.
- Fitur hardware dan software yang diperlukan aplikasi, yang memengaruhi perangkat mana yang bisa menginstal aplikasi dari Google Play. Baca selengkapnya tentang kompatibilitas perangkat.
Jika Anda menggunakan Android Studio untuk membuat aplikasi, file manifes akan dibuat untuk Anda, dan sebagian besar elemen manifes penting ditambahkan saat Anda membuat aplikasi (terutama saat menggunakan code templates).
Fitur file
Bagian berikut menjelaskan bagaimana beberapa karakteristik yang paling penting dari aplikasi Anda direfleksikan dalam file manifes.
Nama paket dan ID aplikasi
File manifes element root memerlukan atribut untuk nama paket aplikasi Anda (biasanya menyesuaikan struktur direktori project—namespace Java).
Misalnya, cuplikan berikut menampilkan elemen root <manifest>
dengan nama paket "com.example.myapp"
:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp" android:versionCode="1" android:versionName="1.0" > ... </manifest>
Selagi membuat aplikasi Anda menjadi paket aplikasi final (APK), fitut build Android menggunakan atribut package
untuk dua hal:
- Untuk menerapkan nama sebagai namespace bagi class
R.java
yang dihasilkan aplikasi Anda (digunakan untuk mengakses resource aplikasi).Contoh: Dengan manifes di atas, class
R
dibuat padacom.example.myapp.R
. - Nama ini digunakan untuk menyelesaikan setiap nama class relatif yang dideklarasikan
dalam file manifes.
Contoh: Dengan manifes di atas, aktivitas yang dideklarasikan sebagai
<activity android:name=".MainActivity">
diselesaikan menjadicom.example.myapp.MainActivity
.
Dengan demikian, nama dalam atribut package
manifes selalu cocok dengan nama paket dasar project, tempat Anda menyimpan aktivitas dan kode aplikasi lainnya. Tentu saja, Anda bisa memiliki sub-paket lainnya di project, namun file tersebut harus mengimpor class R.java
menggunakan namespace dari atribut package
.
Akan tetapi, ketahuilah bahwa setelah APK dikompilasi, atribut package
juga mewakili ID aplikasi unik universal milik aplikasi Anda. Setelah fitur build melakukan tugas di atas berdasarkan nama package
, mereka mengganti nilai package
dengan nilai yang diberikan ke properti applicationId
di file build.gradle
project Anda (digunakan di project Android Studio). Nilai final ini untuk atribut package
harus unik secara universal karena itu satu-satunya cara terjamin untuk mengidentifikasi aplikasi Anda di sistem dan Google Play.
Perbedaan antara nama package
dalam manifes dan applicationId
di file build.gradle
bisa sedikit membingungkan. Namun jika namanya sama, Anda tidak perlu khawatir.
Akan tetapi, jika Anda memutuskan untuk membuat namespace kode (dan karenanya, nama package
dalam manifes) yang berbeda daripada applicationId
dari file build, pastikan Anda sepenuhnya memahami implikasi menyetel ID aplikasi. Halaman tersebut menjelaskan bagaimana Anda dengan aman menyesuaikan nama package
manifes yang tidak bergantung pada applicationId
file build, dan mengubah ID aplikasi untuk konfigurasi build yang berbeda.
Komponen aplikasi
Untuk setiap komponen aplikasi yang Anda buat di aplikasi, Anda harus mendeklarasikan elemen XML yang bersangkutan dalam file manifes:
<activity>
untuk setiap subclassActivity
.<service>
untuk setiap subclassService
.<receiver>
untuk setiap subclassBroadcastReceiver
.<provider>
untuk setiap subclassContentProvider
.
Jika Anda membuat subclass untuk semua komponen ini tanpa mendeklarasikannya dalam file manifes, sistem tidak bisa memulainya.
Nama subclass Anda harus ditetapkan dengan atribut name
, dengan menggunakan penetapan paket lengkap. Misalnya, subclass Activity
bisa dideklarasikan sebagai berikut:
<manifest ... > <application ... > <activity android:name="com.example.myapp.MainActivity" ... > </activity> </application> </manifest>
Akan tetapi, jika karakter pertama dalam nilai name
adalah titik, maka nama paket aplikasi (dari atribut package
elemen <manifest>
) diawali dengan nama. Misalnya, nama aktivitas berikut diselesaikan ke `"com.example.myapp.MainActivity"`:
<manifest package="com.example.myapp" ... > <application ... > <activity android:name=".MainActivity" ... > ... </activity> </application> </manifest>
Jika Anda memiliki komponen yang berada dalam sub-paket (seperti dalam com.example.myapp.purchases
), nilai name
harus menambahkan nama sub-paket yang hilang (seperti ".purchases.PayActivity"
) atau gunakan nama paket mutlak.
Filter intent
Aktivitas, layanan, dan penerima siaran aplikasi diaktifkan oleh intent. Intent adalah pesan yang ditentukan oleh objek Intent
yang menjelaskan tindakan yang akan dilakukan, termasuk data yang akan ditindaklanjuti, kategori komponen yang harus melakukan tindakan, dan instruksi lainnya.
Bila aplikasi mengeluarkan intent ke sistem, sistem ini akan mencari komponen aplikasi yang bisa menangani intent berdasarkan deklarasi intent filter dalam setiap file manifes aplikasi. Sistem meluncurkan instance komponen yang sesuai dan meneruskan objek Intent
ke komponen tersebut. Jika lebih dari satu aplikasi bisa menangani intent, maka pengguna bisa memilih aplikasi mana yang akan digunakan.
Sebuah komponen aplikasi bisa memiliki filter intent dalam jumlah berapa pun (ditentukan dengan elemen <intent-filter>
), masing-masing menjelaskan kemampuan yang berbeda dari komponen itu.
Untuk informasi selengkapnya, lihat dokumen Intent dan Filter Intent.
Ikon dan label
Sejumlah elemen manifes memiliki atribut icon
dan label
masing-masing untuk menampilkan ikon kecil dan label teks ke pengguna untuk komponen aplikasi yang bersangkutan.
Dalam setiap kasus, ikon dan label yang disetel dalam elemen induk menjadi nilai icon
dan label
default untuk seluruh elemen turunan. Misalnya, ikon dan label yang disetel dalam elemen <application>
adalah ikon dan label default untuk setiap komponen aplikasi (seperti seluruh aktivitas).
Ikon dan label yang disetel dalam <intent-filter>
komponen ditampilkan ke pengguna setiap kali komponen tersebut ditampilkan sebagai opsi untuk memenuhi suatu intent. Secara default, ikon ini diwarisi dari ikon mana saja yang dideklarasikan untuk komponen induk (baik elemen <activity>
atau <application>
), namun Anda mungkin ingin mengubah ikon untuk filter intent jika menyediakan tindakan unik yang Anda ingin tunjukkan lebih baik dalam dialog pemilih. Untuk informasi selengkapnya, lihat Izinkan Aplikasi Lain Memulai Aktivitas Anda.
Izin
Aplikasi Android harus meminta izin untuk mengakses data pengguna yang sensitif (seperti kontak dan SMS) atau fitur sistem tertentu (seperti kamera dan akses internet). Setiap izin diidentifikasi melalui label yang unik. Misalnya, sebuah aplikasi yang perlu mengirimkan pesan SMS harus memiliki baris berikut dalam manifesnya:
<manifest ... > <uses-permission android:name="android.permission.SEND_SMS"/> ... </manifest>
Mulai dari Android 6.0 (API level 23), pengguna bisa menyetujui atau menolak beberapa izin aplikasi pada waktu proses. Tidak peduli versi Android mana yang didukung aplikasi, Anda harus mendeklarasikan seluruh permintaan izin dengan elemen <uses-permission>
dalam manifesnya. Jika izin diberikan, aplikasi tersebut bisa menggunakan fitur yang dilindungi. Jika tidak, upaya aplikasi untuk mengakses fitur tersebut gagal.
Aplikasi dapat juga melindungi komponennya sendiri dengan izin. Aplikasi tersebut bisa memiliki semua izin yang ditentukan oleh Android, seperti yang dicantumkan dalam android.Manifest.permission
, atau izin yang dideklarasikan dalam aplikasi lain. Aplikasi Anda juga bisa menentukan izinnya sendiri. Izin baru dideklarasikan dengan elemen <permission>
.
Untuk informasi selengkapnya, lihat Ringkasan Izin.
Kompatibilitas Perangkat
File manifes juga tempat Anda bisa mendeklarasikan tipe fitur hardware atau software yang dibutuhkan aplikasi Anda, dan demikian, tipe perangkat yang kompatibel dengan aplikasi tersebut. Google Play store tidak mengizinkan aplikasi Anda diinstal di perangkat yang tidak menyediakan fitur atau versi sistem yang dibutuhkan aplikasi Anda.
Ada beberapa tag manifes yang menentukan perangkat yang kompatibel dengan aplikasi Anda. Berikut ini hanya beberapa tag yang paling umum.
<uses-feature>
Elemen <uses-feature>
memungkinkan Anda mendeklarasikan fitur hardware dan software yang dibutuhkan aplikasi Anda. Misalnya, jika aplikasi Anda tidak bisa mencapai fungsionalitas dasar di perangkat tanpa sensor kompas, Anda dapat mendeklarasikan diperlukannya sensor kompas bersama tag manifes berikut:
<manifest ... > <uses-feature android:name="android.hardware.sensor.compass" android:required="true" /> ... </manifest>
Catatan: Jika Anda ingin membuat aplikasi Anda tersedia di Chromebook, ada beberapa batasan fitur hardware dan software penting yang harus dipertimbangkan. Untuk informasi selengkapnya, lihat Kompatibilitas Manifes Aplikasi untuk Chromebook.
<uses-sdk>
Setiap urutan versi platform sering kali menambahkan API baru yang tidak tersedia di versi sebelumnya. Untuk menunjukkan versi minimum dengan perangkat yang kompatibel dengan aplikasi, manifes Anda harus menyertakan tag <uses-sdk>
dan atribut minSdkVersion
.
Akan tetapi, ketahuilah bahwa atribut dalam elemen <uses-sdk>
diganti oleh properti yang bersangkutan dalam file build.gradle
. Jadi, jika Anda menggunakan Android Studio, Anda harus menentukan nilai minSdkVersion
dan targetSdkVersion
di sana sebagai ganti:
android { defaultConfig { applicationId 'com.example.myapp' // Defines the minimum API level required to run the app. minSdkVersion 15 // Specifies the API level used to test the app. targetSdkVersion 28 ... } }
Untuk informasi selengkapnya tentang file build.gradle
, bacalah tentang cara mengonversi build Anda.
Untuk mengetahui selengkapnya tentang cara mendeklarasikan dukungan aplikasi Anda untuk perangkat yang berbeda, lihat Ringkasan Kompatibilitas Perangkat.
Konvensi file
Bagian ini menjelaskan konvensi dan aturan yang secara umum berlaku bagi semua elemen dan atribut dalam file manifes.
- Elemen
- Hanya elemen
<manifest>
dan<application>
yang diperlukan. Masing-masing harus terjadi hanya satu kali. Sebagian besar elemen lainnya bisa terjadi nol atau beberapa kali. Akan tetapi, beberapa dari elemen tersebut harus ada untuk membuat file menifes berguna.Semua nilai disetel melalui atribut, bukan sebagai data karakter di dalam elemen.
Elemen yang tingkatan sama biasanya tidak diurutkan. Misalnya, elemen
<activity>
,<provider>
, dan<service>
bisa ditempatkan dalam urutan apa pun. Ada dua pengecualian utama dalam aturan ini:-
Elemen
<activity-alias>
harus mengikuti<activity>
yang merupakan sebuah alias. -
Elemen
<application>
harus menjadi elemen terakhir di dalam elemen<manifest>
.
-
Elemen
- Atribut
- Secara teknis, semua atribut bersifat opsional. Akan tetapi, banyak atribut harus ditentukan sehingga elemen bisa mencapai tujuannya. Untuk atribut yang benar-benar opsional, dokumentasi referensi menunjukkan nilai default.
Selain untuk beberapa atribut elemen root
<manifest>
, semua nama atribut dimulai dengan awalanandroid:
. Misalnya,android:alwaysRetainTaskState
. Karena awalan ini universal, dokumentasi umumnya meniadakannya saat mengacu atribut dengan nama. - Banyak nilai
- Jika lebih dari satu nilai yang dapat ditetapkan, elemen ini hampir selalu diulangi, bukan menampilkan daftar banyak nilai dalam satu elemen. Misalnya, filter intent dapat mencantumkan beberapa tindakan:
<intent-filter ... > <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.INSERT" /> <action android:name="android.intent.action.DELETE" /> ... </intent-filter>
- Nilai resource
- Beberapa memiliki nilai yang ditampilkan kepada pengguna, seperti judul suatu aktivitas atau ikon aplikasi Anda. Nilai untuk atribut ini dapat berbeda-beda tergantung bahasa pengguna atau konfigurasi perangkat lain (misalnya menyediakan ukuran ikon yang berbeda berdasarkan kepadatan piksel perangkat), jadi nilai ini harus disetel dari resource atau tema, bukan hard code ke dalam file manifes. Nilai sesungguhnya kemudian bisa berubah berdasarkan resource alternatif yang Anda sediakan untuk berbagai konfigurasi perangkat.
Resource dinyatakan sebagai nilai dengan format berikut:
"@[package:]type/name"
Anda bisa menghapus nama paket jika resource disediakan oleh aplikasi Anda (termasuk jika disediakan oleh dependensi library, karena resource library digabungkan ke resource Anda). Nama paket yang valid lainnya adalah
android
, bila Anda ingin menggunakan resource dari framework Android.Tipe adalah tipe resource seperti
string
ataudrawable
, dan nama adalah nama yang mengidentifikasi resource tertentu. Berikut contohnya:<activity android:icon="@drawable/smallPic" ... >
Untuk informasi selengkapnya tentang cara menambahkan resource dalam project Anda, baca Menyediakan Resources.
Sebagai ganti menerapkan nilai yang ditentukan dalam tema, karakter pertama harus
?
dan bukan@
:"?[package:]type/name"
- Nilai-nilai string
- Jika nilai atributnya adalah sebuah string, Anda harus menggunakan garis miring terbalik ganda (
\\
) untuk melepaskan karakter, seperti\\n
untuk baris baru\\uxxxx
untuk karakter Unicode.
Referensi elemen manifes
Tabel berikut memberikan link ke dokumen referensi untuk semua elemen yang valid dalam file AndroidManifest.xml
.
<action> |
Menambahkan tindakan ke filter intent. |
<activity> |
Mendeklarasikan komponen aktivitas. |
<activity-alias> |
Mendeklarasikan alias untuk aktivitas. |
<application> |
Deklarasi aplikasi. |
<category> |
Menambahkan nama kategori ke filter intent. |
<compatible-screens> |
Menentukan setiap konfigurasi layar dengan aplikasi yang kompatibel. |
<data> |
Menambahkan spesifikasi data ke filter intent. |
<grant-uri-permission> |
Menentukan subset data aplikasi yang diizinkan untuk diakses oleh penyedia materi induk. |
<instrumentation> |
Mendeklarasikan class Instrumentation yang memungkinkan Anda memantau interaksi aplikasi dengan sistem. |
<intent-filter> |
Menentukan tipe intent yang bisa direspons aktivitas, layanan, dan penerima siaran. |
<manifest> |
Elemen root file AndroidManifest.xml. |
<meta-data> |
Pasangan nama-nilai untuk item data arbitrer tambahan yang bisa disediakan untuk komponen induk. |
<path-permission> |
Menentukan jalur dan izin yang diperlukan untuk subset data tertentu dalam penyedia materi. |
<permission> |
Mendeklarasikan izin keamanan yang bisa digunakan untuk membatasi akses ke komponen atau fitur tertentu dari aplikasi ini atau lainnya. |
<permission-group> |
Mendeklarasikan nama untuk pengelompokan logis dari izin terkait. |
<permission-tree> |
Mendeklarasikan nama dasar untuk pohon izin. |
<provider> |
Mendeklarasikan komponen penyedia materi. |
<receiver> |
Mendeklarasikan komponen penerima siaran. |
<service> |
Mendeklarasikan komponen layanan. |
<supports-gl-texture>
| Mendeklarasikan format kompresi tekstur GL tunggal yang didukung aplikasi. |
<supports-screens> |
Mendeklarasikan ukuran layar yang didukung aplikasi Anda dan mengaktifkan mode kompatibilitas layar untuk layar yang lebih besar dari yang didukung aplikasi. |
<uses-configuration> |
Menunjukkan fitur masukan tertentu yang diperlukan aplikasi. |
<uses-feature> |
Mendeklarasikan fitur hardware atau software tunggal yang digunakan aplikasi. |
<uses-library> |
Menentukan library bersama yang harus ditautkan dengan aplikasi. |
<uses-permission> |
Menentukan izin sistem yang harus diberikan pengguna secara berurutan agar aplikasi beroperasi dengan baik. |
<uses-permission-sdk-23> |
Menentukan apakah aplikasi menginginkan izin tertentu, namun hanya jika aplikasi diinstal di perangkat yang menjalankan Android 6.0 (API level 23) atau yang lebih tinggi. |
<uses-sdk> |
Memungkinkan Anda memperlihatkan kompatibilitas aplikasi dengan satu versi platform Android atau lebih, melalui integer API level. |
Contoh manifes file
XML di bawah ini adalah contoh sederhana AndroidManifest.xml
yang mendeklarasikan dua aktivitas untuk aplikasi.
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
package="com.example.myapp">
<!-- Beware that these values are overridden by the build.gradle file -->
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- This name is resolved to com.example.myapp.MainActivity
based upon the package attribute -->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DisplayMessageActivity"
android:parentActivityName=".MainActivity" />
</application>
</manifest>