Izin runtime

Di Android 6.0 dan yang lebih tinggi, model izin aplikasi Android dirancang untuk membuat izin lebih mudah dipahami, berguna, dan aman bagi pengguna. Model ini memindahkan aplikasi Android yang memerlukan izin berbahaya (lihat Izin yang terpengaruh) dari model izin waktu penginstalan ke model izin runtime:

  • Izin waktu penginstalan

    (Android 5.1 dan yang lebih lama) Pengguna memberikan izin berbahaya ke aplikasi saat mereka menginstal atau mengupdate aplikasi. Produsen dan operator perangkat dapat menginstal aplikasi secara default dengan izin yang telah diberikan sebelumnya tanpa memberi tahu pengguna.

  • Izin runtime

    (Android 6.0 hingga 9) Pengguna memberikan izin berbahaya ke aplikasi saat aplikasi berjalan. Waktu izin diminta (seperti saat aplikasi diluncurkan atau saat pengguna mengakses fitur tertentu) bergantung pada aplikasi, tetapi pengguna memberikan/menolak akses aplikasi ke grup izin tertentu. OEM/operator dapat menginstal aplikasi secara default, tetapi tidak dapat memberikan izin secara default kecuali jika mereka melalui proses pengecualian. (Lihat Membuat pengecualian.)

    (Android 10) Pengguna melihat peningkatan transparansi dan memiliki kontrol atas aplikasi mana yang memiliki izin runtime pengenalan aktivitas (AR). Pengguna diminta oleh dialog izin runtime untuk selalu mengizinkan, mengizinkan saat digunakan, atau menolak izin. Saat mengupgrade OS ke Android 10, izin yang diberikan ke aplikasi akan dipertahankan, tetapi pengguna dapat membuka Setelan dan mengubahnya.

Izin runtime mencegah aplikasi mendapatkan akses ke data pribadi tanpa izin pengguna, dan memberi mereka konteks dan visibilitas tambahan tentang jenis izin yang dicari aplikasi, atau telah diberikan. Model runtime mendorong developer untuk membantu pengguna memahami alasan aplikasi memerlukan izin yang diminta, dan memberikan transparansi yang lebih besar sehingga pengguna dapat membuat keputusan yang lebih baik tentang memberikan atau menolaknya.

Izin yang terpengaruh

Android 6.0 dan yang lebih tinggi memerlukan izin berbahaya untuk menggunakan model izin runtime. Izin berbahaya adalah izin berisiko lebih tinggi (seperti READ_CALENDAR) yang memberikan akses ke data pengguna pribadi, atau kontrol atas perangkat, kepada aplikasi yang meminta, yang dapat memberikan dampak negatif kepada pengguna. Untuk melihat daftar izin berbahaya, jalankan perintah:

adb shell pm list permissions -g -d

Android 6.0 dan yang lebih tinggi tidak mengubah perilaku izin normal. Ini adalah semua izin yang tidak berbahaya, termasuk izin normal, sistem, dan tanda tangan. Izin normal adalah izin dengan risiko lebih rendah (seperti SET_WALLPAPER) yang memberi aplikasi pemohon akses ke fitur tingkat aplikasi yang terisolasi dengan risiko minimal terhadap aplikasi lain, sistem, atau pengguna. Seperti pada rilis Android 5.1 dan yang lebih lama, sistem akan otomatis memberikan izin normal ke aplikasi yang meminta saat penginstalan dan tidak meminta persetujuan pengguna. Untuk mengetahui detail tentang izin, lihat dokumentasi elemen<permission>.

Pembatasan keras dan lunak di Android 10

Selain berbahaya, izin dapat dibatasi secara ketat atau dibatasi secara longgar. Dalam kedua kasus tersebut, izin yang dibatasi juga harus diizinkan. Pembatasan keras yang tidak diizinkan berperilaku berbeda dengan pembatasan lunak yang tidak diizinkan:

  • (Batasan ketat) Aplikasi tidak dapat diberi izin yang tidak diizinkan.
  • (Pembatasan lunak) Aplikasi tanpa daftar yang diizinkan akan berperilaku sesuai dengan izin tertentu yang diminta. Perilaku ini dijelaskan dalam dokumentasi publik untuk izin yang diminta.

Saat menginstal aplikasi, penginstal (seperti Google Play Store) dapat memilih untuk tidak mengizinkan izin yang dibatasi untuk aplikasi. Izin dibatasi oleh platform dan hanya dapat diberikan jika aplikasi memenuhi kriteria khusus sesuai kebijakan platform. Contoh jenis izin yang dibatasi secara ketat mencakup izin SMS dan Log Panggilan.

Pengecualian terjadi selama penginstalan, dan saat

  • aplikasi sudah diinstal selama upgrade Android 9 ke 10.
  • izin diberikan sebelumnya atau aplikasi diinstal sebelumnya.
  • izin diperlukan untuk peran yang sudah ditentukan agar mengizinkan izin tersebut.
  • penginstal (seperti Google Play Store) menandai izin sebagai diizinkan.

Pengguna tidak dapat mengizinkan izin secara manual.

Persyaratan

Model izin runtime berlaku untuk semua aplikasi, termasuk aplikasi bawaan dan aplikasi yang dikirim ke perangkat sebagai bagian dari proses penyiapan. Persyaratan software aplikasi meliputi:

  • Model izin runtime harus konsisten di semua perangkat yang menjalankan Android 6.0 dan yang lebih tinggi. Hal ini diterapkan oleh pengujian Android Compatibility Test Suite (CTS).
  • Aplikasi harus meminta pengguna untuk memberikan izin aplikasi saat runtime. Untuk mengetahui detailnya, lihat Mengupdate aplikasi. Pengecualian terbatas dapat diberikan ke aplikasi dan pengendali default yang menyediakan fungsi dasar perangkat yang mendasar untuk operasi perangkat yang diharapkan. (Misalnya, aplikasi Telepon default perangkat untuk menangani ACTION_CALL mungkin memiliki akses izin Telepon.) Untuk mengetahui detailnya, lihat Membuat pengecualian.
  • Aplikasi bawaan yang memiliki izin berbahaya harus menargetkan API level 23 dan mempertahankan model izin runtime. Artinya, alur UI selama penginstalan aplikasi tidak boleh menyimpang dari penerapan PermissionController AOSP, pengguna dapat mencabut izin berbahaya dari aplikasi bawaan, dan sebagainya.
  • Aplikasi headless harus menggunakan aktivitas untuk meminta izin atau membagikan UID dengan aplikasi lain yang memiliki izin yang diperlukan. Untuk mengetahui detailnya, lihat Aplikasi headless.

Migrasi izin

Izin yang diberikan ke aplikasi di Android 5.x tetap diberikan setelah mengupdate ke Android 6.0 atau yang lebih tinggi, tetapi pengguna dapat mencabut izin tersebut kapan saja.

Dalam update Android 9 ke 10, semua izin yang dibatasi secara ketat akan diizinkan. Untuk mengetahui detail tentang cara menerapkan izin pemisahan latar depan/latar belakang, lihat Perubahan privasi Android 10, yang dimulai dengan Meminta lokasi latar belakang.

Integrasi

Saat mengintegrasikan model izin runtime aplikasi untuk Android 6.0 dan yang lebih baru, Anda harus mengupdate aplikasi bawaan agar berfungsi dengan model baru. Anda juga dapat menentukan pengecualian untuk aplikasi yang merupakan pengendali/penyedia default untuk fungsi inti, menentukan izin kustom, dan menyesuaikan tema yang digunakan di aplikasi PermissionController.

Update aplikasi

Aplikasi di image sistem dan aplikasi yang diprainstal tidak otomatis diberi izin pra-izin. Sebaiknya Anda bekerja sama dengan developer aplikasi bawaan (OEM, operator, dan pihak ketiga) untuk melakukan modifikasi aplikasi yang diperlukan menggunakan panduan developer. Secara khusus, Anda harus memastikan bahwa aplikasi bawaan dimodifikasi untuk menghindari error dan masalah lainnya saat pengguna mencabut izin.

Aplikasi yang dimuat sebelumnya

Di Android 9 dan yang lebih lama, aplikasi bawaan yang menggunakan izin berbahaya harus menargetkan API level 23 atau yang lebih tinggi, dan mempertahankan model izin AOSP Android 6.0 dan yang lebih tinggi. Misalnya, alur UI selama penginstalan aplikasi tidak boleh menyimpang dari implementasi AOSP PermissionController. Pengguna bahkan dapat mencabut izin berbahaya aplikasi bawaan.

Di Android 6.0 hingga 9, beberapa izin diberikan selama alur penginstalan. Namun, mulai Android 10, alur penginstalan (dilakukan oleh aplikasi Package Installer) adalah fungsi terpisah dari pemberian izin (di aplikasi Permission Controller).

Aplikasi headless

Hanya aktivitas yang dapat meminta izin. Layanan tidak dapat meminta izin secara langsung.

  • Di Android 5.1 dan yang lebih lama, aplikasi headless dapat meminta izin saat diinstal, atau jika diprainstal tanpa menggunakan aktivitas.
  • Di Android 6.0 dan yang lebih tinggi, aplikasi headless harus menggunakan salah satu metode berikut untuk meminta izin:
    • Tambahkan aktivitas untuk meminta izin. (Ini adalah metode yang disarankan.)
    • Membagikan UID dengan aplikasi lain yang memiliki izin yang diperlukan. Gunakan metode ini hanya jika Anda memerlukan platform untuk menangani beberapa APK sebagai satu aplikasi.

Tujuannya adalah untuk menghindari kebingungan pengguna dengan permintaan izin yang muncul di luar konteks.

Menyesuaikan UI PackageInstaller

Jika diinginkan, Anda dapat menyesuaikan tema UI Izin dengan memperbarui tema perangkat default (Theme.DeviceDefault.Settings dan Theme.DeviceDefault.Light.Dialog.NoActionBar) yang digunakan oleh PackageInstaller. Namun, karena konsistensi sangat penting bagi developer aplikasi, Anda tidak dapat menyesuaikan penempatan, posisi, dan aturan kapan UI Izin muncul.

Untuk menyertakan string untuk bahasa tambahan, kontribusikan string ke AOSP.

Membuat pengecualian

Anda dapat memberikan izin terlebih dahulu ke aplikasi yang merupakan pengendali atau penyedia default untuk fungsi OS inti menggunakan class DefaultPermissionGrantPolicy.java di PackageManager. Contoh:

ACTION_CALL (Dialer) Default
Phone, Contacts, SMS, Microphone
SMS_DELIVER_ACTION (SMS/MMS) Default
Phone, Contacts, SMS

Menentukan izin khusus

Anda dapat menentukan izin dan grup kustom sebagai normal atau berbahaya dan menambahkan izin khusus OEM/Penyedia Layanan Seluler ke grup izin yang ada, seperti yang dapat Anda lakukan di rilis Android 5.x dan yang lebih lama.

Di Android 6.0 dan yang lebih baru, jika Anda menambahkan izin berbahaya baru, izin tersebut harus ditangani dengan cara yang sama seperti izin berbahaya lainnya (diminta selama runtime aplikasi dan dapat dicabut oleh pengguna). Khususnya:

  • Anda dapat menambahkan izin baru ke grup saat ini, tetapi Anda tidak dapat mengubah pemetaan AOSP untuk izin berbahaya dan grup izin berbahaya. (Dengan kata lain, Anda tidak dapat menghapus izin dari grup dan menetapkannya ke grup lain).
  • Anda dapat menambahkan grup izin baru di aplikasi yang diinstal di perangkat, tetapi Anda tidak dapat menambahkan grup izin baru di manifes platform.

Menguji izin

Android menyertakan pengujian Compatibility Test Suite (CTS) yang memverifikasi setiap izin dipetakan ke grup yang benar. Lulus pengujian ini adalah persyaratan untuk kompatibilitas CTS Android 6.0 dan yang lebih baru.

Mencabut izin

Di Android 13 dan yang lebih baru, Anda dapat mencabut izin runtime yang diberikan sendiri menggunakan Context.revokeSelfPermissionsOnKill(). Pencabutan terjadi secara asinkron dan dipicu saat aman untuk melakukannya tanpa mengganggu pengguna. Saat pencabutan dipicu, semua proses yang berjalan di UID panggilan akan dihentikan.

Penting untuk dipahami bahwa mencabut satu izin mungkin tidak tercermin di UI setelan, yang memperlakukan izin menurut grup. Biasanya, grup izin ditampilkan sebagai diberikan selama setidaknya salah satu izin dalam grup tersebut diberikan. Jika memastikan bahwa pengguna dapat mengonfirmasi pencabutan di setelan penting bagi Anda, pastikan untuk mencabut setiap izin di grup izin. Untuk mempelajari izin mana yang termasuk dalam grup tertentu, Anda dapat menggunakan PackageManager.getGroupOfPlatformPermission dan PackageManager.getPlatformPermissionsForGroup.

Saat mencabut izin yang diminta, sistem juga akan mencabut izin latar belakang yang sesuai jika tidak ada izin latar depan yang sesuai yang masih diberikan.

Pencabutan tidak dipicu selama proses tetap berada di latar depan, tetapi juga dapat dipicu langsung dengan menghentikan semua proses yang berjalan di uid saat ini secara manual, misalnya menggunakan System.exit(). Namun, sebaiknya biarkan sistem memutuskan kapan akan memicunya.

Setelah pencabutan izin berlaku, Anda dapat memintanya lagi, dan pengguna akan diminta untuk memberikan atau menolak permintaan tersebut. Anda tidak dapat meminta izin yang sebelumnya telah ditolak oleh pengguna. Meskipun Anda dianjurkan untuk mencabut izin yang saat ini Anda miliki, tetapi tidak lagi diperlukan, Anda harus berhati-hati agar tidak memberi tahu pengguna tentang pencabutan tersebut hingga setelah izin tersebut berlaku.