Update untuk penyimpanan di Android 11

Android 11 memberikan penyempurnaan lebih lanjut pada platform ini, menghadirkan perlindungan yang lebih baik pada aplikasi dan data pengguna di penyimpanan eksternal. Rilis pratinjau memperkenalkan beberapa penyempurnaan yang telah diumumkan tahun lalu di Android Dev Summit, seperti opsi penggunaan akses jalur file mentah untuk media, operasi edit batch untuk media, dan UI yang diperbarui untuk Framework Akses Penyimpanan.

Untuk mempermudah proses peralihan ke penyimpanan terbatas, platform ini memperkenalkan penyempurnaan lebih lanjut untuk developer. Untuk mempelajari lebih lanjut tentang cara memigrasikan aplikasi ke menggunakan penyimpanan terbatas berdasarkan kasus penggunaan aplikasi Anda, lihat bagian penyimpanan terbatas di halaman ini, panduan kasus penggunaan dan praktik terbaik penyimpanan Android, dan artikel Medium yang berjudul Android 11 Storage FAQ.

Seperti biasa, kami mengundang Anda untuk memberikan masukan guna membantu menyempurnakan versi Android berikutnya. Gunakan issue tracker untuk menyampaikan komentar Anda kepada kami.

Penerapan penyimpanan terbatas

Guna memberikan waktu tambahan bagi developer untuk melakukan pengujian, aplikasi yang menargetkan Android 10 (API level 29) masih dapat meminta atribut requestLegacyExternalStorage. Flag ini memungkinkan aplikasi untuk tidak disertakan sementara dalam perubahan terkait penyimpanan terbatas, seperti memberikan akses ke berbagai direktori dan jenis file media yang berbeda. Setelah Anda mengupdate aplikasi untuk menargetkan Android 11, sistem akan mengabaikan flag requestLegacyExternalStorage.

Mempertahankan kompatibilitas dengan Android 10

Jika aplikasi Anda tidak diikutsertakan untuk menggunakan penyimpanan terbatas saat berjalan di perangkat Android 10, lanjutkan untuk menetapkan requestLegacyExternalStorage ke true dalam file manifes aplikasi. Dengan demikian, aplikasi Anda dapat terus berperilaku seperti yang diharapkan pada perangkat yang menjalankan Android 10.

Memigrasikan data ke direktori yang terlihat saat menggunakan penyimpanan terbatas

Jika aplikasi Anda menggunakan model penyimpanan lama dan sebelumnya menargetkan Android 10 atau yang lebih rendah, Anda mungkin menyimpan data dalam direktori yang tidak dapat diakses oleh aplikasi saat model penyimpanan terbatas diaktifkan. Sebelum menargetkan Android 11, migrasikan data ke direktori yang kompatibel dengan penyimpanan terbatas. Biasanya, Anda dapat memigrasikan data ke direktori khusus aplikasi Anda.

Jika memiliki data yang perlu dimigrasikan, Anda dapat mempertahankan model penyimpanan lama saat pengguna mengupgrade aplikasi Anda ke versi baru yang menargetkan Android 11. Dengan demikian, pengguna tetap dapat mengakses data aplikasi yang disimpan dalam direktori tempat aplikasi Anda sebelumnya menyimpan data. Untuk mengaktifkan model penyimpanan lama untuk upgrade, tetapkan atribut preserveLegacyExternalStorage ke true dalam manifes aplikasi Anda.

Catatan: Sebagian besar aplikasi seharusnya tidak perlu menggunakan preserveLegacyExternalStorage. Flag ini dirancang hanya untuk situasi ketika Anda memigrasikan data aplikasi ke lokasi yang kompatibel dengan penyimpanan terbatas, dan Anda ingin pengguna tetap dapat mengakses data tersebut saat mengupdate aplikasi Anda. Flag ini mempersulit proses pengujian untuk mengetahui pengaruh penyimpanan terbatas terhadap pengguna aplikasi, karena saat pengguna mengupdate aplikasi, model penyimpanan lama tetap akan digunakan.

Jika Anda menggunakan preserveLegacyExternalStorage, model penyimpanan lama akan tetap berlaku hingga pengguna meng-uninstal aplikasi Anda. Jika pengguna menginstal atau menginstal ulang aplikasi di perangkat yang menjalankan Android 11, aplikasi tidak dapat memilih untuk tidak menggunakan model penyimpan terbatas, terlepas dari nilai preserveLegacyExternalStorage.

Menguji penyimpanan terbatas

Untuk mengaktifkan penyimpanan terbatas di aplikasi Anda, terlepas dari nilai flag manifes dan versi SDK targetnya, aktifkan flag kompatibilitas aplikasi berikut:

Untuk menonaktifkan penyimpanan terbatas dan menggunakan model penyimpanan lama, batalkan penetapan kedua flag.

Mengelola penyimpanan perangkat

Pada Android 11, aplikasi yang menggunakan model penyimpanan terbatas hanya dapat mengakses file cache khusus aplikasi miliknya sendiri. Jika aplikasi Anda perlu mengelola penyimpanan perangkat, lakukan hal berikut:

  1. Periksa kapasitas ruang penyimpanan yang tersedia dengan memanggil tindakan intent ACTION_MANAGE_STORAGE.
  2. Jika kapasitas ruang penyimpanan yang tersedia tidak mencukupi, minta pengguna untuk mengizinkan aplikasi Anda menghapus semua cache. Untuk melakukannya, panggil tindakan intent ACTION_CLEAR_APP_CACHE.

Direktori khusus aplikasi di penyimpanan eksternal

Di Android 11, aplikasi tidak dapat membuat direktori khusus aplikasi di penyimpanan eksternal. Untuk mengakses direktori yang disediakan oleh sistem untuk aplikasi Anda, panggil getExternalFilesDirs().

Akses file media

Untuk mempermudah akses media sekaligus mempertahankan privasi pengguna, Android 11 menambahkan kemampuan berikut ini.

Menjalankan operasi batch

Agar konsisten di seluruh perangkat dan untuk meningkatkan kenyamanan pengguna, Android 11 menambahkan beberapa metode ke MediaStore API. Metode ini sangat berguna bagi aplikasi yang menginginkan alur sederhana untuk memodifikasi file media tertentu, seperti pengeditan foto secara langsung.

Metode yang ditambahkan adalah sebagai berikut:

createWriteRequest()
Meminta pengguna memberi aplikasi Anda akses tulis ke grup file media tertentu.
createFavoriteRequest()
Meminta pengguna untuk menandai file media tertentu sebagai beberapa media “favorit” mereka di perangkat. Semua aplikasi yang memiliki akses baca ke file ini dapat mengetahui bahwa pengguna telah menandai file sebagai “favorit”.
createTrashRequest()

Meminta pengguna untuk memindahkan file media tertentu ke tempat sampah perangkat. Item di tempat sampah akan dihapus secara permanen setelah jangka waktu yang ditentukan sistem.

createDeleteRequest()

Meminta pengguna untuk langsung menghapus file media tertentu secara permanen, tanpa memindahkannya ke tempat sampah terlebih dahulu.

Setelah memanggil salah satu metode ini, sistem akan mem-build objek PendingIntent. Setelah aplikasi memanggil intent ini, pengguna akan melihat dialog yang meminta izin mereka agar aplikasi dapat memperbarui atau menghapus file media yang telah ditentukan.

Sebagai contoh, berikut cara membuat struktur panggilan ke createWriteRequest():

Kotlin

val urisToModify = /* A collection of content URIs to modify. */
val editPendingIntent = MediaStore.createWriteRequest(contentResolver,
        urisToModify)

// Launch a system prompt requesting user permission for the operation.
startIntentSenderForResult(editPendingIntent.intentSender, EDIT_REQUEST_CODE,
    null, 0, 0, 0)

Java

List<Uri> urisToModify = /* A collection of content URIs to modify. */
PendingIntent editPendingIntent = MediaStore.createWriteRequest(contentResolver,
                  urisToModify);

// Launch a system prompt requesting user permission for the operation.
startIntentSenderForResult(editPendingIntent.getIntentSender(),
    EDIT_REQUEST_CODE, null, 0, 0, 0);

Evaluasi respons pengguna lalu lanjutkan proses, atau jika pengguna tidak memberikan izin, jelaskan mengapa aplikasi Anda memerlukan izin tersebut:

Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int,
                 data: Intent?) {
    ...
    when (requestCode) {
        EDIT_REQUEST_CODE ->
            if (resultCode == Activity.RESULT_OK) {
                /* Edit request granted; proceed. */
            } else {
                /* Edit request not granted; explain to the user. */
            }
    }
}

Java

@Override
protected void onActivityResult(int requestCode, int resultCode,
                   @Nullable Intent data) {
    ...
    if (requestCode == EDIT_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            /* Edit request granted; proceed. */
        } else {
            /* Edit request not granted; explain to the user. */
        }
    }
}

Anda dapat menggunakan pola umum yang sama ini dengan createFavoriteRequest(), createTrashRequest(), dan createDeleteRequest().

Mengakses file menggunakan jalur file langsung dan library native

Untuk membantu aplikasi berfungsi lebih lancar dengan library media pihak ketiga, Android 11 memungkinkan Anda menggunakan API selain MediaStore API untuk mengakses file media dari penyimpanan bersama. Anda dapat memilih untuk mengakses file media secara langsung menggunakan salah satu API berikut:

  • File API.
  • Library native, seperti fopen().

Jika aplikasi tidak memiliki izin penyimpanan apa pun, Anda dapat mengakses file media yang dikaitkan ke aplikasi menggunakan jalur file langsung. Jika aplikasi Anda memiliki izin READ_EXTERNAL_STORAGE, aplikasi tersebut dapat mengakses semua file media menggunakan jalur file langsung, terlepas dari apakah file tersebut dikaitkan dengan aplikasi Anda atau tidak.

Jika Anda mengakses file media secara langsung, sebaiknya Anda menyisih dari penyimpanan terbatas dengan menetapkan requestLegacyExternalStorage ke true dalam file manifes aplikasi Anda. Dengan demikian, aplikasi akan berperilaku seperti yang diharapkan pada perangkat yang menjalankan Android 10.

Performa

Saat Anda melakukan operasi baca berurutan pada file media menggunakan jalur file langsung, performanya dapat dibandingkan dengan MediaStore API.

Namun, saat Anda melakukan pembacaan dan penulisan file media secara acak menggunakan jalur file langsung, prosesnya dapat berlangsung hingga dua kali lebih lambat. Dalam situasi ini, sebaiknya gunakan MediaStore API.

Nilai yang tersedia dari penyimpanan media

Saat mengakses file media yang ada, Anda dapat menggunakan nilai kolom DATA dalam logika Anda. Itu karena nilai ini memiliki jalur file yang valid. Namun, jangan berasumsi bahwa file tersebut selalu tersedia. Bersiaplah untuk menangani setiap error I/O berbasis file yang dapat terjadi.

Di sisi lain, untuk membuat atau memperbarui file media, jangan gunakan nilai kolom DATA. Sebaliknya, gunakan nilai DISPLAY_NAME dan kolom RELATIVE_PATH.

Akses ke data dari aplikasi lainnya

Untuk melindungi privasi pengguna, Android 11 semakin membatasi akses aplikasi ke direktori pribadi aplikasi lain.

Akses ke direktori data pada penyimpanan internal

Detail perubahan

Nama Perubahan: APP_DATA_DIRECTORY_ISOLATION

ID Perubahan: 143937733

Cara mengganti status perubahan

Saat menguji kompatibilitas aplikasi dengan Android 11, Anda dapat mengaktifkan atau menonaktifkan perubahan ini menggunakan perintah ADB berikut:

adb shell am compat enable (143937733|APP_DATA_DIRECTORY_ISOLATION) PACKAGE_NAME
adb shell am compat disable (143937733|APP_DATA_DIRECTORY_ISOLATION) PACKAGE_NAME

Untuk mengetahui informasi selengkapnya tentang framework kompatibilitas dan mengganti status perubahan, baca Menguji kompatibilitas aplikasi dengan Android 11.

Android 9 (API level 28) mulai membatasi aplikasi mana yang dapat membuat file di direktori data di penyimpanan internalnya dapat diakses bebas oleh aplikasi lain. Aplikasi yang menargetkan Android 9 atau yang lebih tinggi tidak dapat membuat file dalam direktori datanya dapat diakses bebas.

Android 11 memperluas pembatasan ini. Jika aplikasi Anda menargetkan Android 11, aplikasi tidak dapat mengakses file dalam direktori data aplikasi lain, meskipun aplikasi lain menargetkan Android 8.1 (API level 27) atau yang lebih rendah dan membuat file dalam direktori datanya bisa dibaca bebas.

Akses ke direktori khusus aplikasi di penyimpanan eksternal

Di Android 11, aplikasi tidak dapat lagi mengakses file dalam direktori tetap khusus aplikasi milik aplikasi lain mana pun di penyimpanan eksternal.

Pembatasan akses dokumen

Guna memberikan waktu bagi developer untuk melakukan pengujian, perubahan terkait Framework Akses Penyimpanan (SAF) berikut ini hanya berlaku jika aplikasi Anda menargetkan Android 11.

Akses ke direktori

Anda tidak dapat lagi menggunakan tindakan intent ACTION_OPEN_DOCUMENT_TREE untuk meminta akses ke direktori berikut:

  • Direktori utama volume penyimpanan internal.
  • Direktori utama setiap volume kartu SD yang oleh produsen perangkat dianggap dapat diandalkan, baik kartu tersebut diemulasi maupun dapat dilepas. Volume yang andal adalah volume yang sering kali dapat diakses tanpa masalah oleh aplikasi.
  • Direktori Download.

Akses ke file

Anda tidak dapat lagi menggunakan tindakan intent ACTION_OPEN_DOCUMENT_TREE atau ACTION_OPEN_DOCUMENT untuk meminta pengguna memilih file individu dari direktori berikut:

  • Direktori Android/data/ dan semua subdirektorinya.
  • Direktori Android/obb/ dan semua subdirektorinya.

Menguji perubahan

Untuk menguji perubahan perilaku ini, lakukan langkah berikut:

  1. Panggil intent dengan tindakan ACTION_OPEN_DOCUMENT. Pastikan direktori Android/data/ dan Android/obb/ tidak muncul.
  2. Lakukan salah satu langkah berikut:
  3. Panggil intent dengan tindakan ACTION_OPEN_DOCUMENT_TREE. Pastikan apakah direktori Download muncul dan tombol tindakan yang terkait dengan direktori tersebut berwarna abu-abu.

Izin

Android 11 memperkenalkan perubahan berikut ini terkait izin penyimpanan.

Menargetkan versi apa pun

Dialog pertama menampilkan link yang disebut Allow (Izinkan) di setelan
Gambar 1. Dialog yang ditampilkan saat aplikasi menggunakan penyimpanan terbatas dan meminta izin READ_EXTERNAL_STORAGE.

Perubahan berikut diberlakukan di Android 11, terlepas dari versi SDK target aplikasi Anda:

  • Izin runtime Penyimpanan diubah namanya menjadi File & Media.
  • Jika aplikasi Anda masih menggunakan penyimpanan terbatas lalu meminta izin READ_EXTERNAL_STORAGE, pengguna akan melihat dialog yang berbeda dengan yang muncul di Android 10. Dialog tersebut menunjukkan bahwa aplikasi Anda meminta akses ke foto dan media, seperti pada Gambar 1.

    Pengguna dapat melihat aplikasi yang memiliki izin READ_EXTERNAL_STORAGE di setelan sistem. Di halaman Setelan > Privasi > Pengelola izin > File dan media, setiap aplikasi yang memiliki izin akan tercantum di bagian Diizinkan untuk semua file.

    Catatan: Jika aplikasi Anda menargetkan Android 11, perlu diingat bahwa akses ke "semua file" bersifat hanya baca. Untuk membaca dan menulis ke semua file di penyimpanan bersama menggunakan aplikasi ini, Anda harus memiliki izin akses semua file.

Menargetkan Android 11

Jika aplikasi Anda menargetkan Android 11, baik izin WRITE_EXTERNAL_STORAGE maupun izin hak istimewa WRITE_MEDIA_STORAGE tidak lagi menyediakan akses tambahan apa pun.

Perlu diingat bahwa pada perangkat yang menjalankan Android 10 (API level 29) atau yang lebih tinggi, aplikasi Anda dapat berkontribusi ke koleksi media yang ditentukan dengan baik, seperti MediaStore.Downloads, tanpa meminta izin apa pun terkait penyimpanan. Pelajari lebih lanjut cara meminta izin yang diperlukan saja saat menangani file media di aplikasi Anda.

Akses semua file

Sebagian besar aplikasi yang memerlukan akses penyimpanan bersama dapat mengikuti praktik terbaik penyimpanan terbatas seperti Storage Access Framework atau MediaStore API. Namun, beberapa aplikasi memiliki kasus penggunaan inti yang memerlukan akses file yang luas di perangkat, tetapi tidak dapat melakukannya secara efisien menggunakan praktik terbaik penyimpanan yang ramah privasi.

Misalnya, kasus penggunaan utama aplikasi anti-virus mungkin memerlukan pemindaian reguler pada banyak file di berbagai direktori. Jika pemindaian ini memerlukan interaksi pengguna berulang untuk memilih direktori menggunakan alat pilih file sistem, pemindaian dapat memberikan pengalaman pengguna yang buruk. Kasus penggunaan lainnya—seperti aplikasi file manager, aplikasi pencadangan dan pemulihan, serta aplikasi pengelolaan dokumen—mungkin memerlukan pertimbangan yang serupa.

Aplikasi dapat meminta akses aplikasi khusus yang disebut Akses semua file dari pengguna dengan melakukan hal berikut:

  1. Deklarasikan izin MANAGE_EXTERNAL_STORAGE dalam manifes.
  2. Menggunakan tindakan intent ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION untuk mengarahkan pengguna ke halaman setelan sistem tempat mereka dapat mengaktifkan opsi berikut untuk aplikasi Anda: Izinkan akses untuk mengelola semua file.

Untuk menentukan apakah aplikasi Anda telah diberi izin MANAGE_EXTERNAL_STORAGE, panggil Environment.isExternalStorageManager().

Izin MANAGE_EXTERNAL_STORAGE memberikan hal berikut:

  • Akses baca dan tulis ke semua file dalam penyimpanan bersama.

  • Akses ke konten tabel MediaStore.Files.

  • Akses ke direktori utama drive OTG (on-the-go) USB dan kartu SD.

  • Akses tulis ke semua direktori penyimpanan internal⁠, kecuali untuk /Android/data/, /sdcard/Android, dan sebagian besar subdirektori /sdcard/Android. Akses tulis ini mencakup akses jalur file.

    Aplikasi yang diberi izin ini tetap tidak dapat mengakses direktori khusus aplikasi milik aplikasi lain karena direktori ini ditampilkan sebagai subdirektori Android/data/ pada volume penyimpanan.

Jika aplikasi memiliki izin MANAGE_EXTERNAL_STORAGE, aplikasi tersebut dapat mengakses file dan direktori tambahan ini menggunakan MediaStore API atau jalur file. Namun, saat Anda menggunakan Storage Access Framework, Anda hanya dapat mengakses file atau direktori jika Anda dapat melakukannya tanpa memiliki izin MANAGE_EXTERNAL_STORAGE.

Mengaktifkan pengujian

Untuk mempelajari pengaruh semua izin akses file terhadap aplikasi, Anda dapat mengaktifkan izin untuk tujuan pengujian. Untuk melakukannya, jalankan perintah berikut pada mesin yang terhubung ke perangkat pengujian Anda:

adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow

Pemberitahuan Google Play

Bagian ini memberikan pemberitahuan untuk developer yang memublikasikan aplikasi di Google Play.

Untuk membatasi akses luas ke penyimpanan bersama, Google Play Store telah memperbarui kebijakannya untuk mengevaluasi aplikasi yang menargetkan Android 11 dan meminta Akses semua file melalui izin MANAGE_EXTERNAL_STORAGE.

Anda harus meminta izin MANAGE_EXTERNAL_STORAGE hanya jika aplikasi Anda tidak dapat menggunakan API yang lebih ramah privasi secara efektif, seperti Storage Access Framework atau Media Store API. Selain itu, penggunaan izin oleh aplikasi harus berada dalam penggunaan yang diizinkan, dan harus terkait langsung dengan fungsi inti aplikasi. Jika aplikasi Anda menyertakan kasus penggunaan yang mirip dengan contoh berikut, kemungkinan aplikasi akan diizinkan untuk meminta izin MANAGE_EXTERNAL_STORAGE:

  • File manager
  • Pencadangan dan pemulihan
  • Aplikasi antivirus
  • Aplikasi pengelolaan dokumen

Karena pertimbangan terkait COVID-19, aplikasi yang menargetkan Android 11 dan memerlukan izin MANAGE_EXTERNAL_STORAGE tidak dapat diupload ke Google Play hingga awal tahun 2021. Pembatasan ini mencakup aplikasi baru dan update untuk aplikasi yang sudah ada. Untuk mempelajari lebih lanjut, baca kebijakan yang diperbarui dari Pusat Bantuan Kebijakan.

Untuk sementara waktu, jika menurut Anda izin pengelolaan penyimpanan eksternal diperlukan untuk aplikasi, sebaiknya Anda tidak mengupdate SDK target ke Android 11 untuk saat ini. Jika Anda menargetkan Android 10, pertimbangkan untuk menggunakan tanda requestLegacyExternalStorage.