Bộ nhớ ngoài được quản lý bằng sự kết hợp của khởi tạo vold
và dịch vụ hệ thống StorageManagerService
. Cách gắn
phương tiện bộ nhớ ngoài do vold
xử lý
thực hiện các hoạt động thử nghiệm để chuẩn bị nội dung nghe nhìn trước khi hiển thị cho ứng dụng.
Lưu ý: Trong Android 8.0,
Lớp MountService
đã được đổi tên thành
StorageManagerService
.
Liên kết tệp
Đối với Android 4.2.2 trở xuống, vold.fstab
dành riêng cho thiết bị
tệp cấu hình xác định các liên kết từ thiết bị sysfs đến dịch vụ gắn kết hệ thống tệp
điểm và mỗi dòng đều tuân theo định dạng sau:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
label
: Nhãn cho ổ đĩa.mount_point
: Đường dẫn hệ thống tệp nơi ổ đĩa sẽ được gắn kết.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 những thiết bị có thể cung cấp giá đỡ này điểm. Được phân tách bằng dấu cách và mỗi đường dẫn phải bắt đầu bằng/
.flags
: Danh sách cờ (không bắt buộc) được phân tách bằng dấu phẩy, 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 khác nhau mà init, vold và
khôi phục được hợp nhất trong tệp /fstab.<device>
. Để gắn ngoài
ổ đĩa lưu trữ do vold
quản lý, các mục nhập phải có phần tử
đị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 tại /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 ổ đĩa sẽ được gắn kết.type
: Loại hệ thống tệp trên ổ đĩa. Đố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 cần đặt trường này đếndefaults
fs_mgr_flags
:Vold
bỏ qua mọi dòng trong thẻ fstab hợp nhất không có cờvoldmanaged=
trong trường này. Cờ này phải theo sau là nhãn mô tả thẻ, số phân vùng hoặc từauto
. Ví dụ:voldmanaged=sdcard:auto
. Có thể có các cờ khá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 và trên cấp độ khung đều được xử lý
thông qua StorageManagerService
. Do có thay đổi về cấu hình trong
Android 6.0 (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
Cấu hình storage_list.xml
dành riêng cho thiết bị
thường được cung cấp thông qua một lớp phủ frameworks/base
, xác định
các thuộc tính và giới hạn của thiết bị lưu trữ. Phần tử <StorageList>
chứa một hoặc nhiều phần tử <storage>
, chính xác là một trong số đó cần được đánh dấu
chính. Các thuộc tính <storage>
bao gồm:
mountPoint
: đường dẫn hệ thống tệp của thành phần gắn kết này.storageDescription
: tài nguyên chuỗi mô tả giá trị gắn kết này.primary
: true nếu giá đỡ này là bộ nhớ ngoài chính.removable
: true nếu giá đỡ này có phương tiện di động, chẳng hạn như thẻ SD thực .emulated
: true nếu giá đỡ này được mô phỏng và được bộ nhớ trong hỗ trợ, có thể là trình nền FUSE.mtp-reserve
: số MB bộ nhớ mà MTP nên dự trữ miễn phí bộ nhớ. Chỉ được dùng khi giá trị gắn được đánh dấu là mô phỏng.allowMassStorage
: true nếu có thể chia sẻ giá đỡ này qua bộ nhớ dung 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 trường hợp sử dụng không phân biệt chữ hoa chữ thường,
hệ thống tệp không có quyền được bộ nhớ trong hỗ trợ. 1 khả năng
quá trình triển khai này do trình nền FUSE cung cấp trong system/core/sdcard
, có thể
sẽ được thêm 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ị, EXTERNAL_STORAGE
biến môi trường phải được định nghĩa là đường dẫn đến
bộ nhớ. Đường dẫn /sdcard
cũng phải phân giải đến cùng một vị trí, có thể là
thông qua đường liên kết tượng trưng. Nếu thiết bị điều chỉnh vị trí của bộ nhớ ngoài trong khoảng
các bản cập nhật nền tảng, 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 lưu trữ con hiện tập trung vào
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 đã
đã xoá để hỗ trợ hành vi linh hoạt hơn:
- Lớp phủ tài nguyên
storage_list.xml
đã bị xoá và không còn được khung sử dụng. Các thiết bị lưu trữ hiện được định cấu hình động khi đượcvold
phát hiện. - Các biến môi trường
EMULATED_STORAGE_SOURCE/TARGET
đã bị xoá và không còn được Zygote dùng để định cấu hình điểm gắn dành riêng cho người dùng. Thay vào đó, quy trình phân tách người dùng hiện đã được thực thi với GID dành riêng cho người dùng, đồng thời bộ nhớ dùng chung chính đượcvold
gắn kết vào vị trí trong thời gian chạy.- Nhà phát triển có thể tiếp tục xây dựng đường dẫn theo phương thức động hoặc tĩnh, tuỳ thuộc vào
trường hợp sử dụng của họ. Việc thêm mã nhận dạng duy nhất (UUID) trong đường dẫn sẽ xác định từng thẻ cần thực hiện
vị trí rõ ràng hơn cho nhà phát triển. (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 xây dựng đường dẫn theo phương thức động hoặc tĩnh, tuỳ thuộc vào
trường hợp sử dụng của họ. Việc thêm mã nhận dạng duy nhất (UUID) trong đường dẫn sẽ xác định từng thẻ cần thực hiện
vị trí rõ ràng hơn cho nhà phát triển. (Ví dụ:
- Các dịch vụ FUSE được cố định giá trị trong mã đã bị xoá khỏi các tệp
init.rc
dành riêng cho thiết bị và thay vào đó sẽ được phát triển nhánh một cách linh động từvold
khi cần.
Ngoài những thay đổi về cấu hình này, Android 6.0 bao gồm khái niệm bộ nhớ thích ứng. Đối với thiết bị Android 6.0, bất kỳ phương tiện vật lý nào không được sử dụng được xem là di động.
Bộ nhớ tích hợp
Để cho biết thiết bị lưu trữ có thể sử dụng trong fstab
, hãy dùng thuộc tính encryptable=userdata
trong trường fs_mgr_flags
. Sau đây là định nghĩa điển hình:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Khi bạn sử dụng một thiết bị lưu trữ, nền tảng sẽ xoá nội dung và ghi một Bảng phân vùng GUID xác định 2 phân vùng:
- một phân vùng
android_meta
trống nhỏ được dành riêng để sử dụng trong tương lai. Loại phân vùng GUID 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 khả năng của hạt nhân. Loại phân vùng GUID 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à có thể di chuyển theo mặc định, trừ phi có thuộc tính khác
như encryptable=userdata
được định nghĩa. Ví dụ: dưới đâ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
khi hệ thống tệp không được hỗ trợ.