Mengelola visibilitas paket

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, atau port 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