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 tempatadbd
dan komponen sistem lainnya berada./mnt/runtime/read
ditampilkan ke aplikasi denganREAD_EXTERNAL_STORAGE
(TetapkanLEGACY_STORAGE
untuk Android 10)/mnt/runtime/write
ditampilkan ke aplikasi denganWRITE_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.