Penyimpanan eksternal dikelola oleh kombinasi layanan init
vold
dan layanan sistem StorageManagerService
. Pemasangan
volume penyimpanan eksternal fisik ditangani oleh vold
, yang
melakukan operasi staging untuk menyiapkan media sebelum mengeksposnya ke aplikasi.
Catatan: Di Android 8.0, class MountService
diganti namanya menjadi
StorageManagerService
.
Pemetaan file
Untuk Android 4.2.2 dan yang lebih lama, file konfigurasi vold.fstab
khusus perangkat menentukan pemetaan dari perangkat sysfs ke titik mount
file sistem, 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 mount ini. Dipisahkan dengan spasi, dan setiap parameter harus diawali dengan/
.flags
: Daftar flag opsional yang dipisahkan koma, tidak boleh berisi/
. Nilai yang mungkin mencakupnonremovable
danencryptable
.
Untuk rilis Android 4.3 dan yang lebih baru, berbagai file fstab yang digunakan oleh init, vold, dan
recovery 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 sysfs (biasanya dipasang di /sys) ke perangkat yang dapat memberikan titik pemasangan. Jalur harus diawali 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 kolom ini dan harus ditetapkan kedefaults
fs_mgr_flags
:Vold
mengabaikan baris apa pun dalam fstab terpadu yang tidak menyertakan tandavoldmanaged=
di kolom ini. Flag ini harus diikuti dengan label yang menjelaskan kartu, dan nomor partisi atau kataauto
. Berikut adalah contohnya:voldmanaged=sdcard:auto
. Flag lain yang mungkin adalahnonremovable
,encryptable=sdcard
,noemulatedsd
, danencryptable=userdata
.
Detail konfigurasi
Interaksi penyimpanan eksternal di dan di atas level framework ditangani
melalui StorageManagerService
. Karena perubahan konfigurasi di
Android 6.0 (seperti penghapusan overlay resource storage_list.xml), detail konfigurasi dibagi menjadi dua kategori.
Android 5.x dan yang lebih lama
File konfigurasi storage_list.xml
khusus perangkat, yang biasanya disediakan melalui overlay frameworks/base
, menentukan
atribut dan batasan perangkat penyimpanan. Elemen <StorageList>
berisi satu atau beberapa elemen <storage>
, yang salah satunya harus ditandai
sebagai utama. Atribut <storage>
mencakup:
mountPoint
: jalur sistem file pemasangan ini.storageDescription
: resource string yang mendeskripsikan pemasangan ini.primary
: benar jika pemasangan ini adalah penyimpanan eksternal utama.removable
: benar jika pemasangan ini memiliki media yang dapat dilepas, seperti kartu SD fisik.emulated
: benar jika pemasangan ini diemulasi dan didukung oleh penyimpanan internal, mungkin menggunakan daemon FUSE.mtp-reserve
: jumlah MB penyimpanan yang harus dicadangkan MTP untuk penyimpanan gratis. Hanya digunakan saat pemasangan ditandai sebagai diemulasi.allowMassStorage
: benar jika pemasangan ini dapat dibagikan melalui penyimpanan massal USB.maxFileSize
: ukuran file maksimum dalam MB.
Perangkat dapat menyediakan penyimpanan eksternal dengan mengemulasi sistem file tanpa izin
dan tidak peka huruf besar/kecil yang didukung oleh penyimpanan internal. Salah 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
Dengan source_path
adalah penyimpanan internal pendukung dan dest_path
adalah
direktori 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 di-resolve ke lokasi yang sama, mungkin
melalui symlink. Jika perangkat menyesuaikan lokasi penyimpanan eksternal di antara
update platform, symlink harus dibuat agar jalur lama terus berfungsi.
Android 6.0
Konfigurasi subsistem penyimpanan kini terkonsentrasi dalam
file fstab
khusus perangkat, dan beberapa file/variabel konfigurasi statis historis telah
dihapus untuk mendukung perilaku yang lebih dinamis:
- Overlay resource
storage_list.xml
telah dihapus dan tidak lagi digunakan oleh framework. Perangkat penyimpanan kini dikonfigurasi secara dinamis saat 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 kini diterapkan dengan GID khusus pengguna, dan penyimpanan bersama utama dipasang ke tempatnya olehvold
saat runtime.- Developer dapat terus mem-build jalur secara dinamis atau statis, bergantung pada kasus penggunaannya. Menyertakan UUID dalam jalur akan mengidentifikasi setiap kartu untuk membuat
lokasi lebih jelas bagi developer. (Misalnya,
/storage/ABCD-1234/report.txt
jelas merupakan file yang berbeda dengan/storage/DCBA-4321/report.txt
.)
- Developer dapat terus mem-build jalur secara dinamis atau statis, bergantung pada kasus penggunaannya. Menyertakan UUID dalam jalur akan mengidentifikasi setiap kartu untuk membuat
lokasi lebih jelas bagi developer. (Misalnya,
- Layanan FUSE yang di-hardcode telah dihapus dari file
init.rc
khusus perangkat dan sebagai gantinya di-fork secara dinamis darivold
saat diperlukan.
Selain perubahan konfigurasi ini, Android 6.0 menyertakan konsep penyimpanan yang dapat diadopsi. Untuk perangkat Android 6.0, media fisik apa pun yang tidak diadopsi akan dianggap sebagai portabel.
Penyimpanan yang dapat diadaptasi
Untuk menunjukkan perangkat penyimpanan yang dapat diadopsi di fstab
, gunakan atribut encryptable=userdata
di kolom fs_mgr_flags
. Berikut adalah definisi umumnya:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Saat perangkat penyimpanan diadopsi, platform akan menghapus konten dan menulis tabel partisi GUID yang menentukan dua partisi:
- partisi
android_meta
kosong kecil yang dicadangkan untuk penggunaan pada masa mendatang. GUID jenis partisi adalah 19A710A2-B3CA-11E4-B026-10604B889DCF. - partisi
android_ext
besar yang dienkripsi menggunakan dm-crypt dan diformat menggunakanext4
atauf2fs
, bergantung pada kemampuan kernel. GUID jenis partisi adalah 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Penyimpanan portabel
Di fstab
, perangkat penyimpanan dengan atribut voldmanaged
dianggap portabel secara default, kecuali jika atribut lain
seperti encryptable=userdata
ditentukan. Misalnya, berikut adalah definisi umum untuk perangkat USB OTG:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
Platform ini menggunakan blkid
untuk mendeteksi jenis sistem file sebelum pemasangan, dan pengguna dapat memilih untuk memformat
media jika sistem file tidak didukung.