Cấu hình thiết bị

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à nonremovableencryptable.

Đố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ành defaults
  • 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, noemulatedsdencryptable=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 khi vold 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 được vold 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.)
  • 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ằng ext4 hoặc f2fs 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ợ.