Ringkasan manifes aplikasi

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:

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.

Komponen aplikasi dapat memiliki filter intent dalam jumlah berapa pun (ditentukan dengan elemen <intent-filter>), masing-masing menjelaskan kemampuan yang berbeda dari komponen tersebut.

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, kepada pengguna untuk komponen aplikasi yang sesuai.

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>.
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 awalan android:, seperti 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 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 atau drawable, 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 atribut adalah string, gunakan garis miring terbalik ganda (\\) untuk meng-escape 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.

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>