Penyimpanan eksternal dikelola oleh kombinasi layanan vold
init dan layanan sistem StorageManagerService
. Pemasangan volume penyimpanan eksternal fisik ditangani oleh vold
, yang melakukan operasi pementasan untuk mempersiapkan 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 lebih jalur sysfs ke perangkat yang dapat menyediakan titik pemasangan ini. Dipisahkan dengan spasi, dan masing-masing harus dimulai dengan/
. -
flags
: Daftar flag opsional yang dipisahkan koma, tidak boleh mengandung/
. Nilai yang mungkin mencakupnonremovable
danencryptable
.
Untuk Android rilis 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 bawah sysfs (biasanya dipasang di /sys) ke perangkat yang dapat menyediakan titik pemasangan. Jalurnya harus dimulai dengan/
. -
mount_point
: Jalur sistem file tempat volume harus dipasang. -
type
: Jenis sistem file pada volume. Untuk kartu eksternal biasanyavfat
. -
mnt_flags
:Vold
mengabaikan kolom ini dan harus disetel kedefaults
-
fs_mgr_flags
:Vold
mengabaikan baris apa pun di fstab terpadu yang tidak menyertakan tandavoldmanaged=
di bidang ini. Bendera ini harus diikuti dengan label yang menjelaskan kartu tersebut, 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 versi lebih lama
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 primer. Atribut <storage>
meliputi:
-
mountPoint
: jalur sistem file dari mount ini. -
storageDescription
: sumber daya string yang menjelaskan pemasangan ini. -
primary
: benar jika pemasangan ini adalah penyimpanan eksternal utama. -
removable
: benar jika dudukan ini memiliki media yang dapat dipindahkan, seperti kartu SD fisik. -
emulated
: benar jika mount ini ditiru dan didukung oleh penyimpanan internal, kemungkinan menggunakan daemon FUSE. -
mtp-reserve
: jumlah MB penyimpanan yang harus dicadangkan 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 yang tidak peka huruf besar-kecil dan tidak memiliki izin 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
Dimana 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 mengarah ke lokasi yang sama, mungkin melalui symlink. Jika perangkat menyesuaikan lokasi penyimpanan eksternal di antara pembaruan platform, symlink harus dibuat agar jalur lama tetap berfungsi.
Android 6.0
Konfigurasi subsistem penyimpanan kini terkonsentrasi pada 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. Sebaliknya, pemisahan pengguna kini diterapkan dengan GID khusus pengguna, dan penyimpanan bersama utama dipasang secaravold
saat runtime.- Pengembang dapat terus membangun jalur secara dinamis atau statis bergantung 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 bergantung pada kasus penggunaannya. Menyertakan UUID di jalur mengidentifikasi setiap kartu untuk memperjelas lokasi bagi pengembang. (Misalnya,
- Layanan FUSE yang dikodekan secara keras telah dihapus dari file
init.rc
khusus perangkat dan sebagai gantinya di-fork 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 umumnya:
/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
kosong kecil 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
bergantung 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
ditentukan. Misalnya, berikut 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 ketika sistem file tidak didukung.