Android mendukung perangkat dengan penyimpanan tradisional, yang didefinisikan sebagai sistem file peka huruf besar/kecil dengan kelas dan mode izin POSIX yang tidak dapat diubah. Gagasan penyimpanan tradisional mencakup penyimpanan yang ditiru dan portabel. Penyimpanan portabel didefinisikan sebagai penyimpanan eksternal apa pun yang tidak diadopsi oleh sistem dan oleh karena itu tidak diformat dan dienkripsi atau diikat ke perangkat tertentu. Karena penyimpanan eksternal tradisional menawarkan perlindungan minimal untuk data yang disimpan, kode sistem tidak boleh menyimpan data sensitif di penyimpanan eksternal. Secara khusus, file konfigurasi dan log hanya boleh disimpan di penyimpanan internal agar dapat dilindungi secara efektif.
Penyimpanan eksternal multi-pengguna
Mulai Android 4.2, perangkat dapat mendukung banyak pengguna, dan penyimpanan eksternal harus memenuhi batasan berikut:
- Setiap pengguna harus memiliki penyimpanan eksternal utama yang terisolasi, dan tidak boleh memiliki akses ke penyimpanan eksternal utama pengguna lain.
- Jalur
/sdcard
harus menentukan penyimpanan eksternal utama khusus pengguna yang benar berdasarkan pengguna tempat proses dijalankan. - Penyimpanan untuk file OBB berukuran besar di direktori
Android/obb
dapat dibagi antara beberapa pengguna sebagai optimasi. - Penyimpanan eksternal sekunder tidak boleh dapat ditulisi oleh aplikasi, kecuali dalam direktori khusus paket sebagaimana diizinkan oleh izin yang disintesis.
Implementasi platform default dari fitur ini memanfaatkan namespace kernel Linux untuk membuat tabel mount terisolasi untuk setiap proses bercabang Zygote, dan kemudian menggunakan bind mount untuk menawarkan penyimpanan eksternal primer khusus pengguna yang benar ke dalam namespace pribadi tersebut.
Saat boot, sistem memasang satu daemon FUSE penyimpanan eksternal yang ditiru di EMULATED_STORAGE_SOURCE
, yang disembunyikan dari aplikasi. Setelah Zygote bercabang, Zygote mengikat subdirektori khusus pengguna yang sesuai dari bawah daemon FUSE ke EMULATED_STORAGE_TARGET
sehingga jalur penyimpanan eksternal diselesaikan dengan benar untuk aplikasi. Karena aplikasi tidak memiliki titik pemasangan yang dapat diakses untuk penyimpanan pengguna lain, aplikasi hanya dapat mengakses penyimpanan untuk pengguna yang memulai aplikasi tersebut.
Implementasi ini juga menggunakan fitur kernel subpohon bersama untuk menyebarkan peristiwa pemasangan dari namespace root default ke dalam namespace aplikasi, yang memastikan bahwa fitur seperti kontainer ASEC dan pemasangan OBB terus berfungsi dengan benar. Hal ini dilakukan dengan memasang rootfs sebagai shared, dan kemudian memasangnya kembali sebagai slave setelah setiap namespace Zygote dibuat.
Beberapa perangkat penyimpanan eksternal
Mulai Android 4.4, beberapa perangkat penyimpanan eksternal ditampilkan kepada pengembang melalui Context.getExternalFilesDirs()
, Context.getExternalCacheDirs()
, dan Context.getObbDirs()
.
Izin WRITE_EXTERNAL_STORAGE
hanya boleh memberikan akses tulis ke penyimpanan eksternal utama pada perangkat. Aplikasi tidak boleh diizinkan untuk menulis ke perangkat penyimpanan eksternal sekunder, kecuali dalam direktori khusus paketnya sebagaimana diizinkan oleh izin yang disintesis. Membatasi penulisan dengan cara ini memastikan sistem dapat membersihkan file ketika aplikasi di-uninstall.
Dukungan media USB
Android 6.0 mendukung perangkat penyimpanan portabel yang hanya terhubung ke perangkat untuk waktu singkat, seperti flash drive USB. Saat pengguna memasukkan perangkat portabel baru, platform menampilkan pemberitahuan yang memungkinkan mereka menyalin atau mengelola konten perangkat tersebut.
Di Android 6.0, perangkat apa pun yang tidak diadopsi dianggap portabel. Karena penyimpanan portabel hanya terhubung dalam waktu singkat, platform menghindari operasi berat seperti pemindaian media. Aplikasi pihak ketiga harus melalui Storage Access Framework untuk berinteraksi dengan file di penyimpanan portabel; akses langsung secara eksplisit diblokir karena alasan privasi dan keamanan.