Android hỗ trợ các thiết bị có bộ lưu trữ truyền thống, được xác định là hệ thống tệp không phân biệt chữ hoa chữ thường với các lớp và chế độ cấp phép POSIX không thể thay đổi. Khái niệm lưu trữ truyền thống bao gồm lưu trữ mô phỏng và lưu trữ di động. Bộ nhớ di động được định nghĩa là bất kỳ bộ nhớ ngoài nào không được hệ thống chấp nhận và do đó không được định dạng và mã hóa hoặc gắn với một thiết bị cụ thể. Vì bộ nhớ ngoài truyền thống cung cấp mức bảo vệ tối thiểu cho dữ liệu được lưu trữ nên mã hệ thống không được lưu trữ dữ liệu nhạy cảm trên bộ nhớ ngoài. Cụ thể, các tệp nhật ký và cấu hình chỉ nên được lưu trữ trên bộ nhớ trong nơi chúng có thể được bảo vệ một cách hiệu quả.
Bộ nhớ ngoài nhiều người dùng
Bắt đầu từ Android 4.2, các thiết bị có thể hỗ trợ nhiều người dùng và bộ nhớ ngoài phải đáp ứng các ràng buộc sau:
- Mỗi người dùng phải có bộ nhớ ngoài chính riêng biệt và không được có quyền truy cập vào bộ nhớ ngoài chính của người dùng khác.
- Đường dẫn
/sdcard
phải phân giải tới đúng bộ nhớ ngoài chính dành riêng cho người dùng dựa trên người dùng mà quy trình đang chạy. - Việc lưu trữ các tệp OBB lớn trong thư mục
Android/obb
có thể được chia sẻ giữa nhiều người dùng dưới dạng tối ưu hóa. - Các ứng dụng không được phép ghi bộ nhớ ngoài thứ cấp, ngoại trừ trong các thư mục dành riêng cho gói được cho phép bởi các quyền tổng hợp.
Việc triển khai nền tảng mặc định của tính năng này tận dụng các không gian tên nhân Linux để tạo các bảng gắn kết riêng biệt cho mỗi quy trình phân nhánh Zygote, sau đó sử dụng các gắn kết liên kết để cung cấp đúng bộ nhớ ngoài chính dành riêng cho người dùng vào không gian tên riêng tư đó.
Khi khởi động, hệ thống sẽ gắn một daemon FUSE lưu trữ bên ngoài được mô phỏng duy nhất tại EMULATED_STORAGE_SOURCE
, daemon này bị ẩn khỏi các ứng dụng. Sau khi phân nhánh Zygote, nó liên kết gắn kết thư mục con dành riêng cho người dùng thích hợp từ bên dưới trình nền FUSE tới EMULATED_STORAGE_TARGET
để các đường dẫn lưu trữ bên ngoài giải quyết chính xác cho ứng dụng. Vì ứng dụng thiếu các điểm gắn kết có thể truy cập được cho bộ nhớ của người dùng khác nên họ chỉ có thể truy cập vào bộ nhớ của người dùng đã bắt đầu ứng dụng đó.
Việc triển khai này cũng sử dụng tính năng hạt nhân cây con dùng chung để truyền các sự kiện gắn kết từ không gian tên gốc mặc định vào các không gian tên ứng dụng, đảm bảo rằng các tính năng như bộ chứa ASEC và gắn kết OBB tiếp tục hoạt động chính xác. Nó thực hiện điều này bằng cách gắn các rootf dưới dạng được chia sẻ và sau đó gắn lại nó dưới dạng nô lệ sau khi mỗi không gian tên Zygote được tạo.
Nhiều thiết bị lưu trữ bên ngoài
Bắt đầu từ Android 4.4, nhiều thiết bị lưu trữ bên ngoài sẽ được cung cấp cho nhà phát triển thông qua Context.getExternalFilesDirs()
, Context.getExternalCacheDirs()
và Context.getObbDirs()
.
Quyền WRITE_EXTERNAL_STORAGE
chỉ được cấp quyền truy cập ghi vào bộ nhớ ngoài chính trên thiết bị. Không được phép ghi vào các thiết bị lưu trữ bên ngoài thứ cấp, ngoại trừ trong các thư mục dành riêng cho gói của chúng khi được các quyền tổng hợp cho phép. Việc hạn chế ghi theo cách này đảm bảo hệ thống có thể dọn sạch các tệp khi gỡ cài đặt ứng dụng.
Hỗ trợ phương tiện USB
Android 6.0 hỗ trợ các thiết bị lưu trữ di động chỉ được kết nối với thiết bị trong một khoảng thời gian ngắn, như ổ flash USB. Khi người dùng lắp một thiết bị di động mới, nền tảng sẽ hiển thị thông báo cho phép họ sao chép hoặc quản lý nội dung của thiết bị đó.
Trong Android 6.0, mọi thiết bị không được chấp nhận đều được coi là thiết bị di động. Vì bộ lưu trữ di động chỉ được kết nối trong thời gian ngắn nên nền tảng này tránh được các hoạt động nặng như quét phương tiện. Các ứng dụng của bên thứ ba phải thông qua Khung truy cập bộ nhớ để tương tác với các tệp trên bộ nhớ di động; truy cập trực tiếp bị chặn rõ ràng vì lý do riêng tư và bảo mật.