Storage

Ikon HAL penyimpanan eksternal Android

Android telah berkembang dari waktu ke waktu untuk mendukung berbagai jenis dan fitur perangkat penyimpanan. Semua versi Android mendukung perangkat dengan penyimpanan tradisional, yang mencakup penyimpanan portabel dan yang diemulasi. Penyimpanan Portabel dapat disediakan oleh media fisik, seperti kartu SD atau USB, yang digunakan untuk transfer data sementara/ penyimpanan file. Media fisik dapat tetap berada di perangkat selama periode waktu yang lama, tetapi tidak terikat dengan perangkat dan dapat dihapus. Kartu SD telah tersedia sebagai penyimpanan portabel sejak Android 1.0; Android 6.0 menambahkan dukungan USB. Penyimpanan yang diemulasi disediakan dengan mengekspos sebagian penyimpanan internal melalui lapisan emulasi dan telah tersedia sejak Android 3.0.

Mulai Android 6.0, Android mendukung penyimpanan yang dapat diadopsi, yang disediakan oleh media fisik, seperti kartu SD atau USB, yang dienkripsi dan diformat agar berperilaku seperti penyimpanan internal. Penyimpanan yang dapat diadopsi dapat menyimpan semua jenis data aplikasi.

Izin

Akses ke penyimpanan eksternal dilindungi oleh berbagai izin Android. Mulai Android 1.0, akses tulis dilindungi dengan izin WRITE_EXTERNAL_STORAGE. Mulai Android 4.1, akses baca dilindungi dengan izin READ_EXTERNAL_STORAGE.

Mulai Android 4.4, pemilik, grup, dan mode file di perangkat penyimpanan eksternal kini disintesis berdasarkan struktur direktori. Hal ini memungkinkan aplikasi mengelola direktori khusus paketnya di penyimpanan eksternal tanpa memerlukan izin WRITE_EXTERNAL_STORAGE yang luas. Misalnya, aplikasi dengan nama paket com.example.foo kini dapat mengakses Android/data/com.example.foo/ dengan bebas di perangkat penyimpanan eksternal tanpa izin. Izin yang disintesis ini dilakukan dengan menggabungkan perangkat penyimpanan mentah dalam daemon FUSE.

Mulai Android 10, aplikasi yang menargetkan Android 9 dan yang lebih rendah secara default menggunakan penyimpanan lama, dan dapat memilih ikut untuk penyimpanan terisolasi. Aplikasi yang menargetkan Android 10 dan yang ditetapkan secara default ke penyimpanan terisolasi dapat memilih untuk tidak menggunakannya untuk sementara. Gunakan atribut manifes requestLegacyExternalStorage, yang mengontrol model penyimpanan, untuk mengubah status default.

Karena izin READ_EXTERNAL_STORAGE dan WRITE_EXTERNAL_STORAGE dibatasi secara lunak, jika penginstal tidak memasukkan aplikasi ke dalam daftar yang diizinkan, izin akan mengontrol akses ke koleksi audio dan visual saja, tanpa akses ke kartu SD. Hal ini tetap berlaku meskipun aplikasi meminta penyimpanan lama. Untuk informasi selengkapnya tentang pembatasan keras dan pembatasan lunak, lihat Pembatasan keras dan ringan di Android 10.

Jika penginstal memasukkan izin ke dalam daftar yang diizinkan, aplikasi yang berjalan dalam mode lama akan mendapatkan perilaku izin yang tidak terisolasi. Izin ini mengontrol akses kartu SD, serta koleksi audio dan visual. Hal ini terjadi jika aplikasi menargetkan Android 9 atau yang lebih rendah dan tidak memilih untuk menggunakan penyimpanan terisolasi, atau menargetkan Android 10 dan memilih tidak ikut.

Status daftar yang diizinkan hanya dapat ditentukan pada waktu penginstalan, dan tidak dapat diubah hingga aplikasi diinstal.

Untuk informasi selengkapnya tentang cara menetapkan izin READ_EXTERNAL_STORAGE, lihat setWhitelistedRestrictedPermissions() di class PackageInstaller.SessionParams.

Android 13 memperkenalkan izin media terperinci untuk mendukung aplikasi yang mengakses file media yang dibuat oleh aplikasi lain. Aplikasi harus meminta satu atau beberapa izin media terperinci yang tercantum dalam Izin media terperinci, bukan izin READ_EXTERNAL_STORAGE.

Android 14 dibuat berdasarkan izin media terperinci untuk memungkinkan pengguna memberikan akses sebagian ke library media visual mereka saat aplikasi meminta izin media. Lihat Memberikan akses sebagian ke foto dan video untuk mengetahui informasi selengkapnya.

Izin runtime

Android 6.0 memperkenalkan model izin runtime baru tempat aplikasi meminta kemampuan saat diperlukan saat runtime. Karena model baru menyertakan izin READ/WRITE_EXTERNAL_STORAGE, platform harus memberikan akses penyimpanan secara dinamis tanpa menghentikan atau memulai ulang aplikasi yang sudah berjalan. Hal ini dilakukan dengan mempertahankan tiga tampilan berbeda dari semua perangkat penyimpanan yang terpasang:

  • /mnt/runtime/default ditampilkan kepada aplikasi tanpa izin penyimpanan khusus, dan untuk namespace root tempat adbd dan komponen sistem lainnya berada.
  • /mnt/runtime/read ditampilkan ke aplikasi dengan READ_EXTERNAL_STORAGE (Tetapkan LEGACY_STORAGE untuk Android 10)
  • /mnt/runtime/write ditampilkan ke aplikasi dengan WRITE_EXTERNAL_STORAGE

Pada waktu fork Zygote, kita membuat namespace pemasangan untuk setiap aplikasi yang berjalan dan mengikat pemasangan tampilan awal yang sesuai. Kemudian, saat izin runtime diberikan, vold akan masuk ke namespace mount aplikasi yang sudah berjalan dan mengikat mount tampilan yang diupgrade ke tempatnya. Perhatikan bahwa downgrade izin selalu menyebabkan aplikasi dihentikan.

Fungsi setns() yang digunakan untuk mengimplementasikan fitur ini memerlukan setidaknya Linux 3.8, tetapi patch telah berhasil di-backport ke Linux 3.4. Pengujian CTS PermissionsHostTest dapat digunakan untuk memverifikasi perilaku kernel yang benar.