Android mendukung perangkat dengan penyimpanan tradisional, yang didefinisikan sebagai sistem file case-insensitive 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 di mana mereka 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 primer terisolasi mereka sendiri, dan tidak boleh memiliki akses ke penyimpanan eksternal utama pengguna lain.
- Jalur
/sdcard
harus diselesaikan ke penyimpanan eksternal utama khusus pengguna yang benar berdasarkan pengguna yang menjalankan proses sebagai. - Penyimpanan untuk file OBB besar di direktori
Android/obb
dapat dibagi antara beberapa pengguna sebagai pengoptimalan. - Penyimpanan eksternal sekunder tidak boleh dapat ditulis oleh aplikasi, kecuali dalam direktori khusus paket sebagaimana diizinkan oleh izin yang disintesis.
Implementasi platform default dari fitur ini memanfaatkan ruang nama kernel Linux untuk membuat tabel pemasangan terisolasi untuk setiap proses bercabang Zygote, dan kemudian menggunakan pemasangan pengikat untuk menawarkan penyimpanan eksternal utama khusus pengguna yang benar ke dalam ruang nama pribadi tersebut.
Saat boot, sistem memasang satu daemon FUSE penyimpanan eksternal yang diemulasi di EMULATED_STORAGE_SOURCE
, yang disembunyikan dari aplikasi. Setelah fork Zygote, itu mengikat mount 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, mereka hanya dapat mengakses penyimpanan untuk pengguna yang memulainya.
Implementasi ini juga menggunakan fitur kernel subpohon bersama untuk menyebarkan peristiwa mount dari namespace root default ke dalam ruang nama aplikasi, yang memastikan bahwa fitur seperti wadah ASEC dan pemasangan OBB terus bekerja dengan benar. Ini dilakukan dengan memasang rootf sebagai yang dibagikan, dan kemudian memasangnya kembali sebagai budak setelah setiap ruang nama Zygote dibuat.
Beberapa perangkat penyimpanan eksternal
Mulai Android 4.4, beberapa perangkat penyimpanan eksternal ditampilkan ke developer 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 saat aplikasi dihapus.
Dukungan media USB
Android 6.0 mendukung perangkat penyimpanan portabel yang hanya terhubung ke perangkat untuk waktu yang singkat, seperti USB flash drive. Saat pengguna memasukkan perangkat portabel baru, platform akan menampilkan pemberitahuan agar mereka dapat menyalin atau mengelola konten perangkat tersebut.
Di Android 6.0, perangkat apa pun yang tidak diadopsi dianggap portabel. Karena penyimpanan portabel terhubung hanya untuk waktu yang 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.