Penyimpanan terbatas

Penyimpanan terbatas membatasi akses aplikasi ke penyimpanan eksternal. Di Android 11 atau yang lebih baru, aplikasi yang menargetkan API 30 atau yang lebih tinggi harus menggunakan penyimpanan terbatas. Sebelumnya di Android 10, aplikasi dapat memilih untuk tidak menggunakan penyimpanan terbatas.

Batasan akses aplikasi

Tujuan penyimpanan terbatas adalah untuk melindungi privasi data aplikasi dan pengguna. Hal ini mencakup perlindungan informasi pengguna (seperti metadata foto), mencegah aplikasi mengubah atau menghapus file pengguna tanpa izin eksplisit, dan melindungi dokumen pengguna sensitif yang didownload ke folder Download atau folder lainnya.

Aplikasi yang menggunakan penyimpanan terbatas dapat memiliki tingkat akses berikut (akses sebenarnya bersifat khusus implementasi).

  • Akses baca dan tulis ke file mereka sendiri tanpa izin
  • Akses baca ke file media aplikasi lain dengan izin READ_EXTERNAL_STORAGE
  • Akses tulis ke file media aplikasi lain hanya diizinkan dengan izin pengguna langsung (pengecualian diberikan kepada Galeri Sistem dan aplikasi yang memenuhi syarat untuk akses Semua File)
  • Tidak ada akses baca atau tulis ke direktori data aplikasi eksternal aplikasi lain

Menggunakan penyimpanan terbatas dengan FUSE

Android 11 atau yang lebih baru mendukung Filesystem in Userspace (FUSE), yang memungkinkan modul MediaProvider memeriksa operasi file di ruang pengguna dan membatasi akses ke file berdasarkan kebijakan untuk mengizinkan, menolak, atau mengedit akses. Aplikasi dalam penyimpanan terbatas yang menggunakan FUSE mendapatkan fitur privasi penyimpanan terbatas dan kemampuan untuk mengakses file menggunakan jalur file langsung (memastikan File API berfungsi di aplikasi).

Android 10 menerapkan aturan penyimpanan terbatas pada akses file oleh MediaProvider, tetapi tidak untuk akses jalur file langsung (misalnya, menggunakan File API dan NDK API) karena upaya yang diperlukan dalam mencegat panggilan kernel. Akibatnya, aplikasi dalam penyimpanan terbatas tidak dapat mengakses file menggunakan jalur file langsung. Pembatasan ini memengaruhi kemampuan developer aplikasi untuk beradaptasi karena memerlukan perubahan kode yang substansial untuk menulis ulang akses File API ke MediaProvider API.

FUSE dan SDCardFS

Dukungan Android 11 untuk FUSE tidak terkait dengan penghentian SDCardFS, tetapi memberikan alternatif untuk Media Store bagi perangkat yang sebelumnya menggunakan SDCardFS. Perangkat:

  • Perangkat yang diluncurkan dengan Android 11 atau yang lebih baru menggunakan kernel 5.4 atau yang lebih baru tidak dapat menggunakan SDCardFS.
  • Perangkat yang diupgrade ke Android 11 atau yang lebih baru dapat menghosting FUSE di atas SDCardFS untuk mencegat operasi file dan memenuhi sasaran privasi.

Penyesuaian performa FUSE

Android sebelumnya mendukung FUSE di Android 7 atau yang lebih lama, yang penyimpanan eksternalnya dipasang sebagai FUSE. Karena masalah performa dan kebuntuan dengan implementasi FUSE tersebut, Android 8 memperkenalkan SDCardFS. Android 11 memperkenalkan kembali dukungan untuk FUSE menggunakan implementasi libfuse yang ditingkatkan dan diuji dengan lebih baik yang dapat disesuaikan untuk mengatasi masalah performa di Android 7 atau yang lebih lama.

Penyesuaian FUSE mencakup penyesuaian berikut:

  • Melewati FUSE untuk direktori Android/data dan Android/obb guna meningkatkan performa untuk aplikasi game yang mengandalkan direktori ini.
  • Pengoptimalan (seperti menyesuaikan rasio baca-depan dan kotor dari sistem file FUSE) untuk menjaga pembacaan tetap berperforma dan pemutaran media lancar.
  • Menggunakan cache tulis-balik FUSE.
  • Menyimpan izin dalam cache untuk mengurangi IPC ke server sistem.
  • Pengoptimalan untuk aplikasi dengan akses Semua File agar operasi massal lebih cepat.

Penyesuaian di atas dapat menghasilkan performa yang sebanding antara perangkat FUSE dan non-FUSE. Misalnya, pengujian Pixel 2 yang disesuaikan menggunakan FUSE dan Pixel 2 menggunakan Media Store menemukan performa baca berurutan yang sebanding (misalnya, pemutaran video) antara akses jalur file dan Media Store. Namun, penulisan berurutan sedikit lebih buruk dengan FUSE, dan pembacaan serta penulisan acak dapat berlangsung hingga dua kali lebih lambat.

Pengukuran performa dapat berubah dari perangkat ke perangkat dan antara kasus penggunaan tertentu. Karena MediaProvider API memberikan performa yang paling konsisten, developer aplikasi yang khawatir tentang performa harus menggunakan MediaProvider API untuk aplikasi mereka.

Mengurangi dampak performa FUSE

Dampak performa FUSE hanya terbatas pada pengguna berat file yang disimpan di penyimpanan bersama eksternal. Penyimpanan pribadi eksternal (yang mencakup direktori android/data dan android/obb) dilewati oleh FUSE, sedangkan penyimpanan internal (seperti /data/data, tempat banyak aplikasi menyimpan data agar tetap terenkripsi dan aman) tidak dipasang FUSE.

  • Aplikasi yang merupakan pengguna ringan penyimpanan eksternal bersama sering berinteraksi dengan kumpulan file terbatas (biasanya kurang dari 100 file). Aplikasi ini mendapatkan manfaat dari pengoptimalan operasi baca dan tulis umum yang ada dan tidak akan melihat dampak performa terkait FUSE di Android 11.

  • Aplikasi yang merupakan pengguna berat penyimpanan eksternal bersama biasanya melakukan operasi file massal, seperti mencantumkan atau menghapus direktori dengan 1.000 file, atau membuat atau menghapus direktori dengan satu juta file di sistem file. Operasi file massal mungkin terpengaruh oleh FUSE di Android 11, tetapi jika aplikasi tersebut memenuhi syarat untuk izin MANAGE_EXTERNAL_STORAGE, aplikasi tersebut akan mendapatkan manfaat dari pengoptimalan performa yang disertakan dalam update Oktober 2020.

Untuk menghindari overhead performa FUSE, aplikasi dapat menyimpan data di penyimpanan pribadi eksternal atau menggunakan API massal di class ContentProvider untuk melewati FUSE dan mendapatkan jalur yang dioptimalkan performanya. Selain itu, update Oktober 2020 untuk komponen sistem MediaProvider mencakup pengoptimalan performa untuk pengelola file dan aplikasi serupa (seperti pencadangan/pemulihan, antivirus) yang memiliki izin MANAGE_EXTERNAL_STORAGE.

Privasi lebih penting daripada performa

Di perangkat yang telah disesuaikan untuk FUSE, sebagian besar perjalanan pengguna yang penting memiliki performa yang sama antara Android 10 dan Android 11. Namun, saat menguji tolok ukur pada sekumpulan operasi file, Android 11 mungkin memiliki performa yang lebih buruk daripada Android 10. Untuk pola akses file yang memiliki performa lebih buruk di Android 11 (misalnya, pembacaan atau penulisan acak), sebaiknya gunakan MediaProvider API untuk memberi aplikasi mode akses non-FUSE, yang merupakan opsi terbaik dan memiliki performa yang konsisten.

Update MediaProvider dan FUSE

Perilaku komponen sistem MediaProvider berbeda antara rilis Android.

  • Di Android 10 dan yang lebih lama, SDCardFS adalah sistem file dan MediaProvider menyediakan antarmuka ke kumpulan file (misalnya, gambar, video, file musik, dll.). Saat aplikasi membuat file menggunakan File API, aplikasi tersebut dapat meminta MediaProvider untuk memindai file dan merekamnya dalam database.

  • Di Android 11 atau yang lebih baru, SDCardFS tidak digunakan lagi dan MediaProvider menjadi pengendali sistem file (untuk FUSE) untuk penyimpanan eksternal, sehingga sistem file di penyimpanan eksternal dan database MediaProvider menjadi konsisten. Sebagai pengendali ruang pengguna untuk sistem file FUSE, MediaProvider dapat mencegat panggilan kernel dan memastikan operasi file aman untuk privasi.

Di Android 11 dan yang lebih baru, MediaProvider juga merupakan komponen sistem modular (modul Mainline) yang dapat diupdate di luar rilis Android. Artinya, masalah performa, privasi, atau keamanan yang ditemukan di MediaProvider dapat diperbaiki dan dikirimkan secara over the air dari Google Play Store atau mekanisme lain yang disediakan partner. Apa pun yang berada dalam cakupan yang diharapkan dari pengendali FUSE juga dapat diupdate, sehingga update dapat memperbaiki regresi dan bug performa FUSE.