Bộ nhớ ngoài được quản lý bằng cách kết hợp dịch vụ khởi động vold
và dịch vụ hệ thống StorageManagerService
. Việc gắn các ổ bộ nhớ ngoài thực tế được xử lý bằng vold
. vold
thực hiện các thao tác phân đoạn để chuẩn bị nội dung nghe nhìn trước khi hiển thị nội dung đó cho các ứng dụng.
Lưu ý: Trong Android 8.0, lớp MountService
được đổi tên thành StorageManagerService
.
Ánh xạ tệp
Đối với Android 4.2.2 trở xuống, tệp cấu hình vold.fstab
dành riêng cho thiết bị xác định các mối liên kết từ thiết bị sysfs đến các điểm gắn hệ thống tệp và mỗi dòng tuân theo định dạng sau:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
label
: Nhãn cho âm lượng.mount_point
: Đường dẫn hệ thống tệp nơi gắn phương tiện.partition
: Số phân vùng (dựa trên 1) hoặc "tự động" cho phân vùng có thể sử dụng đầu tiên.sysfs_path
: Một hoặc nhiều đường dẫn sysfs đến các thiết bị có thể cung cấp điểm gắn này. Được phân tách bằng dấu cách và mỗi phần tử phải bắt đầu bằng/
.flags
: Danh sách cờ được phân tách bằng dấu phẩy (không bắt buộc), không được chứa/
. Các giá trị có thể lànonremovable
vàencryptable
.
Đối với các bản phát hành Android 4.3 trở lên, các tệp fstab mà init, vold và recovery sử dụng đã được hợp nhất trong tệp /fstab.<device>
. Đối với các ổ bộ nhớ ngoài do vold
quản lý, các mục nhập phải có định dạng sau:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
src
: Một đường dẫn trong sysfs (thường được gắn ở /sys) đến thiết bị có thể cung cấp điểm gắn. Đường dẫn phải bắt đầu bằng/
.mount_point
: Đường dẫn hệ thống tệp nơi gắn phương tiện.type
: Loại hệ thống tệp trên phương tiện. Đối với thẻ bên ngoài, giá trị này thường làvfat
.mnt_flags
:Vold
bỏ qua trường này và bạn nên đặt trường này thànhdefaults
fs_mgr_flags
:Vold
bỏ qua mọi dòng trong fstab hợp nhất không chứa cờvoldmanaged=
trong trường này. Cờ này phải được theo sau là một nhãn mô tả thẻ và số phân vùng hoặc từauto
. Sau đây là một ví dụ:voldmanaged=sdcard:auto
. Các cờ khác có thể có lànonremovable
,encryptable=sdcard
,noemulatedsd
vàencryptable=userdata
.
Chi tiết cấu hình
Các hoạt động tương tác với bộ nhớ ngoài ở cấp khung trở lên được xử lý thông qua StorageManagerService
. Do các thay đổi về cấu hình trong Android 6.0 (chẳng hạn như việc xoá lớp phủ tài nguyên storage_list.xml), chi tiết cấu hình được chia thành hai danh mục.
Android 5.x trở xuống
Tệp cấu hình storage_list.xml
dành riêng cho thiết bị, thường được cung cấp thông qua lớp phủ frameworks/base
, xác định các thuộc tính và quy tắc ràng buộc của thiết bị lưu trữ. Phần tử <StorageList>
chứa một hoặc nhiều phần tử <storage>
, trong đó chỉ có một phần tử được đánh dấu là chính. Các thuộc tính <storage>
bao gồm:
mountPoint
: đường dẫn hệ thống tệp của phương thức gắn này.storageDescription
: tài nguyên chuỗi mô tả phương thức gắn này.primary
: đúng nếu phương thức gắn này là bộ nhớ ngoài chính.removable
: đúng nếu phương tiện gắn này có phương tiện có thể tháo rời, chẳng hạn như thẻ SD thực.emulated
: đúng nếu phương thức gắn này được mô phỏng và được sao lưu bằng bộ nhớ trong, có thể sử dụng trình nền FUSE.mtp-reserve
: số MB bộ nhớ mà MTP nên dành riêng cho bộ nhớ trống. Chỉ được dùng khi điểm gắn được đánh dấu là được mô phỏng.allowMassStorage
: đúng nếu bạn có thể chia sẻ phương tiện gắn này qua bộ nhớ khối lượng lớn USB.maxFileSize
: kích thước tệp tối đa tính bằng MB.
Các thiết bị có thể cung cấp bộ nhớ ngoài bằng cách mô phỏng một hệ thống tệp không phân biệt chữ hoa chữ thường, không cần quyền và được bộ nhớ trong hỗ trợ. Một phương thức triển khai có thể được cung cấp bởi trình nền FUSE trong system/core/sdcard
. Bạn có thể thêm phương thức này dưới dạng dịch vụ init.rc
dành riêng cho thiết bị:
# virtual sdcard daemon running as media_rw (1023) service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023 class late_start
Trong đó source_path
là bộ nhớ trong sao lưu và dest_path
là điểm gắn mục tiêu.
Khi định cấu hình tập lệnh init.rc
dành riêng cho thiết bị, bạn phải xác định biến môi trường EXTERNAL_STORAGE
là đường dẫn đến bộ nhớ ngoài chính. Đường dẫn /sdcard
cũng phải phân giải đến cùng một vị trí, có thể thông qua một đường liên kết tượng trưng. Nếu một thiết bị điều chỉnh vị trí của bộ nhớ ngoài giữa các bản cập nhật nền tảng, bạn nên tạo các đường liên kết tượng trưng để các đường dẫn cũ tiếp tục hoạt động.
Android 6.0
Cấu hình của hệ thống con bộ nhớ hiện tập trung trong tệp fstab
dành riêng cho thiết bị và một số tệp/biến cấu hình tĩnh trước đây đã bị xoá để hỗ trợ hành vi linh động hơn:
- Lớp phủ tài nguyên
storage_list.xml
đã bị xoá và không còn được khung sử dụng nữa. Các thiết bị lưu trữ hiện được định cấu hình động khivold
phát hiện. - Các biến môi trường
EMULATED_STORAGE_SOURCE/TARGET
đã bị xoá và Zygote không còn sử dụng các biến này để định cấu hình các điểm gắn dành riêng cho người dùng nữa. Thay vào đó, việc phân tách người dùng hiện được thực thi bằng GID dành riêng cho người dùng và bộ nhớ dùng chung chính đượcvold
gắn vào vị trí trong thời gian chạy.- Nhà phát triển có thể tiếp tục tạo đường dẫn một cách linh động hoặc tĩnh tuỳ thuộc vào trường hợp sử dụng. Việc đưa UUID vào đường dẫn sẽ xác định từng thẻ để giúp nhà phát triển nắm rõ hơn vị trí. (Ví dụ:
/storage/ABCD-1234/report.txt
rõ ràng là một tệp khác với/storage/DCBA-4321/report.txt
.)
- Nhà phát triển có thể tiếp tục tạo đường dẫn một cách linh động hoặc tĩnh tuỳ thuộc vào trường hợp sử dụng. Việc đưa UUID vào đường dẫn sẽ xác định từng thẻ để giúp nhà phát triển nắm rõ hơn vị trí. (Ví dụ:
- Các dịch vụ FUSE được mã hoá cứng đã bị xoá khỏi các tệp
init.rc
dành riêng cho thiết bị và thay vào đó, các dịch vụ này được phân nhánh động từvold
khi cần.
Ngoài những thay đổi về cấu hình này, Android 6.0 còn có khái niệm về bộ nhớ có thể sử dụng. Đối với các thiết bị Android 6.0, mọi phương tiện vật lý không được sử dụng sẽ được xem là phương tiện di động.
Bộ nhớ thích ứng
Để chỉ báo một thiết bị bộ nhớ có thể sử dụng trong fstab
, hãy sử dụng thuộc tính encryptable=userdata
trong trường fs_mgr_flags
. Sau đây là định nghĩa thông thường:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Khi một thiết bị lưu trữ được chấp nhận, nền tảng sẽ xoá nội dung và ghi bảng phân vùng GUID xác định hai phân vùng:
- một phân vùng
android_meta
trống nhỏ được dành để sử dụng trong tương lai. GUID loại phân vùng là 19A710A2-B3CA-11E4-B026-10604B889DCF. - một phân vùng
android_ext
lớn được mã hoá bằng dm-crypt và được định dạng bằngext4
hoặcf2fs
tuỳ thuộc vào chức năng của hạt nhân. GUID loại phân vùng là 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Bộ nhớ di động
Trong fstab
, các thiết bị lưu trữ có thuộc tính voldmanaged
được coi là thiết bị di động theo mặc định, trừ phi bạn xác định một thuộc tính khác như encryptable=userdata
. Ví dụ: sau đây là định nghĩa thông thường cho các thiết bị USB OTG:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
Nền tảng này sử dụng blkid
để phát hiện các loại hệ thống tệp trước khi gắn và người dùng có thể chọn định dạng phương tiện khi hệ thống tệp không được hỗ trợ.