Cấu hình thiết bị

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

Đố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 đến defaults
  • 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, 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 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 được vold 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 được vold 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.)
  • 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ằng ext4 hoặc f2fs 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ợ.