Penyimpanan eksternal dikelola oleh kombinasi layanan vold
init dan layanan sistem StorageManagerService
. Pemasangan volume penyimpanan eksternal fisik ditangani oleh vold
, yang melakukan operasi staging untuk menyiapkan media sebelum memaparkannya ke aplikasi.
Catatan: Di Android 8.0, kelas MountService
diubah namanya menjadi StorageManagerService
.
Pemetaan file
Untuk Android 4.2.2 dan yang lebih lama, file konfigurasi vold.fstab
khusus perangkat mendefinisikan pemetaan dari perangkat sysfs ke titik pemasangan sistem file, dan setiap baris mengikuti format ini:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
-
label
: Label untuk volume. -
mount_point
: Jalur sistem file tempat volume harus dipasang. -
partition
: Nomor partisi (berbasis 1), atau 'otomatis' untuk partisi pertama yang dapat digunakan. -
sysfs_path
: Satu atau beberapa jalur sysfs ke perangkat yang dapat menyediakan titik pemasangan ini. Dipisahkan dengan spasi, dan masing-masing harus diawali dengan/
. -
flags
: Daftar bendera opsional yang dipisahkan koma, tidak boleh berisi/
. Nilai yang mungkin termasuknonremovable
dan dapatencryptable
.
Untuk rilis Android 4.3 dan yang lebih baru, berbagai file fstab yang digunakan oleh init, vold, dan pemulihan disatukan dalam file /fstab.<device>
. Untuk volume penyimpanan eksternal yang dikelola oleh vold
, entri harus memiliki format berikut:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
-
src
: Jalur di bawah sysfs (biasanya dipasang di /sys) ke perangkat yang dapat menyediakan titik pemasangan. Jalur harus dimulai dengan/
. -
mount_point
: Jalur sistem file tempat volume harus dipasang. -
type
: Jenis sistem file pada volume. Untuk kartu eksternal, ini biasanyavfat
. -
mnt_flags
:Vold
mengabaikan bidang ini dan harus disetel kedefaults
-
fs_mgr_flags
:Vold
mengabaikan baris apa pun di fstab terpadu yang tidak menyertakan benderavoldmanaged=
di bidang ini. Bendera ini harus diikuti dengan label yang menjelaskan kartu, dan nomor partisi atau kataauto
. Berikut ini contohnya:voldmanaged=sdcard:auto
. Tanda lain yang mungkin adalahnonremovable
,encryptable=sdcard
,noemulatedsd
, danencryptable=userdata
.
Detail konfigurasi
Interaksi penyimpanan eksternal pada dan di atas tingkat kerangka kerja ditangani melalui StorageManagerService
. Karena perubahan konfigurasi di Android 6.0 (seperti penghapusan hamparan sumber daya storage_list.xml), detail konfigurasi dibagi menjadi dua kategori.
Android 5.x dan sebelumnya
File konfigurasi storage_list.xml
khusus perangkat, biasanya disediakan melalui overlay frameworks/base
, mendefinisikan atribut dan batasan perangkat penyimpanan. Elemen <StorageList>
berisi satu atau lebih elemen <storage>
, salah satunya harus ditandai sebagai utama. Atribut <storage>
meliputi:
-
mountPoint
: jalur sistem file dari mount ini. -
storageDescription
: sumber daya string yang menjelaskan mount ini. -
primary
: true jika mount ini adalah penyimpanan eksternal utama. -
removable
: benar jika mount ini memiliki media removable, seperti kartu SD fisik. -
emulated
: true jika mount ini diemulasi dan didukung oleh penyimpanan internal, mungkin menggunakan daemon FUSE. -
mtp-reserve
: jumlah MB penyimpanan yang harus disediakan MTP untuk penyimpanan gratis. Hanya digunakan ketika mount ditandai sebagai ditiru. -
allowMassStorage
: benar jika mount ini dapat dibagikan melalui penyimpanan massal USB. -
maxFileSize
: ukuran file maksimum dalam MB.
Perangkat dapat menyediakan penyimpanan eksternal dengan meniru sistem file case-insensitive dan tanpa izin yang didukung oleh penyimpanan internal. Satu kemungkinan implementasi disediakan oleh daemon FUSE di system/core/sdcard
, yang dapat ditambahkan sebagai layanan init.rc
khusus perangkat:
# virtual sdcard daemon running as media_rw (1023) service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023 class late_start
Di mana source_path
adalah penyimpanan internal pendukung dan dest_path
adalah titik pemasangan target.
Saat mengonfigurasi skrip init.rc
khusus perangkat, variabel lingkungan EXTERNAL_STORAGE
harus ditentukan sebagai jalur ke penyimpanan eksternal utama. Jalur /sdcard
juga harus diselesaikan ke lokasi yang sama, mungkin melalui symlink. Jika perangkat menyesuaikan lokasi penyimpanan eksternal di antara pembaruan platform, symlink harus dibuat agar jalur lama terus berfungsi.
Android 6.0
Konfigurasi subsistem penyimpanan sekarang terkonsentrasi di file fstab
khusus perangkat, dan beberapa file/variabel konfigurasi statis historis telah dihapus untuk mendukung perilaku yang lebih dinamis:
- Hamparan sumber daya
storage_list.xml
telah dihapus dan tidak lagi digunakan oleh kerangka kerja. Perangkat penyimpanan sekarang dikonfigurasi secara dinamis ketika terdeteksi olehvold
. - Variabel lingkungan
EMULATED_STORAGE_SOURCE/TARGET
telah dihapus dan tidak lagi digunakan oleh Zygote untuk mengonfigurasi titik pemasangan khusus pengguna. Sebagai gantinya, pemisahan pengguna sekarang diberlakukan dengan GID khusus pengguna, dan penyimpanan bersama utama dipasang ke tempatnya secaravold
saat runtime.- Pengembang dapat terus membangun jalur secara dinamis atau statis tergantung pada kasus penggunaannya. Menyertakan UUID di jalur mengidentifikasi setiap kartu untuk memperjelas lokasi bagi pengembang. (Misalnya,
/storage/ABCD-1234/report.txt
jelas merupakan file yang berbeda dari/storage/DCBA-4321/report.txt
.)
- Pengembang dapat terus membangun jalur secara dinamis atau statis tergantung pada kasus penggunaannya. Menyertakan UUID di jalur mengidentifikasi setiap kartu untuk memperjelas lokasi bagi pengembang. (Misalnya,
- Layanan FUSE hard-code telah dihapus dari file
init.rc
khusus perangkat dan sebagai gantinya bercabang secara dinamis darivold
bila diperlukan.
Selain perubahan konfigurasi ini, Android 6.0 menyertakan gagasan penyimpanan yang dapat diadopsi. Untuk perangkat Android 6.0, media fisik apa pun yang tidak diadopsi dianggap portabel.
Penyimpanan yang dapat diadopsi
Untuk menunjukkan perangkat penyimpanan yang dapat diadopsi di fstab
, gunakan atribut encryptable=userdata
di bidang fs_mgr_flags
. Berikut definisi tipikal:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Ketika perangkat penyimpanan diadopsi, platform menghapus konten dan menulis tabel partisi GUID yang mendefinisikan dua partisi:
- partisi
android_meta
kecil kosong yang dicadangkan untuk penggunaan di masa mendatang. GUID tipe partisi adalah 19A710A2-B3CA-11E4-B026-10604B889DCF. - partisi
android_ext
besar yang dienkripsi menggunakan dm-crypt dan diformat menggunakanext4
atauf2fs
tergantung pada kemampuan kernel. GUID tipe partisi adalah 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Penyimpanan portabel
Di fstab
, perangkat penyimpanan dengan atribut voldmanaged
dianggap portabel secara default kecuali atribut lain seperti encryptable=userdata
didefinisikan. Misalnya, berikut adalah definisi umum untuk perangkat USB OTG:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
Platform menggunakan blkid
untuk mendeteksi jenis sistem file sebelum pemasangan, dan pengguna dapat memilih untuk memformat media saat sistem file tidak didukung.