lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

Manifes Aplikasi

Setiap aplikasi harus memiliki file AndroidManifest.xml (bernama persis seperti ini) di direktori akar. File manifes menyediakan informasi penting tentang aplikasi ke sistem Android, yang harus dimiliki sistem agar bisa menjalankan setiap kode aplikasi.

Yang dilakukan file manifes di antaranya:

  • Menamai paket Java untuk aplikasi. Nama paket berfungsi sebagai identifier unik untuk aplikasi.
  • Menjelaskan berbagai komponen aplikasi, yang menyertakan aktivitas, layanan, penerima siaran, dan penyedia materi yang membentuk aplikasi. Juga menamai kelas yang mengimplementasikan masing-masing komponen dan menerbitkan kemampuannya, seperti pesan Intent yang dapat mereka tangani. Deklarasi ini menginformasikan sistem Android mengenai komponen dan kondisi yang memungkinkan peluncurannya.
  • Menentukan proses yang menjadi host komponen aplikasi.
  • Mendeklarasikan izin aplikasi yang harus dimiliki aplikasi untuk mengakses bagian yang dilindungi pada API dan berinteraksi dengan aplikasi lain. Juga mendeklarasikan izin lain yang harus dimiliki untuk berinteraksi dengan komponen aplikasi.
  • Mencantumkan daftar kelas Instrumentation yang memberikan profil dan informasi lain saat aplikasi berjalan. Deklarasi ini hanya ada di manifes saat aplikasi dibuat dan dihapus sebelum aplikasi dipublikasikan.
  • Mendeklarasikan level minimum Android API yang diperlukan aplikasi.
  • Mencantumkan daftar pustaka yang harus ditautkan aplikasi.

Catatan: Saat Anda mempersiapkan aplikasi Android berjalan di Chromebook, ada beberapa keterbatasan fitur perangkat keras dan perangkat lunak yang harus Anda pertimbangkan. Lihat dokumen Kompatibilitas Manifes Aplikasi untuk Chromebook untuk informasi selengkapnya.

Struktur file manifes

Cuplikan kode di bawah ini menampilkan struktur umum file manifes dan setiap elemen yang bisa ditampungnya. Setiap elemen, bersama atributnya secara lengkap didokumentasikan dalam file terpisah.

Tip: Untuk melihat informasi mendetail mengenai elemen mana saja yang disebut di dalam teks dokumen ini, cukup klik nama elemen.

Inilah contoh file manifes:

<?xml version="1.0" encoding="utf-8"?>

<manifest>

    <uses-permission />
    <permission />
    <permission-tree />
    <permission-group />
    <instrumentation />
    <uses-sdk />
    <uses-configuration />  
    <uses-feature />  
    <supports-screens />  
    <compatible-screens />  
    <supports-gl-texture />  

    <application>

        <activity>
            <intent-filter>
                <action />
                <category />
                <data />
            </intent-filter>
            <meta-data />
        </activity>

        <activity-alias>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </activity-alias>

        <service>
            <intent-filter> . . . </intent-filter>
            <meta-data/>
        </service>

        <receiver>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </receiver>

        <provider>
            <grant-uri-permission />
            <meta-data />
            <path-permission />
        </provider>

        <uses-library />

    </application>

</manifest>

Daftar berikut berisi semua elemen yang dapat muncul dalam file manifes sesuai urutan abjad:

Catatan: Ini adalah satu-satunya elemen legal – Anda tidak bisa menambahkan elemen atau atribut sendiri.

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 ada dan hanya boleh terjadi sekali. Kebanyakan elemen lain bisa terjadi berulang-kali atau tidak terjadi sama sekali. Akan tetapi, sekurangnya beberapa dari elemen ini harus ada sebelum file manifes dapat digunakan.

Jika elemen tidak berisi apa pun, berarti elemen itu berisi elemen lain. Semua nilai diatur melalui atribut, bukan sebagai data karakter di dalam elemen.

Elemen pada tingkatan yang sama biasanya tidak diurutkan. Misalnya, elemen <activity>, <provider>, dan <service> bisa dicampur 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>. Dengan kata lain, tag penutup </application> harus segera muncul sebelum tag penutup </manifest>.
Atribut
Secara formal, semua atribut bersifat opsional. Akan tetapi, ada beberapa atribut yang harus ditetapkan agar elemen bisa mencapai maksudnya. Gunakan dokumentasi sebagai panduan. Bagi atribut yang benar-benar opsional, ini menyebutkan nilai default atau menyatakan apa yang terjadi jika tidak ada spesifikasi.

Selain untuk beberapa atribut elemen akar <manifest>, semua nama atribut dimulai dengan awalan android:. Misalnya, android:alwaysRetainTaskState. Karena awalan ini universal, dokumentasi umumnya meniadakannya saat mengacu atribut dengan nama.

Mendeklarasikan nama kelas
Banyak elemen berhubungan dengan objek Java, termasuk elemen aplikasi itu sendiri (elemen <application>) dan aktivitas komponen utamanya (<activity>), layanan (<service>), penerima siaran (<receiver>), dan penyedia materi (<provider>).

Jika mendefinisikan subkelas, seperti yang selalu Anda definisikan untuk kelas komponen (Activity, Service, BroadcastReceiver, dan ContentProvider), subkelas dideklarasikan melalui atribut name. Nama harus menyertakan tujuan paket lengkap. Misalnya, subkelas Service mungkin dideklarasikan seperti berikut:

<manifest . . . >
    <application . . . >
        <service android:name="com.example.project.SecretService" . . . >
            . . .
        </service>
        . . .
    </application>
</manifest>

Akan tetapi, jika karakter pertama string adalah titik, string akan ditambahkan ke nama paket aplikasi (sebagaimana ditetapkan oleh elemen <manifest> melalui atribut package). Penunjukan berikut sama dengan yang ditunjukkan di atas:

<manifest package="com.example.project" . . . >
    <application . . . >
        <service android:name=".SecretService" . . . >
            . . .
        </service>
        . . .
    </application>
</manifest>

Saat memulai komponen, sistem Android akan membuat instance dari subkelas yang diberi nama. Jika subkelas tidak ditetapkan, maka akan dibuat instance kelas dasar.

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 maksud bisa mencantumkan sejumlah 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 sumber daya
Beberapa atribut memiliki nilai yang bisa ditampilkan kepada pengguna, seperti label dan ikon aktivitas. Nilai atribut ini harus dilokalkan dan ditetapkan dari sumber daya atau tema. Nilai sumber daya dinyatakan dalam format berikut:

@[<i>package</i>:]<i>type</i>/<i>name</i>

Anda bisa meniadakan nama paket jika sumber daya berada dalam paket yang sama dengan aplikasi. Type adalah tipe sumber daya seperti string atau drawable, dan name adalah nama yang mengidentifikasi sumber daya tertentu. Inilah contohnya:

<activity android:icon="@drawable/smallPic" . . . >

Nilai-nilai dari sebuah tema diekspresikan secara sama, namun dengan awalan ? sebagai ganti @:

?[<i>package</i>:]<i>type</i>/<i>name</i>

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.

Fitur file

Bagian berikut menjelaskan cara menerapkan sebagian fitur Android dalam file manifes.

Filter maksud

Komponen inti dari aplikasi (aktivitasnya, layanannya, dan penerima siaran) diaktifkan oleh maksud. Maksud adalah sekumpulan informasi (objek Intent) yang menjelaskan tindakan yang diinginkan termasuk data yang akan ditindaklanjuti, kategori komponen yang harus melakukan tindakan, dan petunjuk terkait lainnya. Android mencari komponen yang sesuai yang dapat merespons maksud, meluncurkan instance komponen baru jika diperlukan, dan meneruskannya ke objek Intent.

Komponen mengiklankan tipe maksud yang dapat mereka respons melalui filter maksud. Karena sistem Android harus mempelajari maksud yang dapat ditangani komponen sebelum meluncurkan komponen, filter maksud ditetapkan dalam manifes sebagai elemen <intent-filter>. Sebuah komponen bisa memiliki filter dalam jumlah berapa saja, masing-masing menjelaskan kemampuan yang berbeda.

Maksud yang secara eksplisit menamai suatu komponen target akan mengaktifkan komponen itu; filter tidak berperan. Maksud yang tidak menetapkan target dengan nama dapat mengaktifkan komponen hanya jika dapat melewati salah satu filter komponen.

Untuk informasi tentang cara objek Intent diuji terhadap filter maksud, lihat dokumen Maksud dan Filter Maksud.

Ikon dan label

Sejumlah elemen memiliki atribut icon dan label untuk ikon kecil dan label teks yang bisa ditampilkan kepada pengguna. Sebagian ada juga yang memiliki atribut description untuk teks penjelasan yang lebih panjang yang juga bisa ditampilkan pada layar. Misalnya, elemen <permission> memiliki ketiga atribut ini, jadi saat pengguna ditanya apakah akan memberi izin bagi aplikasi yang memintanya, ikon yang mewakili izin, nama izin, dan keterangan yang mengikutinya semua ditampilkan kepada pengguna.

Dalam setiap kasus, ikon dan label yang ditetapkan dalam elemen yang memuatnya menjadi icon default dan setelan label untuk semua subelemen kontainer ini. Karena itu, ikon dan label yang ditetapkan dalam elemen <application> adalah ikon dan label default untuk setiap komponen aplikasi. Demikian pula, ikon dan label yang ditetapkan untuk komponen, seperti elemen <activity> adalah setelan default untuk setiap elemen komponen <intent-filter>. Jika elemen <application> menetapkan label, namun suatu aktivitas dan filter maksudnya tidak menetapkan label, maka label aplikasi akan dianggap sama-sama sebagai label aktivitas dan filter maksud.

Ikon dan label yang ditetapkan untuk filter maksud digunakan untuk mewakili komponen kapan saja komponen ditampilkan kepada pengguna dan memenuhi fungsi yang diiklankan oleh filter. Misalnya, filter dengan setelan android.intent.action.MAIN dan android.intent.category.LAUNCHER mengiklankan aktivitas sebagai aktivitas yang memulai aplikasi. Yaitu sebagai salah satu aktivitas yang harus ditampilkan dalam peluncur aplikasi. Ikon dan label yang ditetapkan dalam filter ditampilkan dalam peluncur.

Izin

Izin adalah pembatasan yang membatasi akses ke bagian kode atau ke data pada perangkat. Pembatasan diberlakukan untuk melindungi data dan kode penting yang bisa disalahgunakan untuk mengganggu atau merusak pengalaman pengguna.

Setiap izin diidentifikasi melalui label yang unik. Sering kali, label menunjukkan tindakan yang dibatasi. Berikut beberapa izin yang didefinisikan oleh Android:

  • android.permission.CALL_EMERGENCY_NUMBERS
  • android.permission.READ_OWNER_DATA
  • android.permission.SET_WALLPAPER
  • android.permission.DEVICE_POWER

Sebuah fitur bisa dilindungi oleh satu izin saja.

Jika aplikasi memerlukan akses ke fitur yang dilindungi oleh izin, aplikasi harus mendeklarasikan bahwa aplikasi memerlukan izin itu dengan elemen <uses-permission> dalam manifes. Bila aplikasi telah dipasang pada perangkat, pemasang akan menentukan apakah akan memberikan izin yang diminta dengan memeriksa otoritas yang menandatangani sertifikat aplikasi dan, dalam beberapa kasus, bertanya pada pengguna. Jika izin diberikan, aplikasi tersebut bisa menggunakan fitur yang dilindungi. Jika tidak, upaya aplikasi untuk mengakses fitur tersebut gagal tanpa notifikasi apa pun kepada pengguna.

Aplikasi dapat juga melindungi komponennya sendiri dengan izin. Aplikasi bisa menerapkan izin mana pun yang didefinisikan oleh Android, sebagaimana tercantum dalam android.Manifest.permission, atau dideklarasikan oleh aplikasi lain. Aplikasi juga dapat mendefinisikan sendiri. Izin baru dideklarasikan dengan elemen <permission>. Misalnya, aktivitas dapat dilindungi seperti berikut:

<manifest . . . >
    <permission android:name="com.example.project.DEBIT_ACCT" . . . />
    <uses-permission android:name="com.example.project.DEBIT_ACCT" />
    . . .
    <application . . .>
        <activity android:name="com.example.project.FreneticActivity"
                  android:permission="com.example.project.DEBIT_ACCT"
                  . . . >
            . . .
        </activity>
    </application>
</manifest>

Perhatikan, dalam contoh ini izin DEBIT_ACCT tidak hanya dideklarasikan dengan elemen <permission>, penggunaannya juga diminta dengan elemen <uses-permission>. Anda harus meminta penggunaannya agar komponen aplikasi lainnya bisa menjalankan aktivitas yang dilindungi, meskipun perlindungan itu diberlakukan oleh aplikasi itu sendiri.

Jika dalam contoh yang sama yang ditunjukkan di atas, atribut permission ditetapkan untuk izin yang dideklarasikan di tempat lain (seperti android.permission.CALL_EMERGENCY_NUMBERS, maka atribut tidak perlu mendeklarasikannya lagi dengan elemen <permission>. Akan tetapi, meminta penggunaannya masih perlu dengan <uses-permission>.

Elemen <permission-tree> mendeklarasikan namespace untuk grup izin yang didefinisikan dalam kode, dan <permission-group> mendefinisikan label untuk seperangkat izin, yang sama-sama dideklarasikan dalam manifes dengan elemen <permission> dan yang dideklarasikan di tempat lain. Ini hanya memengaruhi cara izin dikelompokkan saat ditampilkan kepada pengguna. Elemen <permission-group> tidak menetapkan izin yang menjadi milik grup, namun hal itu menamai sebuah grup. Anda bisa menempatkan izin dalam grup dengan memberikan nama grup ke elemen <permission> melalui atribut permissionGroup.

Pustaka

Setiap aplikasi ditautkan dengan pustaka default Android, yang menyertakan paket dasar untuk membangun aplikasi (dengan kelas umum seperti Activity, Service, Intent, View, Button, Application, dan ContentProvider).

Akan tetapi, sebagian paket berada dalam pustakanya sendiri. Jika aplikasi Anda menggunakan kode salah satu paket ini, aplikasi secara eksplisit minta untuk ditautkan dengan paket tersebut. Manifes harus berisi elemen <uses-library> yang terpisah untuk menamai setiap pustaka. Anda bisa menemukan nama pustaka dalam dokumentasi untuk paket.