Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Izin di Android

Tujuan izin adalah untuk melindungi privasi pengguna Android. Aplikasi Android harus meminta izin untuk mengakses data pengguna yang sensitif (seperti kontak dan SMS), serta fitur sistem tertentu (seperti kamera dan internet). Bergantung pada fitur, sistem mungkin memberikan izin secara otomatis atau mungkin meminta pengguna untuk menyetujui permintaan.

Poin penting dari arsitektur keamanan Android adalah bahwa tidak ada aplikasi yang secara default memiliki izin untuk melakukan operasi apa pun yang akan berdampak buruk pada aplikasi lain, sistem operasi, atau pengguna. Hal ini termasuk membaca atau menulis data pribadi pengguna (seperti kontak atau email), membaca atau menulis file aplikasi lain, melakukan akses jaringan, menjaga perangkat tetap aktif, dan sebagainya.

Halaman ini memberikan ringkasan tentang cara kerja izin Android, termasuk jenis izin dan grupnya, serta cara izin diterapkan. Jika Anda hanya menginginkan panduan cara kerja untuk menggunakan izin aplikasi, lihat panduan tentang cara mendeklarasikan izin aplikasi dan meminta izin aplikasi.

Level perlindungan

Izin dibagi menjadi beberapa level perlindungan. Level perlindungan memengaruhi apakah permintaan izin runtime diperlukan atau tidak.

Ada tiga level perlindungan yang memengaruhi aplikasi pihak ketiga: izin normal, tanda tangan, dan berbahaya. Untuk menampilkan level perlindungan yang dimiliki oleh izin tertentu, buka halaman referensi API izin.

Izin normal

Izin Normal mencakup area tempat aplikasi Anda memerlukan data akses atau sumber di luar sandbox aplikasi, tetapi ada sedikit resiko terhadap privasi pengguna atau operasi dari aplikasi lain. Misalnya, izin untuk menyetel zona waktu adalah izin normal.

Jika aplikasi mendeklarasikan dalam manifesnya bahwa aplikasi tersebut memerlukan izin normal, sistem akan otomatis memberikan aplikasi tersebut izin pada waktu penginstalan. Sistem tidak meminta pengguna untuk memberikan izin normal, dan pengguna tidak dapat mencabut izin ini.

Izin tanda tangan

Sistem memberikan izin aplikasi ini pada waktu penginstalan, tetapi hanya saat aplikasi yang mencoba menggunakan izin ditandatangani oleh sertifikat yang sama dengan aplikasi yang menentukan izin tersebut.

Izin berbahaya

Izin Berbahaya mencakup area tempat aplikasi menginginkan data atau resource yang melibatkan informasi pribadi pengguna, atau berpotensi memengaruhi data yang disimpan pengguna atau operasi aplikasi lain. Misalnya, kemampuan untuk membaca kontak pengguna adalah izin yang berbahaya. Jika aplikasi mendeklarasikan bahwa aplikasi memerlukan izin berbahaya, pengguna harus memberikan izin secara eksplisit pada aplikasi tersebut. Sampai pengguna menyetujui izin, aplikasi Anda tidak dapat menyediakan fungsionalitas yang bergantung pada izin tersebut.

Untuk menggunakan izin berbahaya, aplikasi Anda harus meminta pengguna untuk memberikan izin saat runtime. Untuk mengetahui informasi selengkapnya tentang cara meminta izin pengguna, lihat Meminta izin pengguna untuk izin berbahaya.

Izin khusus

Ada beberapa izin yang tidak bertindak seperti izin normal dan berbahaya. SYSTEM_ALERT_WINDOW dan WRITE_SETTINGS sangat sensitif, sehingga sebagian besar aplikasi tidak boleh menggunakannya.

Pada sebagian besar kasus, aplikasi harus mendeklarasikan izin SYSTEM_ALERT_WINDOW dalam manifes, dan mengirim intent yang meminta otorisasi pengguna. Sistem akan merespons intent tersebut dengan menampilkan layar pengelolaan mendetail kepada pengguna.

Mulai Android 11 (API level 30), aplikasi yang memanggil tindakan intent ACTION_MANAGE_OVERLAY_PERMISSION tidak dapat menentukan paket. Saat aplikasi memanggil intent yang menyertakan tindakan intent ini, pengguna harus terlebih dahulu memilih aplikasi yang ingin diberi atau dicabut izinnya. Perilaku ini dimaksudkan untuk melindungi pengguna dengan membuat pemberian izin menjadi lebih intensional.

Untuk rincian bagaimana cara meminta izin ini, lihat entri referensi SYSTEM_ALERT_WINDOW dan WRITE_SETTINGS.

Izin yang disediakan oleh sistem Android dapat ditemukan di Manifest.permission.

Grup Izin

Izin dikelompokkan ke dalam grup menurut kemampuan atau fitur suatu perangkat. Dengan sistem ini, permintaan izin ditangani pada tingkat grup dan satu grup izin sesuai dengan beberapa deklarasi izin dalam manifes aplikasi. Misalnya, grup SMS menyertakan deklarasi READ_SMS dan RECEIVE_SMS. Mengelompokkan izin dengan cara ini membuat pengguna dapat menentukan pilihan yang lebih tepat dan benar, tanpa harus dibingungkan dengan permintaan izin teknis dan kompleks.

Semua izin sistem Android yang berbahaya termasuk dalam grup izin. Setiap izin dapat tergabung dalam grup izin terlepas dari level perlindungannya. Namun, izin dari grup hanya berdampak pada pengalaman pengguna jika izin tersebut berbahaya.

Sistem berperilaku dengan cara tertentu jika aplikasi Anda diinstal pada perangkat yang berjalan di Android 6.0 (API level 23) atau yang lebih baru, atau jika aplikasi Anda menargetkan Android 6.0 atau yang lebih baru. Sistem berperilaku dengan cara yang berbeda jika aplikasi diinstal pada perangkat yang berjalan di Android 5.1 (API level 22) atau yang lebih lama, atau jika aplikasi Anda menargetkan Android 5.1 atau yang lebih lama.

Jika perangkat berjalan di Android 6.0 atau yang lebih baru dan targetSdkVersion aplikasi adalah 23 atau lebih tinggi, perilaku sistem berikut berlaku saat aplikasi meminta izin berbahaya:

  • Jika saat ini aplikasi tidak memiliki izin dalam grup izin, sistem akan menampilkan dialog permintaan izin kepada pengguna yang menjelaskan grup izin yang ingin diakses aplikasi. Dialog tidak menjelaskan izin khusus dalam grup tersebut. Misalnya, jika aplikasi meminta izin READ_CONTACTS, dialog sistem hanya mengatakan bahwa aplikasi memerlukan akses ke kontak perangkat. Jika pengguna memberikan persetujuannya, sistem hanya akan memberi aplikasi izin yang diminta.
  • Jika aplikasi telah diberi izin berbahaya lain dalam grup izin yang sama, sistem segera memberikan izin tanpa ada interaksi dengan pengguna. Misalnya, jika aplikasi sebelumnya telah meminta dan diberi izin READ_CONTACTS, lalu meminta WRITE_CONTACTS, sistem akan langsung memberikan izin tersebut tanpa menampilkan dialog izin kepada pengguna.

Perhatian: Versi Android SDK yang akan datang mungkin memindahkan izin tertentu dari satu grup ke grup lain. Oleh karena itu, jangan mendasarkan logika aplikasi Anda pada struktur grup izin ini.

Misalnya, READ_CONTACTS ada dalam grup izin yang sama seperti WRITE_CONTACTS pada Android 8.1 (API level 27). Jika aplikasi Anda meminta izin READ_CONTACTS, lalu meminta izin WRITE_CONTACTS, jangan berasumsi bahwa sistem dapat otomatis memberikan izin WRITE_CONTACTS.

Jika perangkat berjalan di Android 5.1 (API level 22) atau yang lebih lama, atau targetSdkVersion aplikasi adalah 22 atau lebih rendah, sistem akan meminta izin kepada pengguna pada waktu penginstalan. Sekali lagi, sistem hanya memberi tahu pengguna grup izin yang dibutuhkan aplikasi, bukan izin individu. Misalnya, saat aplikasi meminta READ_CONTACTS, dialog penginstalan akan mencantumkan grup Kontak. Saat pengguna menerima permintaan tersebut, hanya izin READ_CONTACTS yang akan diberikan ke aplikasi.

Catatan: Aplikasi Anda tetap harus meminta setiap izin yang diperlukan secara eksplisit, meskipun pengguna telah memberikan izin lain dalam grup yang sama. Selain itu, pengelompokan izin ke dalam grup dapat berubah dalam rilis Android mendatang. Kode tidak boleh memiliki logika yang bergantung pada set izin tertentu yang berada pada grup yang sama.

Melihat izin aplikasi

Anda dapat melihat semua izin yang saat ini ditentukan dalam sistem menggunakan aplikasi Setelan dan perintah shell adb shell pm list permissions. Untuk menggunakan aplikasi Setelan, buka Setelan > Aplikasi. Pilih aplikasi dan scroll ke bawah untuk melihat izin yang digunakan aplikasi. Untuk developer, opsi -s dalam perintah adb menampilkan izin dalam bentuk yang serupa dengan cara pengguna melihatnya:

$ adb shell pm list permissions -s
All Permissions:

Network communication: view Wi-Fi state, create Bluetooth connections, full
internet access, view network state

Your location: access extra location provider commands, fine (GPS) location,
mock location sources for testing, coarse (network-based) location

Services that cost you money: send SMS messages, directly call phone numbers

...

Anda juga dapat menggunakan opsi -g adb untuk memberikan semua izin secara otomatis saat menginstal aplikasi di emulator atau perangkat pengujian:

$ adb shell install -g MyApp.apk

Penerapan izin

Izin tidak hanya untuk meminta fungsionalitas sistem. Layanan yang disediakan oleh aplikasi dapat menerapkan izin kustom untuk membatasi siapa yang dapat menggunakannya. Untuk informasi selengkapnya tentang mendeklarasikan izin kustom, lihat Menentukan izin aplikasi kustom.

Penerapan izin aktivitas

Izin yang diterapkan menggunakan atribut android:permission pada tag <activity> di dalam manifes membatasi siapa yang dapat memulai Activity. Izin diperiksa selama Context.startActivity() dan Activity.startActivityForResult(). Jika pemanggil tidak memiliki izin yang diperlukan, SecurityException akan dibuang dari panggilan.

Penerapan izin layanan

Izin yang diterapkan menggunakan atribut android:permission pada tag <service> di dalam manifes membatasi siapa yang dapat memulai atau mengikat ke Service yang terkait. Izin diperiksa selama Context.startService(), Context.stopService(), dan Context.bindService(). Jika pemanggil tidak memiliki izin yang diperlukan, SecurityException akan dibuang dari panggilan.

Penerapan izin siaran

Izin yang diterapkan menggunakan atribut android:permission pada tag <receiver> membatasi siapa yang dapat mengirim siaran ke BroadcastReceiver yang terkait. Izin diperiksa setelah Context.sendBroadcast() ditampilkan, karena sistem mencoba untuk mengirim siaran yang dikirim ke penerima yang dituju. Akibatnya, kegagalan izin tidak menghasilkan pengecualian yang dikembalikan ke pemanggil; melainkan hanya tidak menayangkan Intent.

Dengan cara yang sama, sebuah izin dapat diberikan ke Context.registerReceiver() untuk mengontrol siapa yang dapat melakukan siaran ke penerima yang terdaftar lewat program. Sebaliknya, izin dapat diberikan saat memanggil Context.sendBroadcast() untuk membatasi penerima siaran mana yang diizinkan untuk menerima siaran.

Perhatikan bahwa baik penerima maupun penyiar dapat memerlukan izin. Saat hal ini terjadi, kedua pemeriksaan izin harus lolos agar intent dapat dikirim ke target yang sesuai. Untuk informasi selengkapnya, lihat Membatasi siaran dengan izin.

Penerapan izin penyedia konten

Izin yang diterapkan menggunakan atribut android:permission pada tag <provider> membatasi siapa yang dapat mengakses data di ContentProvider. (Penyedia konten memiliki fasilitas keamanan tambahan penting yang tersedia bagi mereka yang disebut izin URI yang dijelaskan di bagian berikutnya.) Tidak seperti komponen lain, ada dua atribut izin terpisah yang dapat Anda atur: android:readPermission membatasi siapa yang dapat membaca dari penyedia, dan android:writePermission membatasi siapa yang dapat menulisnya. Perhatikan bahwa jika penyedia dilindungi dengan izin membaca dan menulis, memegang izin menulis saja tidak berarti Anda dapat membaca dari penyedia.

Izin diperiksa saat Anda pertama kali mengambil penyedia (jika Anda tidak memiliki izin apa pun, SecurityException akan ditampilkan), dan saat Anda melakukan operasi pada penyedia. Penggunaan ContentResolver.query() memerlukan izin baca; penggunaan ContentResolver.insert(), ContentResolver.update(), dan ContentResolver.delete() memerlukan izin tulis. Dalam semua kasus ini, tidak memegang izin yang diperlukan akan menyebabkan SecurityException dihapus dari panggilan.

Izin URI

Sistem izin standar yang dijelaskan sejauh ini sering tidak memadai saat digunakan dengan penyedia konten. Penyedia konten dapat melindungi dirinya dengan izin membaca dan menulis, selama klien langsungnya juga perlu menyerahkan URI tertentu ke aplikasi lain agar dapat mengoperasikannya.

Contoh umumnya adalah lampiran dalam aplikasi email. Akses ke email harus dilindungi dengan izin, karena ini adalah data sensitif pengguna. Namun, jika URI ke lampiran gambar diberikan kepada penampil gambar, penampil gambar itu tidak lagi memiliki izin untuk membuka lampiran karena tidak memiliki alasan untuk memegang izin guna mengakses semua email.

Solusi dari masalah ini adalah izin per-URI: saat memulai sebuah aktivitas atau mengembalikan hasil dari suatu aktivitas, pemanggil dapat menyetel Intent.FLAG_GRANT_READ_URI_PERMISSION dan/atau Intent.FLAG_GRANT_WRITE_URI_PERMISSION. Ini akan memberikan izin pada aktivitas yang menerima untuk mengakses URI data spesifik dalam intent, baik saat aktivitas itu memiliki izin untuk mengakses data pada penyedia konten yang terkait dengan intent atau tidak.

Mekanisme ini memungkinkan model jenis kemampuan umum di mana interaksi pengguna (misalnya membuka lampiran atau memilih kontak dari daftar) akan mendorong pemberian izin sementara yang lebih sempit. Hal ini dapat menjadi fasilitas utama untuk mengurangi permintaan izin pada aplikasi dengan hanya mengizinkan izin yang terkait langsung dengan perilaku mereka.

Untuk membuat implementasi paling aman yang membuat aplikasi lain bertanggung jawab atas tindakannya terhadap aplikasi Anda, Anda harus menggunakan izin yang sangat detail dengan cara seperti ini dan mendeklarasikan dukungan aplikasi Anda untuk aplikasi dengan atribut android:grantUriPermissions atau tag <grant-uri-permissions>.

Informasi lebih lanjut dapat ditemukan pada metode Context.grantUriPermission(), Context.revokeUriPermission(), dan Context.checkUriPermission().

Penerapan izin lainnya

Izin acak yang sangat detail dapat diterapkan pada setiap panggilan ke layanan. Hal ini tercapai dengan metode Context.checkCallingPermission(). Panggil dengan string izin yang diinginkan maka string akan menampilkan integer yang menunjukkan apakah izin tersebut telah diberikan pada proses panggilan saat ini. Perhatikan bahwa hal ini hanya dapat digunakan jika Anda mengeksekusi panggilan yang datang dari proses lain, biasanya melalui antarmuka IDL yang diterbitkan dari layanan atau cara lain yang diberikan ke proses lain.

Ada sejumlah cara berguna lainnya untuk memeriksa izin. Jika Anda memiliki ID proses (PID) dari proses lain, Anda dapat menggunakan metode Context.checkPermission() untuk memeriksa izin terhadap PID tersebut. Jika memiliki nama paket aplikasi lain, Anda dapat menggunakan metode PackageManager.checkPermission() untuk mengetahui apakah paket tertentu tersebut telah diberi izin khusus.

Pemberian izin baru secara otomatis

Seiring waktu, batasan baru dapat ditambahkan ke platform sedemikian rupa sehingga dapat menggunakan API tertentu, aplikasi Anda harus meminta izin yang sebelumnya tidak diperlukan. Karena aplikasi yang sudah ada mengasumsikan akses ke API tersebut tersedia secara bebas, Android dapat menerapkan permintaan izin baru ke manifes aplikasi untuk mencegah kerusakan aplikasi pada versi platform baru (dan memungkinkan aplikasi Anda mewarisi izin tersebut). Android memutuskan apakah aplikasi memerlukan izin berdasarkan nilai yang disediakan untuk atribut targetSdkVersion atau tidak. Jika nilainya lebih rendah daripada versi yang izinnya ditambahkan, maka Android akan menambahkan izin tersebut.

Misalnya, izin READ_EXTERNAL_STORAGE diterapkan mulai dari API level 19 untuk membatasi akses ke ruang penyimpanan bersama. Jika targetSdkVersion Anda 18 atau lebih rendah, izin akan ditambahkan ke aplikasi Anda pada versi Android yang lebih baru.

Perhatian: Jika izin otomatis ditambahkan ke aplikasi Anda, maka listing aplikasi pada Google Play akan mencantumkan izin tambahan ini meskipun aplikasi Anda mungkin tidak memerlukan izin tambahan tersebut. Untuk menghindari hal ini dan membuang izin default yang tidak dibutuhkan, selalu update targetSdkVersion Anda ke versi yang paling baru. Anda dapat melihat izin yang ditambahkan pada masing-masing rilis dalam dokumentasi Build.VERSION_CODES.

Referensi lainnya

  • Meminta izin aplikasi: Panduan cara kerja untuk meminta izin di aplikasi Anda.
  • Izin yang menyiratkan persyaratan fitur: Informasi tentang cara meminta beberapa izin akan secara implisit membatasi aplikasi Anda ke perangkat yang menyertakan fitur hardware atau software yang terkait.
  • <uses-permission>: Referensi API untuk tag manifes yang mendeklarasikan izin yang diperlukan aplikasi Anda.
  • Kompatibilitas perangkat: Informasi tentang cara Android bekerja pada jenis perangkat yang berbeda dan pengenalan mengenai cara mengoptimalkan aplikasi untuk setiap perangkat atau membatasi ketersediaan aplikasi Anda untuk perangkat berbeda.
  • Ringkasan keamanan Android: Pembahasan mendetail mengenai model keamanan platform Android.
  • "Ibu, bolehkah saya?" Meminta izin: Video dari Android Dev Summit 2015 ini menjelaskan praktik terbaik untuk meminta izin.
  • Izin Android M: Video dari Google I/O 2015 ini menjelaskan perubahan yang dibuat untuk model izin di Android 6.0.