Cấu hình thiết bị

Bộ nhớ ngoài được quản lý bằng sự kết hợp giữa dịch vụ init vold và dịch vụ hệ thống StorageManagerService . Việc gắn các ổ lưu trữ vật lý bên ngoài được xử lý bởi vold , thực hiện các hoạt động dàn dựng để chuẩn bị phương tiện trước khi đưa nó vào ứ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ở về trước, tệp cấu hình vold.fstab dành riêng cho thiết bị xác định ánh xạ từ thiết bị sysfs đến các điểm gắn kết 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 tập đĩa.
  • mount_point : Đường dẫn hệ thống tập tin nơi ổ đĩa sẽ được gắn vào.
  • 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 tới các thiết bị có thể cung cấp điểm gắn kết này. Được phân tách bằng dấu cách và mỗi dấu cách phải bắt đầu bằng / .
  • flags : Danh sách các cờ được phân tách bằng dấu phẩy tùy chọn, không được chứa / . Các giá trị có thể bao gồm 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 được init, vold và recovery sử dụng đã được hợp nhất trong tệp /fstab.<device> . Đối với các ổ lưu trữ ngoài được quản lý bởi vold , các mục nhập phải có định dạng sau:

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
  • src : Đường dẫn trong sysfs (thường được gắn tại /sys) tới thiết bị có thể cung cấp điểm gắn kết. Đường dẫn phải bắt đầu bằng / .
  • mount_point : Đường dẫn hệ thống tập tin nơi ổ đĩa sẽ được gắn vào.
  • type : Loại hệ thống tập tin trên ổ đĩa. Đối với thẻ bên ngoài, đây thường là vfat .
  • mnt_flags : Vold bỏ qua trường này và nó sẽ được đặt thành defaults
  • fs_mgr_flags : Vold bỏ qua bất kỳ dòng nào trong fstab hợp nhất không bao gồm cờ voldmanaged= trong trường này. Cờ này phải được theo sau bởi nhãn mô tả thẻ và số phân vùng hoặc từ auto . Đây là một ví dụ: voldmanaged=sdcard:auto . Các cờ khác có thể là nonremovable , encryptable=sdcard , noemulatedsdencryptable=userdata .

Chi tiết cấu hình

Các tương tác lưu trữ bên ngoài ở mức khung trở lên được xử lý thông qua StorageManagerService . Do những thay đổi về cấu hình trong Android 6.0 (như loại bỏ lớp phủ tài nguyên storage_list.xml), chi tiết cấu hình được chia thành hai loại.

Android 5.x trở về trước

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à 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> , chính xác một trong số đó phải đượ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 tin của mount này.
  • storageDescription : tài nguyên chuỗi mô tả mount này.
  • primary : đúng nếu mount này là bộ nhớ ngoài chính.
  • removable : đúng nếu giá đỡ này có phương tiện di động, chẳng hạn như thẻ SD vật lý.
  • emulated : đúng nếu giá trị gắn kết này được mô phỏng và được hỗ trợ bởi bộ nhớ trong, có thể sử dụng daemon FUSE.
  • mtp-reserve : số MB dung lượng lưu trữ mà MTP nên dành để lưu trữ miễn phí. Chỉ được sử dụng khi gắn kết được đánh dấu là mô phỏng.
  • allowMassStorage : đúng nếu giá treo này có thể được chia sẻ qua bộ lưu trữ dung lượng lớn USB.
  • maxFileSize : kích thước file 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 hệ thống tệp không phân biệt chữ hoa chữ thường, không cần cấp phép được hỗ trợ bởi bộ nhớ trong. Một triển khai khả thi được cung cấp bởi trình nền FUSE trong system/core/sdcard , có thể đượ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 dự phòng và dest_path là điểm gắn kết đích.

Khi định cấu hình tập lệnh init.rc dành riêng cho thiết bị, biến môi trường EXTERNAL_STORAGE phải được xác định 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 liên kết tượng trưng. Nếu một thiết bị điều chỉnh vị trí bộ nhớ ngoài giữa các bản cập nhật nền tảng, thì các liên kết tượng trưng sẽ được tạo để 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 lưu trữ 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 lịch sử đã bị xóa để hỗ trợ hành vi động hơn:

  • Lớp phủ tài nguyên storage_list.xml đã bị xóa và không còn được khung sử dụng nữa. Các thiết bị lưu trữ hiện được cấu hình động khi được phát hiện bởi vold .
  • Các biến môi trường EMULATED_STORAGE_SOURCE/TARGET đã bị xóa và không còn được Zygote sử dụng để định cấu hình các điểm gắn kết dành riêng cho người dùng. 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ớ chia sẻ chính được gắn vào vị trí bằng vold khi chạy.
    • Nhà phát triển có thể tiếp tục xây dựng đường dẫn động hoặc tĩnh tùy thuộc vào trường hợp sử dụng của họ. Việc đưa UUID vào đường dẫn sẽ xác định từng thẻ để giúp nhà phát triển xác định vị trí rõ ràng hơ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 mã hóa cứng đã bị xóa khỏi các tệp init.rc dành riêng cho thiết bị và thay vào đó đượ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 bao gồm khái niệm về bộ nhớ có thể chấp nhận được. Đối với các thiết bị Android 6.0, mọi phương tiện vật lý không được chấp nhận đều được xem là phương tiện di động.

Bộ nhớ có thể chấp nhận

Để chỉ ra thiết bị lưu trữ có thể sử dụng trong fstab , hãy sử dụng thuộc tính encryptable=userdata trong trường fs_mgr_flags . Đây là một định nghĩa điển hình:

/devices/platform/mtk-msdc.1/mmc_host*           auto      auto     defaults
voldmanaged=sdcard1:auto,encryptable=userdata

Khi sử dụng thiết bị lưu trữ, nền tảng sẽ xóa 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 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ã hóa bằng dm-crypt và được định dạng bằng ext4 hoặc f2fs tùy thuộc vào khả năng của kernel. Loại phân vùng GUID là 193D1EA4-B3CA-11E4-B075-10604B889DCF.

Bộ lưu trữ di động

Trong fstab , các thiết bị lưu trữ có thuộc tính voldmanaged theo mặc định được coi là có thể di động trừ khi một thuộc tính khác như encryptable=userdata được xác định. Ví dụ: đây là định nghĩa điển hình cho thiết bị USBOTG:

/devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
                                                    voldmanaged=usb:auto

Nền tảng sử dụng blkid để phát hiện các loại hệ thống tệp trước khi cài đặt 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ợ.