ระบบจัดการพื้นที่เก็บข้อมูลภายนอกโดยรวมบริการ vold
init
service และStorageManagerService
system service vold
จะจัดการการต่อเชื่อมวอลุ่มพื้นที่เก็บข้อมูลภายนอกจริง ซึ่งจะดำเนินการเตรียมความพร้อมสื่อก่อนที่จะแสดงให้แอปเห็น
หมายเหตุ: ใน Android 8.0 ระบบได้เปลี่ยนชื่อคลาส MountService
เป็น StorageManagerService
การแมปไฟล์
สำหรับ Android 4.2.2 และเวอร์ชันก่อนหน้า vold.fstab
ไฟล์การกำหนดค่าสำหรับอุปกรณ์แต่ละเครื่องจะกำหนดการแมปจากอุปกรณ์ sysfs ไปยังจุดต่อเชื่อมไฟล์ระบบ และแต่ละบรรทัดจะเป็นไปตามรูปแบบนี้
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
label
: ป้ายกำกับสำหรับระดับเสียงmount_point
: เส้นทางระบบไฟล์ที่ควรต่อเชื่อมวอลุ่มpartition
: หมายเลขพาร์ติชัน (ฐาน 1) หรือ "auto" สำหรับพาร์ติชันแรกที่ใช้งานได้sysfs_path
: เส้นทาง sysfs อย่างน้อย 1 เส้นทางไปยังอุปกรณ์ที่ให้จุดยึดนี้ได้ แยกกันด้วยการเว้นวรรค และแต่ละรายการต้องขึ้นต้นด้วย/
flags
: รายการ Flag ที่คั่นด้วยคอมมา (ไม่บังคับ) ต้องไม่มี/
ค่าที่เป็นไปได้ ได้แก่nonremovable
และencryptable
สำหรับ Android เวอร์ชัน 4.3 ขึ้นไป ไฟล์ fstab ต่างๆ ที่ init, vold และ recovery ใช้จะรวมอยู่ในไฟล์ /fstab.<device>
สำหรับวอลุ่มพื้นที่เก็บข้อมูลภายนอกที่จัดการโดย vold
รายการควรอยู่ในรูปแบบต่อไปนี้
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
src
: เส้นทางภายใต้ sysfs (โดยปกติจะติดตั้งที่ /sys) ไปยังอุปกรณ์ที่ระบุจุดต่อเชื่อมได้ เส้นทางต้องขึ้นต้นด้วย/
mount_point
: เส้นทางระบบไฟล์ที่ควรต่อเชื่อมวอลุ่มtype
: ประเภทของระบบไฟล์ในวอลุ่ม สำหรับการ์ดภายนอก ปกติแล้วค่านี้จะเท่ากับvfat
mnt_flags
:Vold
ละเว้นช่องนี้และควรตั้งค่าเป็นdefaults
fs_mgr_flags
:Vold
จะไม่สนใจบรรทัดใดๆ ใน fstab แบบรวม ที่ไม่มี Flagvoldmanaged=
ในช่องนี้ FLAG นี้ต้องตามด้วยป้ายกำกับที่อธิบายการ์ด และหมายเลขพาร์ติชันหรือคำว่าauto
ตัวอย่างคือvoldmanaged=sdcard:auto
Flag อื่นๆ ที่เป็นไปได้คือnonremovable
,encryptable=sdcard
,noemulatedsd
และencryptable=userdata
รายละเอียดการกําหนดค่า
การโต้ตอบกับพื้นที่เก็บข้อมูลภายนอกที่ระดับเฟรมเวิร์กขึ้นไปจะจัดการผ่าน StorageManagerService
เนื่องจากการเปลี่ยนแปลงการกําหนดค่าใน Android 6.0 (เช่น การนำการวางซ้อนทรัพยากร storage_list.xml ออก) รายละเอียดการกําหนดค่าจึงแบ่งออกเป็น 2 หมวดหมู่
Android 5.x และเก่ากว่า
ไฟล์การกําหนดค่า storage_list.xml
สำหรับอุปกรณ์แต่ละเครื่อง ซึ่งโดยปกติจะระบุผ่านการวางซ้อน frameworks/base
จะกําหนดแอตทริบิวต์และข้อจํากัดของอุปกรณ์จัดเก็บข้อมูล องค์ประกอบ <StorageList>
มีองค์ประกอบ <storage>
อย่างน้อย 1 รายการ โดยควรทำเครื่องหมายองค์ประกอบใดองค์ประกอบหนึ่งเป็นองค์ประกอบหลัก แอตทริบิวต์ <storage>
ประกอบด้วย
mountPoint
: เส้นทางไฟล์ระบบของการติดตั้งนี้storageDescription
: ทรัพยากรสตริงที่อธิบายการต่อเชื่อมนี้primary
: จริงหากการต่อเชื่อมนี้เป็นพื้นที่เก็บข้อมูลภายนอกหลักremovable
: จริงหากการต่อเชื่อมนี้มีสื่อแบบถอดออกได้ เช่น การ์ด SDemulated
: จริงหากการต่อเชื่อมนี้เป็นการจําลองและมีการสำรองข้อมูลโดยที่จัดเก็บข้อมูลภายใน ซึ่งอาจใช้ DEMON ของ FUSEmtp-reserve
: จำนวน MB ของพื้นที่เก็บข้อมูล MTP ควรสำรองไว้สำหรับพื้นที่เก็บข้อมูลฟรี ใช้เฉพาะเมื่อมีการทําเครื่องหมายการต่อเชื่อมเป็นการจําลองเท่านั้นallowMassStorage
: จริงหากสามารถแชร์การต่อเชื่อมนี้ผ่านอุปกรณ์เก็บข้อมูลขนาดใหญ่ USB ได้maxFileSize
: ขนาดไฟล์สูงสุดเป็น MB
อุปกรณ์อาจจัดเก็บข้อมูลภายนอกโดยการจําลองระบบไฟล์ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่และไม่มีสิทธิ์ ซึ่งสำรองข้อมูลไว้ในที่จัดเก็บข้อมูลภายใน การใช้งานที่เป็นไปได้อย่างหนึ่งคือจาก FUSE daemon ใน system/core/sdcard
ซึ่งสามารถเพิ่มเป็นบริการ init.rc
สำหรับอุปกรณ์โดยเฉพาะได้ ดังนี้
# virtual sdcard daemon running as media_rw (1023) service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023 class late_start
โดยที่ source_path
คือพื้นที่เก็บข้อมูลภายในสำรอง และ dest_path
คือจุดต่อเชื่อมเป้าหมาย
เมื่อกำหนดค่าสคริปต์ init.rc
สำหรับอุปกรณ์โดยเฉพาะ คุณต้องกำหนดตัวแปรสภาพแวดล้อม EXTERNAL_STORAGE
เป็นเส้นทางไปยังพื้นที่เก็บข้อมูลภายนอกหลัก เส้นทาง /sdcard
จะต้องนำไปยังตำแหน่งเดียวกันด้วย ซึ่งอาจเป็นผ่านสัญลักษณ์ลิงก์ หากอุปกรณ์ปรับตำแหน่งของพื้นที่เก็บข้อมูลภายนอกระหว่างการอัปเดตแพลตฟอร์ม คุณควรสร้างลิงก์สัญลักษณ์เพื่อให้เส้นทางเดิมทำงานต่อไปได้
Android 6.0
ตอนนี้การกำหนดค่าระบบย่อยของพื้นที่เก็บข้อมูลจะอยู่ในไฟล์ fstab
สำหรับอุปกรณ์แต่ละเครื่อง และระบบได้นําไฟล์/ตัวแปรการกําหนดค่าแบบคงที่ที่ผ่านมาออกแล้วเพื่อรองรับลักษณะการทํางานแบบไดนามิกมากขึ้น
- ระบบนำการวางซ้อนทรัพยากร
storage_list.xml
ออกแล้ว และเฟรมเวิร์กไม่ได้ใช้อีกต่อไป ตอนนี้อุปกรณ์เก็บข้อมูลได้รับการกำหนดค่าแบบไดนามิกเมื่อvold
ตรวจพบ - ระบบได้นำตัวแปรสภาพแวดล้อม
EMULATED_STORAGE_SOURCE/TARGET
ออกแล้ว และ Zygote ไม่ได้ใช้ตัวแปรดังกล่าวในการกำหนดค่าจุดมานต์เฉพาะผู้ใช้อีกต่อไป แต่ตอนนี้ระบบจะบังคับใช้การแยกผู้ใช้ด้วย GID ที่เจาะจงผู้ใช้ และvold
จะต่อเชื่อมพื้นที่เก็บข้อมูลหลัก ณ รันไทม์- นักพัฒนาแอปอาจสร้างเส้นทางแบบไดนามิกหรือแบบคงที่ต่อไปได้ ทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน การใส่ UUID ในเส้นทางจะระบุการ์ดแต่ละใบเพื่อให้นักพัฒนาซอฟต์แวร์ทราบตําแหน่งได้ชัดเจนขึ้น (เช่น
/storage/ABCD-1234/report.txt
เป็นไฟล์อื่นที่แตกต่างจาก/storage/DCBA-4321/report.txt
อย่างชัดเจน)
- นักพัฒนาแอปอาจสร้างเส้นทางแบบไดนามิกหรือแบบคงที่ต่อไปได้ ทั้งนี้ขึ้นอยู่กับกรณีการใช้งาน การใส่ UUID ในเส้นทางจะระบุการ์ดแต่ละใบเพื่อให้นักพัฒนาซอฟต์แวร์ทราบตําแหน่งได้ชัดเจนขึ้น (เช่น
- ระบบได้นำบริการ FUSE ที่เขียนมาอย่างเจาะจงออกจากไฟล์
init.rc
สำหรับอุปกรณ์แต่ละเครื่องแล้ว และแยกออกมาจากvold
แบบไดนามิกเมื่อจำเป็นแทน
นอกจากการเปลี่ยนแปลงการกําหนดค่าเหล่านี้แล้ว Android 6.0 ยังมีแนวคิดเรื่อง "พื้นที่เก็บข้อมูลที่พร้อมใช้งาน" สำหรับอุปกรณ์ Android 6.0 ระบบจะถือว่าสื่อแบบแผ่นดิสก์ที่ไม่ได้นำมาใช้เป็นแบบพกพา
พื้นที่เก็บข้อมูลแบบ Adoptable
หากต้องการระบุอุปกรณ์เก็บข้อมูลที่นำมาใช้ได้ใน fstab
ให้ใช้แอตทริบิวต์ encryptable=userdata
ในช่อง fs_mgr_flags
คําจํากัดความทั่วไปมีดังนี้
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
เมื่อนำอุปกรณ์เก็บข้อมูลมาใช้ แพลตฟอร์มจะลบเนื้อหาและเขียนตารางพาร์ติชัน GUID ซึ่งกำหนดพาร์ติชัน 2 รายการ ดังนี้
- พาร์ติชัน
android_meta
ขนาดเล็กที่ว่างเปล่าซึ่งสงวนไว้สำหรับการใช้งานในอนาคต GUID ประเภทพาร์ติชันคือ 19A710A2-B3CA-11E4-B026-10604B889DCF - พาร์ติชัน
android_ext
ขนาดใหญ่ที่เข้ารหัสโดยใช้ dm-crypt และฟอร์แมตโดยใช้ext4
หรือf2fs
ทั้งนี้ขึ้นอยู่กับความสามารถของเคิร์กเนล GUID ประเภทพาร์ติชันคือ 193D1EA4-B3CA-11E4-B075-10604B889DCF
ที่จัดเก็บข้อมูลแบบพกพา
ใน fstab
ระบบจะถือว่าอุปกรณ์เก็บข้อมูลที่มีแอตทริบิวต์ voldmanaged
เป็นอุปกรณ์แบบพกพาโดยค่าเริ่มต้น เว้นแต่จะมีการกำหนดแอตทริบิวต์อื่น เช่น encryptable=userdata
ตัวอย่างเช่น คําจํากัดความทั่วไปสําหรับอุปกรณ์ USB OTG มีดังนี้
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
แพลตฟอร์มใช้ blkid
เพื่อตรวจหาประเภทระบบไฟล์ก่อนการต่อเชื่อม และผู้ใช้สามารถเลือกฟอร์แมตสื่อได้เมื่อระบบไม่รองรับระบบไฟล์