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

Visibilitas paket di Android 11

Android 11 mengubah cara aplikasi membuat kueri dan berinteraksi dengan aplikasi lain yang diinstal oleh pengguna di perangkat yang sama. Menggunakan elemen <queries> yang baru, aplikasi dapat menentukan kumpulan aplikasi lain yang dapat diakses olehnya. Elemen ini membantu menegakkan prinsip hak istimewa terendah dengan memberi tahu sistem tentang aplikasi lain mana yang akan ditunjukkan pada aplikasi Anda, serta membantu app store seperti Google Play untuk menilai privasi dan keamanan yang diberikan aplikasi kepada pengguna.

Jika aplikasi menargetkan Android 11, Anda mungkin perlu menambahkan elemen <queries> dalam file manifes aplikasi. Dalam elemen <queries>, Anda dapat menentukan aplikasi menurut nama paket, menurut tanda tangan intent, atau menurut otoritas penyedia.

Elemen <queries> memungkinkan Anda menjelaskan aplikasi lain mana yang mungkin diperlukan aplikasi Anda untuk berinteraksi. Anda dapat menentukan aplikasi menurut nama paket atau menurut tanda tangan intent dalam satu elemen <queries>. Untuk informasi tentang cara membuat kueri untuk aplikasi lain guna memenuhi kasus penggunaan tertentu, lihat panduan kasus penggunaan visibilitas paket.

Metode PackageManager yang menampilkan hasil tentang aplikasi lain, misalnya queryIntentActivities(), akan difilter berdasarkan deklarasi <queries> aplikasi yang memanggil. Interaksi eksplisit dengan aplikasi lain, seperti startService(), juga mengharuskan aplikasi target mencocokkan salah satu deklarasi di <queries>.

Menyiapkan lingkungan Anda

Untuk membuat aplikasi yang menggunakan elemen <queries>, gunakan fitur berikut:

Membuat kueri 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 terinstal lainnya, Android 11 memperkenalkan 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, pada umumnya, Anda dapat memenuhi kasus penggunaan aplikasi dengan mendeklarasikan elemen <queries>. 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.

Kasus penggunaan yang tidak terpengaruh oleh perubahan tersebut

Daftar berikut menyertakan beberapa contoh kasus penggunaan yang tidak memerlukan deklarasi <queries>:

  • Aplikasi target adalah aplikasi Anda sendiri.
  • Anda menggunakan intent untuk memulai aktivitas.
  • Aplikasi Anda berinteraksi dengan paket sistem tertentu, seperti penyedia media, yang mengimplementasikan fungsionalitas Android inti.
  • Aplikasi target menginstal aplikasi Anda. Anda memiliki visibilitas ke aplikasi yang ditampilkan dari panggilan ke getInitiatingPackageName() dan getInstallingPackageName() pada objek InstallSourceInfo untuk aplikasi Anda sendiri.
  • Aplikasi meluncurkan aplikasi Anda menggunakan metode startActivityForResult(). (Aplikasi tersebut otomatis menjadi terlihat oleh aplikasi Anda.)
  • Aplikasi dimulai atau mengikat ke layanan di aplikasi Anda. (Aplikasi tersebut otomatis menjadi terlihat oleh aplikasi Anda.)
  • Aplikasi membuat permintaan ke penyedia konten di aplikasi Anda. (Aplikasi tersebut menjadi terlihat oleh aplikasi Anda secara otomatis.)
  • Aplikasi Anda adalah editor metode input (IME) dan memberikan input ke aplikasi lain. (Aplikasi tersebut akan terlihat oleh aplikasi Anda secara otomatis.)

Pesan log untuk pemfilteran paket

Untuk mengetahui detail selengkapnya tentang bagaimana perubahan pada visibilitas paket 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

Menguji perubahan

Untuk menguji apakah perubahan perilaku ini telah diterapkan dalam aplikasi Anda, selesaikan langkah-langkah berikut:

  1. Instal Android Studio 3.6.1 atau versi yang lebih baru.
  2. Instal Gradle versi terbaru yang didukung oleh Android Studio.
  3. Tetapkan targetSdkVersion aplikasi ke 30.
  4. Jangan sertakan elemen <queries> di file manifes aplikasi Anda.
  5. Panggil getInstalledApplications() atau getInstalledPackages(). Kedua metode tersebut akan menampilkan daftar yang difilter.
  6. Lihat fitur mana saja di aplikasi Anda yang tidak berfungsi.
  7. Perkenalkan entri <queries> yang sesuai untuk memperbaiki fitur ini.