page.title=Manifes Aplikasi @jd:body

Dalam dokumen ini

  1. Struktur File Manifes
  2. Konvensi File
  3. Fitur File
    1. Filter Intent
    2. Ikon dan Label
    3. Izin
    4. Pustaka

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

Struktur File Manifes

Diagram di bawah ini menampilkan struktur umum file manifes dan setiap elemen yang bisa ditampungnya. Setiap elemen, bersama atributnya, didokumentasikan secara lengkap dalam file terpisah. Untuk melihat informasi terperinci tentang setiap elemen, klik nama elemen dalam diagram, dalam daftar abjad elemen yang mengikuti diagram, atau penyebutan nama elemen lainnya.

<?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>

Semua elemen yang bisa muncul dalam file manifes tercantum di bawah ini dalam urutan abjad. Ini adalah satu-satunya elemen legal; Anda tidak bisa menambahkan elemen atau atribut sendiri.

<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<receiver>
<service>
<supports-screens>
<uses-configuration>
<uses-feature>
<uses-library>
<uses-permission>
<uses-sdk>

Konvensi File

Sebagian konvensi dan aturan berlaku secara umum untuk semua elemen dan atribut di manifes:

Elemen
Hanya elemen <manifest> dan <application> yang diwajibkan, masing-masing harus ada dan hanya boleh terjadi sekali. Umumnya elemen lain bisa terjadi berkali-kali atau sama sekali tidak terjadi — meskipun setidaknya sebagian dari elemen itu harus ada untuk agar manifes mencapai sesuatu yang berarti.

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

Elemen yang sama tingkatan umumnya tidak diurutkan. Misalnya, elemen <activity>, <provider>, dan <service> bisa dicampur dalam urutan apa pun. (Elemen <activity-alias> merupakan eksepsi untuk aturan ini: Elemen ini harus mengikuti <activity> ini aliasnya.)

Atribut
Secara formal, semua atribut opsional. Akan tetapi, ada sebagian yang harus ditetapkan agar elemen bisa mencapai tujuannya. 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 {@code android:} — misalnya, {@code 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 konten (<provider>).

Jika mendefinisikan subkelas, seperti yang selalu Anda definisikan untuk kelas komponen ({@link android.app.Activity}, {@link android.app.Service}, {@link android.content.BroadcastReceiver}, dan {@link android.content.ContentProvider}), subkelas dideklarasikan melalui atribut {@code name}. Nama harus menyertakan tujuan paket lengkap. Misalnya, subkelas {@link android.app.Service} mungkin dideklarasikan sebagai berikut:

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

Akan tetapi, sebagai shorthand, jika karakter pertama string adalah titik, string akan ditambahkan ke nama paket aplikasi (seperti yang ditetapkan dalam elemen <manifest> melalui atribut package ). Penetapan berikut sama dengan di atas:

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

Saat memulai komponen, Android akan membuat instance subkelas yang diberi nama. Jika subkelas tidak ditetapkan, maka akak 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 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 sumber daya
Beberapa atribut memiliki nilai yang bisa ditampilkan kepada pengguna — misalnya , label dan ikon aktivitas. Nilai atribut ini harus dilokalkan dan karenanya ditetapkan dari sumber daya atau tema. Nilai sumber daya dinyatakan dalam format berikut,

{@code @[package:]type:name}

dalam hal ini nama package boleh dihilangkan jika sumber daya ada dalam paket yang sama dengan dengan aplikasi, type adalah tipe sumber daya — seperti "string" atau "drawable" — dan name adalah nama yang mengidentifikasi sumber daya tertentu. Misalnya:

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

Nilai tema diekspresikan dengan cara yang sama, namun dengan awal '{@code ?}' dan bukan '{@code @}':

{@code ?[package:]type:name}

Nilai-nilai string
Bila nilai atribut adalah string, dua garis miring kiri ('{@code \\}') harus digunakan untuk meninggalkan karakter — misalnya, '{@code \\n}' untuk baris baru atau '{@code \\uxxxx}' untuk karakter Unicode.

Fitur File

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

Filter Intent

Komponen inti dari aplikasi (aktivitasnya, layanannya, dan penerima siaran) diaktifkan oleh intent. Intent adalah sekumpulan informasi (objek {@link android.content.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 untuk merespons intent, meluncurkan instance komponen baru jika diperlukan, dan meneruskannya ke objek Intent.

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

Intent yang secara eksplisit menamai komponen target akan mengaktifkan komponen itu; filter tidak berperan. Namun intent 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 intent, lihat dokumen terpisah, Intent dan Filter Intent.

Ikon dan Label

Sejumlah elemen memiliki atribut {@code icon} dan {@code label} untuk ikon kecil dan label teks yang bisa ditampilkan kepada pengguna. Sebagian ada juga yang memiliki atribut {@code 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 bisa ditampilkan kepada pengguna.

Dalam setiap kasus, ikon dan label yang ditetapkan dalam elemen yang memuatnya menjadi {@code icon} default dan pengaturan {@code 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 — misalnya, elemen <activity> — adalah pengaturan default untuk setiap elemen komponen <intent-filter> . Jika elemen <application> menetapkan label, namun suatu aktivitas dan filter intent-nya tidak menetapkan label, maka label aplikasi akan dianggap sama-sama sebagai label aktvitas dan filter intent.

Ikon dan label yang ditetapkan untuk filter intent digunakan untuk mewakili komponen kapan saja komponen ditampilkan kepada pengguna saat memenuhi fungsi yang diiklankan oleh filter. Misalnya, filter dengan pengaturan "{@code android.intent.action.MAIN}" dan "{@code android.intent.category.LAUNCHER}" mengiklankan aktivitas sebagai aktivitas yang memulai aplikasi—, yaitu sebagai salah satu aktivitas yang harus ditampilkan dalam launcher aplikasi. Ikon dan label yang diatur dalam filter karenanya adalah ikon dan label yang ditampilkan dalam launcher.

Izin

Sebuah 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. Misalnya, berikut ini adalah beberapa izin yang didefinisikan oleh Android:

{@code android.permission.CALL_EMERGENCY_NUMBERS}
{@code android.permission.READ_OWNER_DATA}
{@code android.permission.SET_WALLPAPER}
{@code android.permission.DEVICE_POWER}

Sebuah fitur bisa dilindungi paling banyak oleh satu izin.

Jika aplikasi memerlukan akses ke fitur yang dilindungi oleh izin, aplikasi harus mendeklarasikan bahwa aplikasi memerlukan izin itu dengan elemen <uses-permission> dalam manifes. Kemudian, bila aplikasi telah diinstal pada perangkat, installer akan menentukan apakah izin yang diminta akan diberikan atau tidak 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 akan gagal tanpa ada pemberitahuan apa pun kepada pengguna.

Aplikasi juga bisa melindungi komponennya sendiri (aktivitas, layanan, penerima siaran, dan penyedia konten) dengan izin. Aplikasi bisa menerapkan izin mana pun yang didefinisikan oleh Android (tercantum dalam {@link android.Manifest.permission android.Manifest.permission}) atau dideklarasikan oleh aplikasi lain. Atau aplikasi bisa mendefinisikannya sendiri. Izin baru dideklarasikan dengan elemen <permission> . Misalnya, aktivitas dapat dilindungi sebagai 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 {@code DEBIT_ACCT} tidak hanya dideklarasikan dengan elemen <permission> , penggunaannya juga diminta dengan elemen <uses-permission> . Penggunaannya harus diminta agar komponen aplikasi lainnya bisa menjalankan aktivitas yang dilindungi, meskipun perlindungan itu diberlakukan oleh aplikasi itu sendiri.

Dalam contoh yang sama, jika atribut {@code permission} ditetapkan untuk izin yang dideklarasikan di tempat lain lain (seperti {@code android.permission.CALL_EMERGENCY_NUMBERS}, maka atribut tidak perlu mendeklarasikannya lagi dengan elemen <permission> . Akan tetapi, penggunaannya masih perlu dengan <uses-permission>.

Elemen <permission-tree> mendeklarasikan namespace untuk grup izin yang akan 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 mana dimiliki grup; elemen hanya memberi nama grup. Izin ditempatkan 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, ContentProvider, dan sebagainya).

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