Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Cấu hình thiết bị

Bộ nhớ ngoài được quản lý bởi sự kết hợp của dịch vụ vold init và dịch vụ hệ thống StorageManagerService . Việc gắn các khối lượng bộ nhớ ngoài vật lý đượ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ó lên ứ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 đ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.
  • mount_point : Đường dẫn hệ thống tập tin 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 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 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 nonremovable và có thể encryptable .

Đối với các phiên bản Android 4.3 trở lên, các tệp fstab khác nhau được init, vold và recovery sử dụng đã được thống nhất trong tệp /fstab.<device> . Đối với khối lượng 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 dưới 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 kết.
  • type : Loại hệ thống tệp 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ó phải đượ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 một 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ờ có thể có khác là nonremovable , có thể encryptable=sdcard , noemulatedsdencryptable=userdata .

Chi tiết cấu hình

Các tương tác lưu trữ bên ngoài ở cấp độ khung và cao hơn được xử lý thông qua StorageManagerService . Do những thay đổi về cấu hình trong Android 6.0 (như xóa 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

storage_list.xml cấu hình storage_list.xml dành riêng cho thiết bị, thường được cung cấp thông qua frameworks/base 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 phần tử trong số đó sẽ được đánh dấu là chính. <storage> 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 : true nếu gắn kết này là bộ nhớ ngoài chính.
  • removable : true nếu ngàm này có phương tiện di động, chẳng hạn như thẻ SD vật lý.
  • emulated : true nếu mount 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ự trữ để lưu trữ miễn phí. Chỉ được sử dụng khi gắn kết được đánh dấu là giả lập.
  • allowMassStorage : true nếu giá đỡ này có thể được chia sẻ qua bộ nhớ chung 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 hệ thống tệp không phân biệt chữ hoa chữ thường, không được phép được hỗ trợ bởi bộ nhớ trong. Một triển khai khả thi được cung cấp bởi daemon FUSE trong system/core/sdcard , có thể được thêm vào 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

Nơi source_path là sự ủng hộ lưu trữ nội bộ và dest_path là mục tiêu điểm gắn kết.

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í của 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 được 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 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 sử dụng bởi khuôn khổ. 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ị 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 với 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.
    • Các nhà phát triển có thể tiếp tục tạo đường dẫn động hoặc tĩnh tùy thuộc vào trường hợp sử dụng của họ. Bao gồm UUID trong đường dẫn xác định từng thẻ để làm rõ hơn vị trí cho các 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 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 đó sẽ được tách độ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 về bộ nhớ có thể sử dụng. Đối với các thiết bị Android 6.0, bất kỳ phương tiện vật lý nào không được chấp nhận đều được coi là di động.

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

Để chỉ ra một 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 thiết bị lưu trữ được sử dụng, 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 để 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 cách sử dụng ext4 hoặc f2fs tùy 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.

Lưu trữ di động

Trong fstab , các thiết bị lưu trữ có thuộc tính voldmanaged được coi là di động theo mặc định 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ị 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ợ.