Setiap project aplikasi harus memiliki file AndroidManifest.xml
, yang
bernama persis 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:
- Komponen aplikasi, termasuk semua aktivitas, layanan, penerima siaran, dan penyedia konten. Tiap komponen harus menentukan properti dasar, seperti nama Kotlin atau class Java. Komponen tersebut juga mendeklarasikan kemampuan, seperti konfigurasi perangkat yang dapat ditangani, dan filter intent yang menjelaskan cara komponen dapat dimulai. Baca selengkapnya tentang komponen aplikasi di bagian berikut.
- Izin yang diperlukan aplikasi untuk mengakses bagian sistem atau aplikasi lain yang dilindungi. File manifes ini juga mendeklarasikan semua izin yang harus dimiliki aplikasi jika ingin mengakses konten dari aplikasi ini. Baca selengkapnya tentang izin di bagian berikut.
- Fitur hardware dan software yang diperlukan aplikasi, yang memengaruhi perangkat mana yang dapat menginstal aplikasi dari Google Play. Baca selengkapnya tentang kompatibilitas perangkat di bagian berikut.
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 karakter yang paling penting dari aplikasi Anda direfleksikan dalam file manifes.
Komponen aplikasi
Untuk setiap komponen aplikasi yang Anda buat di aplikasi, deklarasikan elemen XML yang bersangkutan dalam file manifes:
<activity>
untuk setiap subclass dariActivity
<service>
untuk setiap subclass dariService
<receiver>
untuk setiap subclass dariBroadcastReceiver
<provider>
untuk setiap subclass dariContentProvider
Jika Anda membuat subclass untuk salah satu komponen ini tanpa mendeklarasikannya dalam file manifes, sistem tidak akan dapat memulainya.
Tentukan nama subclass Anda dengan atribut
name
, menggunakan penetapan paket lengkap. Misalnya, subclass
Activity
dideklarasikan sebagai berikut:
<manifest ... > <application ... > <activity android:name="com.example.myapp.MainActivity" ... > </activity> </application> </manifest>
Namun, jika karakter pertama dalam nilai name
adalah titik,
namespace aplikasi, dari properti namespace
milik file
build.gradle
level modul, akan
diletakkan sebelum nama. Misalnya, jika namespace adalah
"com.example.myapp"
, nama aktivitas berikut akan me-resolve ke
com.example.myapp.MainActivity
:
<manifest ... > <application ... > <activity android:name=".MainActivity" ... > ... </activity> </application> </manifest>
Untuk mengetahui informasi cara menetapkan nama paket atau namespace lebih lanjut, lihat Menetapkan namespace.
Jika Anda memiliki komponen aplikasi 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 yang sepenuhnya memenuhi syarat.
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 diharapkan untuk melakukan tindakan, dan petunjuk lainnya.
Jika aplikasi mengeluarkan intent ke sistem, sistem ini akan mencari komponen
aplikasi yang dapat menangani intent berdasarkan deklarasi filter intent
dalam setiap file manifes aplikasi. Sistem meluncurkan
instance komponen yang sesuai dan meneruskan objek Intent
ke komponen tersebut. Jika lebih dari satu aplikasi dapat
menangani intent, maka pengguna dapat memilih aplikasi mana yang akan digunakan.
Sebuah komponen aplikasi dapat 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 pun yang dideklarasikan untuk komponen induk, baik
elemen <activity>
maupun
<application>
.
Anda mungkin ingin mengubah ikon filter intent jika filter menyediakan tindakan unik yang ingin Anda tunjukkan dengan lebih baik dalam dialog pemilih. Untuk mengetahui informasi selengkapnya, lihat Mengizinkan 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 dapat menyetujui atau menolak beberapa izin aplikasi selama runtime. 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 dapat menggunakan fitur yang
dilindungi. Jika tidak, upaya aplikasi untuk mengakses fitur tersebut akan gagal.
Aplikasi dapat juga melindungi komponennya sendiri dengan izin. Aplikasi tersebut dapat memiliki
semua izin yang ditentukan oleh Android, seperti yang dicantumkan dalam
android.Manifest.permission
, atau izin
yang dideklarasikan dalam aplikasi lain. Aplikasi Anda juga dapat menentukan izinnya sendiri.
Izin baru akan dideklarasikan dengan elemen
<permission>
.
Untuk mengetahui informasi selengkapnya, lihat Izin di Android.
Kompatibilitas perangkat
File manifes juga merupakan tempat Anda dapat mendeklarasikan tipe fitur hardware atau software yang dibutuhkan aplikasi Anda, pun demikian, tipe perangkat yang kompatibel dengan aplikasi tersebut. Google Play Store tidak mengizinkan pengguna menginstal aplikasi di perangkat yang tidak menyediakan fitur atau versi sistem yang dibutuhkan aplikasi.
Ada beberapa tag manifes yang menentukan perangkat yang kompatibel dengan aplikasi Anda. Berikut ini adalah 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 dapat mencapai fungsi
dasar di perangkat tanpa sensor kompas, Anda dapat mendeklarasikan sensor
kompas seperti yang diperlukan bersama tag manifes berikut:
<manifest ... > <uses-feature android:name="android.hardware.sensor.compass" android:required="true" /> ... </manifest>
Catatan: Jika Anda ingin menyediakan aplikasi Anda di Chromebook, ada beberapa batasan fitur hardware dan software penting yang perlu dipertimbangkan. Untuk mengetahui informasi selengkapnya, lihat Kompatibilitas manifes aplikasi untuk Chromebooks.
<uses-sdk>
Setiap urutan versi platform seringkali 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
-nya
.
Namun, perhatikan bahwa atribut dalam elemen <uses-sdk>
digantikan oleh properti yang sesuai
dalam file build.gradle
.
Jadi, jika Anda menggunakan Android Studio, tentukan nilai minSdkVersion
dan
targetSdkVersion
di sini:
Groovy
android { defaultConfig { applicationId 'com.example.myapp' // Defines the minimum API level required to run the app. minSdkVersion 21 // Specifies the API level used to test the app. targetSdkVersion 33 ... } }
Kotlin
android { defaultConfig { applicationId = "com.example.myapp" // Defines the minimum API level required to run the app. minSdkVersion(21) // Specifies the API level used to test the app. targetSdkVersion(33) ... } }
Untuk informasi selengkapnya tentang file build.gradle
, baca tentang cara mengonfigurasi 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 tidak terjadi atau terjadi beberapa kali. Akan tetapi, beberapa dari elemen tersebut harus ada untuk membuat file manifes berguna.Semua nilai diatur melalui atribut, bukan sebagai data karakter dalam elemen.
Elemen yang tingkatannya sama biasanya tidak diurutkan. Misalnya, elemen
<activity>
,<provider>
, dan<service>
dapat 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 dapat mencapai tujuannya.
Untuk atribut yang benar-benar opsional, dokumentasi referensi
menunjukkan nilai default.
Kecuali untuk beberapa atribut elemen
<manifest>
root, semua nama atribut dimulai dengan awalanandroid:
, sepertiandroid: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 hardcode ke dalam
file manifes. Nilai sebenarnya untuk selanjutnya dapat berubah berdasarkan resource
alternatif yang Anda sediakan untuk bermacam-macam konfigurasi perangkat.
Resource dinyatakan sebagai nilai dengan format berikut:
"@[package:]type/name"
Anda dapat menghapus nama package jika resource disediakan oleh aplikasi Anda (termasuk jika disediakan oleh dependensi library, karena resource library digabungkan ke resource Anda). Nama paket valid lainnya adalah
android
, bila Anda ingin menggunakan resource dari framework Android.Tipe type adalah tipe resource, seperti
string
ataudrawable
, dan name adalah nama yang mengidentifikasi resource tertentu. Berikut contohnya:<activity android:icon="@drawable/smallPic" ... >
Untuk mengetahui informasi selengkapnya tentang cara menambahkan resource ke project Anda, baca Ringkasan resource aplikasi.
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, gunakan garis miring terbalik ganda
(
\\
) untuk melepaskan karakter, seperti\\n
untuk baris baru atau\\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> |
Mendeklarasikan aplikasi. |
<category> |
Menambahkan nama kategori ke filter intent. |
<compatible-screens> |
Menentukan setiap konfigurasi layar yang kompatibel dengan aplikasi. |
<data> |
Menambahkan spesifikasi data ke filter intent. |
<grant-uri-permission> |
Menentukan subkumpulan data aplikasi yang boleh diakses oleh penyedia konten induknya. |
<instrumentation> |
Mendeklarasikan class Instrumentation yang memungkinkan Anda
memantau interaksi aplikasi dengan sistem. |
<intent-filter> |
Menentukan jenis intent yang dapat direspons oleh aktivitas, layanan, atau penerima siaran. |
<manifest> |
Elemen root file AndroidManifest.xml . |
<meta-data> |
Pasangan nama-nilai untuk item data arbitrer tambahan yang dapat diberikan ke komponen induk. |
<path-permission> |
Menentukan jalur dan izin yang diperlukan untuk subset data tertentu dalam penyedia konten. |
<permission> |
Mendeklarasikan izin keamanan yang dapat digunakan untuk membatasi akses ke komponen atau fitur tertentu milik aplikasi ini atau aplikasi lainnya. |
<permission-group> |
Mendeklarasikan nama untuk pengelompokan logis izin yang berkaitan. |
<permission-tree> |
Mendeklarasikan nama dasar untuk hierarki izin. |
<provider> |
Mendeklarasikan komponen penyedia konten. |
<queries> |
Mendeklarasikan kumpulan aplikasi lain yang ingin diakses oleh aplikasi Anda. Pelajari lebih lanjut dalam panduan tentang pemfilteran visibilitas paket. |
<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 input tertentu yang diperlukan aplikasi. |
<uses-feature> |
Mendeklarasikan fitur hardware atau software tunggal yang digunakan aplikasi. |
<uses-library> |
Menentukan library bersama yang harus ditautkan ke aplikasi. |
<uses-native-library> |
Menentukan library bersama native yang disediakan vendor yang harus ditautkan ke aplikasi. |
<uses-permission> |
Menentukan izin sistem yang harus diberikan pengguna agar aplikasi dapat beroperasi dengan benar. |
<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 versi yang lebih tinggi. |
<uses-sdk> |
Memungkinkan Anda untuk memperlihatkan kompatibilitas aplikasi dengan satu atau beberapa versi platform Android, dengan menggunakan integer API level. |
Batas
Tag berikut memiliki batas jumlah kemunculan dalam file manifes:
Nama Tag | Batas |
---|---|
<package> |
1000 |
<meta-data> |
1000 |
<uses-library> |
1000 |
Atribut berikut memiliki batas panjang maksimum:
Atribut | Batas |
---|---|
name |
1024 |
versionName |
1024 |
host |
255 |
mimeType |
255 |
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">
<!-- 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 on the namespace property in the build.gradle file -->
<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>