Saat membuat aplikasi, penting agar mempertimbangkan satu set paket, mewakili aplikasi yang diinstal lainnya di perangkat, yang akan diakses aplikasi Anda. Jika aplikasi Anda menargetkan Android 11 (API level 30) atau lebih tinggi, sistem akan membuat beberapa aplikasi otomatis terlihat oleh aplikasi Anda, tetapi aplikasi lain akan disembunyikan secara default. Dengan membuat beberapa aplikasi tidak terlihat secara default, sistem membantu menegakkan prinsip hak istimewa terendah dengan memberi tahu sistem mengenai aplikasi lain mana yang terlihat oleh aplikasi Anda, serta membantu app store seperti Google Play menilai privasi dan keamanan yang diberikan aplikasi kepada pengguna.
Perbedaan dalam visibilitas aplikasi ini memengaruhi tampilan hasil metode yang
memberikan informasi tentang aplikasi lain, seperti
queryIntentActivities()
.
Perbedaan visibilitas juga memengaruhi interaksi eksplisit dengan aplikasi lain,
seperti memulai layanan aplikasi lain.
Panduan ini mencantumkan satu set aplikasi yang otomatis terlihat oleh aplikasi Anda dan menjelaskan cara membuat aplikasi lain dapat terlihat oleh aplikasi Anda. Panduan ini juga memberikan beberapa saran tentang bagaimana Anda dapat mengonfigurasi pesan log untuk menentukan bagaimana visibilitas aplikasi lain memengaruhi aplikasi Anda.
Aplikasi yang otomatis terlihat
Sistem secara otomatis membuat beberapa aplikasi terlihat oleh aplikasi Anda agar
dapat berinteraksi tanpa perlu mendeklarasikan elemen <queries>
. Perilaku
ini membantu mendukung fungsionalitas dasar dan kasus penggunaan umum.
Secara khusus, jenis aplikasi berikut selalu terlihat oleh aplikasi Anda, meskipun ditargetkan untuk Android 11 (API level 30) atau yang lebih tinggi:
- Aplikasi Anda sendiri.
- Paket sistem tertentu, seperti penyedia media, yang mengimplementasikan fungsionalitas inti Android. Pelajari selengkapnya tentang cara menentukan paket mana yang otomatis terlihat di perangkat yang menjalankan aplikasi Anda.
- Aplikasi yang menginstal aplikasi Anda.
- Semua aplikasi yang meluncurkan aktivitas in aplikasi Anda menggunakan
metode
startActivityForResult()
, seperti yang dijelaskan pada panduan tentang cara mendapatkan hasil dari suatu aktivitas. - Semua aplikasi yang memulai atau terikat pada layanan di aplikasi Anda.
- Semua aplikasi yang mengakses penyedia konten di aplikasi Anda.
- Semua aplikasi yang memiliki penyedia konten, tempat aplikasi Anda telah diberikan izin URI untuk mengakses penyedia konten tersebut.
- Semua aplikasi yang menerima input dari aplikasi Anda. Hal ini berlaku hanya jika aplikasi Anda memberikan input sebagai editor metode input.
Selain itu, Anda dapat memulai aktivitas aplikasi menggunakan intent implisit atau eksplisit, terlepas dari apakah aplikasi lain tersebut terlihat oleh aplikasi Anda.
Paket sistem yang otomatis terlihat
Beberapa paket sistem yang otomatis mengimplementasikan fungsionalitas Android inti dapat terlihat oleh aplikasi Anda, meskipun aplikasi Anda menargetkan Android 11 (API level 30) atau yang lebih tinggi. Satu set paket tertentu bergantung pada perangkat yang menjalankan aplikasi Anda.
Guna melihat daftar lengkap paket untuk perangkat tertentu, jalankan perintah berikut di terminal pada mesin pengembangan Anda:
adb shell dumpsys package queries
Di output perintah, temukan bagian forceQueryable
. Bagian ini menyertakan
daftar paket yang telah dibuat perangkat dapat otomatis terlihat oleh aplikasi Anda.
Mendeklarasikan bahwa aplikasi Anda berinteraksi dengan kumpulan tertentu aplikasi lain
Jika aplikasi menargetkan Android 11 (API level 30) atau yang lebih tinggi dan harus berinteraksi
dengan aplikasi selain yang otomatis terlihat
, tambahkan <queries>
elemen
file manifes aplikasi Anda. Di dalam elemen <queries>
, tentukan aplikasi lain berdasarkan
nama paket, berdasarkan tanda tangan intent, atau berdasarkan
otoritas penyedia, seperti yang dijelaskan di bagian
berikut.
Mengkueri dan berinteraksi dengan paket tertentu
Jika Anda mengetahui kumpulan spesifik aplikasi yang ingin dibuat kuerinya atau dilibatkan dalam
interaksi, seperti aplikasi yang dapat terintegrasi dengan aplikasi Anda, atau aplikasi yang layanannya Anda
gunakan, sertakan nama paketnya dalam kumpulan elemen <package>
di dalam elemen
<queries>
:
<manifest package="com.example.game"> <queries> <package android:name="com.example.store" /> <package android:name="com.example.services" /> </queries> ... </manifest>
Membuat kueri dan berinteraksi dengan aplikasi menggunakan filter intent
Aplikasi Anda mungkin perlu membuat kueri atau berinteraksi dengan kumpulan aplikasi yang memiliki
tujuan tertentu, tetapi Anda mungkin tidak mengetahui nama paket khusus yang perlu
disertakan. Dalam situasi ini, Anda dapat mencantumkan
tanda tangan filter intent dalam
elemen <queries>
. Aplikasi Anda kemudian dapat menemukan aplikasi yang memiliki
elemen
<intent-filter>
yang cocok.
Contoh berikut memungkinkan aplikasi Anda melihat aplikasi terinstal yang mendukung fitur berbagi gambar JPEG:
<manifest package="com.example.game"> <queries> <intent> <action android:name="android.intent.action.SEND" /> <data android:mimeType="image/jpeg" /> </intent> </queries> ... </manifest>
Elemen <intent>
memiliki beberapa batasan:
- Anda harus menyertakan tepat satu elemen
<action>
. - Anda tidak boleh menggunakan atribut
path
,pathPrefix
,pathPattern
, atauport
dalam elemen<data>
. Sistem berperilaku seolah-olah Anda menetapkan setiap nilai atribut menjadi karakter pengganti generik (*
). - Anda tidak boleh menggunakan atribut
mimeGroup
dari elemen<data>
. Dalam beberapa elemen
<data>
dari satu elemen<intent>
, Anda dapat menggunakan masing-masing atribut berikut sebanyak satu kali:mimeType
scheme
host
Anda dapat mendistribusikan atribut ini di beberapa elemen
<data>
atau menggunakannya dalam satu elemen<data>
.
Elemen <intent>
mendukung nilai karakter pengganti generik (*
) sebagai
nilai untuk beberapa atribut:
- Atribut
name
dari elemen<action>
. - Subjenis atribut
mimeType
dari elemen<data>
(image/*
). - Jenis dan subjenis atribut
mimeType
dari elemen<data>
(*/*
). - Atribut
scheme
dari elemen<data>
. - Atribut
host
dari elemen<data>
.
Kecuali ditentukan lain dalam daftar sebelumnya, sistem tidak mendukung
perpaduan karakter teks dan karakter pengganti, seperti prefix*
.
Membuat kueri dan berinteraksi dengan aplikasi yang diberi otoritas penyedia
Jika Anda perlu mengajukan kueri ke penyedia
konten tetapi
tidak mengetahui nama paket yang spesifik, Anda dapat mendeklarasikan otoritas penyedia
tersebut dalam elemen <provider>
, seperti yang ditampilkan dalam cuplikan berikut:
<manifest package="com.example.suite.enterprise"> <queries> <provider android:authorities="com.example.settings.files" /> </queries> ... </manifest>
Anda dapat mendeklarasikan beberapa otoritas penyedia dalam satu elemen <queries>
.
Untuk melakukannya, selesaikan salah satu dari langkah berikut:
- Dalam elemen
<provider>
tunggal, deklarasikan daftar otoritas yang dipisahkan titik koma. - Sertakan beberapa elemen
<provider>
, semuanya dalam elemen<queries>
yang sama. Pada setiap elemen<provider>
, deklarasikan satu otoritas atau daftar otoritas yang dipisahkan titik koma.
Membuat kueri dan berinteraksi dengan semua aplikasi
Dalam kasus yang jarang terjadi, aplikasi Anda mungkin perlu membuat kueri atau berinteraksi dengan semua aplikasi terinstal yang ada
di perangkat, terlepas dari komponen yang ada di dalamnya. Agar aplikasi Anda dapat
melihat semua aplikasi lain yang diinstal, sistem memberikan
izin
QUERY_ALL_PACKAGES
.
Daftar berikut memberikan beberapa contoh kasus penggunaan ketika izin
QUERY_ALL_PACKAGES
dirasa sesuai untuk disertakan:
- Aplikasi peluncur
- Aplikasi aksesibilitas
- Browser
- Aplikasi berbagi peer-to-peer (P2P)
- Aplikasi pengelolaan perangkat
- Aplikasi keamanan
Namun, di sebagian besar kasus, Anda dapat memenuhi kasus penggunaan aplikasi Anda dengan berinteraksi dengan satu set aplikasi yang otomatis terlihat dan dengan mendeklarasikan aplikasi lain yang harus diakses oleh aplikasi Anda di file manifes Anda. Untuk menghormati privasi pengguna, aplikasi Anda harus meminta tingkat visibilitas paket terendah yang diperlukan agar aplikasi dapat berfungsi.
Dalam pembaruan kebijakan mendatang, Google Play akan memberikan pedoman bagi
aplikasi yang memerlukan izin QUERY_ALL_PACKAGES
.
Pesan log untuk pemfilteran paket
Untuk menemukan detail lengkap tentang bagaimana visibilitas default aplikasi memengaruhi aplikasi, Anda dapat mengaktifkan pesan log untuk pemfilteran paket. Jika Anda mengembangkan aplikasi pengujian atau aplikasi yang dapat di-debug di Android Studio, kemampuan ini akan diaktifkan untuk Anda. Jika tidak, Anda dapat menjalankan perintah berikut di jendela terminal untuk mengaktifkannya secara manual:
adb shell pm log-visibility --enable PACKAGE_NAME
Kemudian, setiap kali paket difilter dari nilai hasil objek PackageManager
, Anda akan
melihat pesan seperti berikut di Logcat:
I/AppsFilter: interaction: PackageSetting{7654321 \ com.example.myapp/12345} -> PackageSetting{...} BLOCKED