Penyimpanan

Ikon HAL penyimpanan eksternal Android

Android telah berevolusi dari waktu ke waktu untuk mendukung beragam jenis dan fitur perangkat penyimpanan. Semua versi Android mendukung perangkat dengan penyimpanan tradisional , yang mencakup penyimpanan portabel dan emulasi. Penyimpanan portabel dapat disediakan melalui media fisik, seperti kartu SD atau USB, yang ditujukan untuk transfer data/penyimpanan file sementara. Media fisik mungkin tetap berada di perangkat untuk jangka waktu yang lama, namun tidak terikat pada perangkat dan dapat dihapus. Kartu SD telah tersedia sebagai penyimpanan portabel sejak Android 1.0; Android 6.0 menambahkan dukungan USB. Penyimpanan emulasi disediakan dengan memaparkan 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 berfungsi 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 mengharuskan aplikasi tersebut memiliki izin WRITE_EXTERNAL_STORAGE yang luas. Misalnya, aplikasi dengan nama paket com.example.foo kini dapat dengan bebas mengakses Android/data/com.example.foo/ di perangkat penyimpanan eksternal tanpa izin. Izin yang disintesis ini dicapai dengan membungkus perangkat penyimpanan mentah dalam daemon FUSE.

Mulai Android 10, aplikasi yang menargetkan Android 9 dan versi lebih rendah akan menggunakan penyimpanan lama secara default, dan dapat ikut serta dalam penyimpanan terisolasi. Aplikasi yang menargetkan Android 10 dan menggunakan penyimpanan terisolasi secara default 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 putih, izin tersebut mengontrol akses ke koleksi aural dan visual saja, tanpa akses ke kartu SD. Hal ini berlaku meskipun aplikasi meminta penyimpanan lama. Untuk informasi selengkapnya tentang pembatasan keras dan pembatasan lunak, lihat Pembatasan keras dan lunak di Android 10 .

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

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

Untuk informasi lebih lanjut tentang pengaturan izin READ_EXTERNAL_STORAGE , lihat setWhitelistedRestrictedPermissions() di kelas PackageInstaller.SessionParams .

Android 13 memperkenalkan izin media granular 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 dibangun berdasarkan izin media granular untuk memungkinkan pengguna memberikan akses parsial ke perpustakaan media visual mereka saat aplikasi meminta izin media. Lihat Memberikan akses sebagian ke foto dan video untuk informasi selengkapnya.

Izin waktu proses

Android 6.0 memperkenalkan model izin waktu proses baru yang memungkinkan aplikasi meminta kemampuan saat diperlukan saat waktu proses. Karena model baru ini menyertakan izin READ/WRITE_EXTERNAL_STORAGE , platform perlu memberikan akses penyimpanan secara dinamis tanpa mematikan 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 ke aplikasi tanpa izin penyimpanan khusus, dan ke namespace root tempat adbd dan komponen sistem lainnya berada.
  • /mnt/runtime/read ditampilkan ke aplikasi dengan READ_EXTERNAL_STORAGE (Setel LEGACY_STORAGE untuk Android 10)
  • /mnt/runtime/write ditampilkan ke aplikasi dengan WRITE_EXTERNAL_STORAGE

Pada waktu percabangan Zygote, kami membuat namespace mount untuk setiap aplikasi yang berjalan dan mengikat mount tampilan awal yang sesuai ke tempatnya. Kemudian, ketika izin waktu proses diberikan, vold melompat ke namespace pemasangan aplikasi yang sudah berjalan dan mengikat pemasangan tampilan yang ditingkatkan ke tempatnya. Perhatikan bahwa penurunan versi izin selalu mengakibatkan aplikasi dimatikan.

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