
Android đã phát triển theo thời gian để hỗ trợ nhiều loại và tính năng của thiết bị lưu trữ. Tất cả các phiên bản Android đều hỗ trợ thiết bị có bộ nhớ truyền thống , bao gồm bộ nhớ di động và bộ nhớ mô phỏng. Bộ nhớ di động có thể được cung cấp bởi phương tiện vật lý, chẳng hạn như thẻ SD hoặc USB, dùng để truyền dữ liệu/lưu trữ tệp tạm thời. Phương tiện vật lý có thể vẫn còn với thiết bị trong một khoảng thời gian dài, nhưng không được gắn với thiết bị và có thể bị xóa. Thẻ SD đã có sẵn dưới dạng bộ nhớ di động kể từ Android 1.0; Android 6.0 đã thêm hỗ trợ USB. Bộ nhớ mô phỏng được cung cấp bằng cách hiển thị một phần bộ nhớ trong thông qua một lớp mô phỏng và đã có sẵn kể từ Android 3.0.
Bắt đầu từ Android 6.0, Android hỗ trợ bộ nhớ có thể chấp nhận , được cung cấp bởi phương tiện vật lý, chẳng hạn như thẻ SD hoặc USB, được mã hóa và định dạng để hoạt động giống như bộ nhớ trong. Bộ lưu trữ có thể áp dụng có thể lưu trữ tất cả các loại dữ liệu ứng dụng.
Quyền
Quyền truy cập vào bộ nhớ ngoài được bảo vệ bởi các quyền khác nhau của Android. Bắt đầu từ Android 1.0, quyền ghi được bảo vệ bằng quyền WRITE_EXTERNAL_STORAGE
. Bắt đầu từ Android 4.1, quyền đọc được bảo vệ bằng quyền READ_EXTERNAL_STORAGE
.
Bắt đầu từ Android 4.4, chủ sở hữu, nhóm và chế độ tệp trên thiết bị lưu trữ bên ngoài hiện được tổng hợp dựa trên cấu trúc thư mục. Điều này cho phép các ứng dụng quản lý các thư mục dành riêng cho gói của chúng trên bộ nhớ ngoài mà không yêu cầu chúng phải có quyền WRITE_EXTERNAL_STORAGE
rộng rãi. Ví dụ: ứng dụng có tên gói com.example.foo
hiện có thể tự do truy cập Android/data/com.example.foo/
trên các thiết bị lưu trữ bên ngoài mà không cần có quyền. Các quyền tổng hợp này được thực hiện bằng cách bọc các thiết bị lưu trữ thô trong một daemon FUSE.
Bắt đầu từ Android 10, các ứng dụng nhắm mục tiêu Android 9 trở xuống mặc định thấp hơn thành bộ nhớ cũ và có thể chọn sử dụng bộ nhớ riêng biệt. Các ứng dụng nhắm mục tiêu Android 10 và mặc định là bộ nhớ riêng biệt có thể tạm thời chọn không tham gia. Sử dụng thuộc tính tệp kê khai requestLegacyExternalStorage
, thuộc tính kiểm soát mô hình lưu trữ, để thay đổi trạng thái mặc định.
Vì cả hai quyền READ_EXTERNAL_STORAGE
và WRITE_EXTERNAL_STORAGE
đều bị hạn chế mềm, nên nếu trình cài đặt không đưa ứng dụng vào danh sách cho phép, thì quyền đó chỉ kiểm soát quyền truy cập vào bộ sưu tập âm thanh và hình ảnh, không có quyền truy cập vào thẻ SD. Điều này áp dụng ngay cả khi ứng dụng yêu cầu bộ nhớ cũ. Để biết thêm thông tin về cả hạn chế cứng và hạn chế mềm, hãy xem Hạn chế cứng và mềm trong Android 10 .
Nếu trình cài đặt đưa quyền vào danh sách cho phép, ứng dụng chạy ở chế độ cũ sẽ có hành vi cấp phép không bị cô lập. Quyền kiểm soát quyền truy cập thẻ SD cũng như các bộ sưu tập âm thanh và hình ảnh. Điều này xảy ra khi ứng dụng nhắm mục tiêu Android 9 trở xuống và không chọn tham gia bộ nhớ riêng biệt hoặc ứng dụng nhắm mục tiêu Android 10 và chọn không tham gia.
Trạng thái danh sách trắng chỉ có thể được chỉ định khi cài đặt và không thể thay đổi cho đến khi ứng dụng được cài đặt.
Để biết thêm thông tin về cách đặt quyền READ_EXTERNAL_STORAGE
, hãy xem setWhitelistedRestrictedPermissions()
trong lớp PackageInstaller.SessionParams .
Android 13 giới thiệu các quyền phương tiện chi tiết để hỗ trợ các ứng dụng truy cập các tệp phương tiện do các ứng dụng khác tạo. Ứng dụng phải yêu cầu một hoặc nhiều quyền phương tiện chi tiết được liệt kê trong Quyền phương tiện chi tiết thay vì quyền READ_EXTERNAL_STORAGE
.
quyền thời gian chạy
Android 6.0 giới thiệu mô hình quyền thời gian chạy mới trong đó các ứng dụng yêu cầu khả năng khi cần trong thời gian chạy. Vì mô hình mới bao gồm các quyền READ/WRITE_EXTERNAL_STORAGE
nên nền tảng cần cấp quyền truy cập bộ nhớ một cách linh hoạt mà không tắt hoặc khởi động lại các ứng dụng đang chạy. Nó thực hiện điều này bằng cách duy trì ba chế độ xem riêng biệt của tất cả các thiết bị lưu trữ được gắn:
-
/mnt/runtime/default
được hiển thị cho các ứng dụng không có quyền lưu trữ đặc biệt và không gian tên gốc nơiadbd
và các thành phần hệ thống khác hoạt động. -
/mnt/runtime/read
được hiển thị cho các ứng dụng cóREAD_EXTERNAL_STORAGE
(ĐặtLEGACY_STORAGE
cho Android 10) -
/mnt/runtime/write
được hiển thị cho các ứng dụng cóWRITE_EXTERNAL_STORAGE
Tại thời điểm phân nhánh Zygote, chúng tôi tạo một không gian tên gắn kết cho từng ứng dụng đang chạy và liên kết gắn chế độ xem ban đầu thích hợp vào vị trí. Sau đó, khi quyền thời gian chạy được cấp, vold
sẽ nhảy vào không gian tên gắn kết của các ứng dụng đã chạy và liên kết gắn kết chế độ xem đã nâng cấp vào vị trí. Lưu ý rằng việc hạ cấp quyền luôn dẫn đến việc ứng dụng bị tắt.
Chức năng setns()
được sử dụng để triển khai tính năng này yêu cầu ít nhất là Linux 3.8, nhưng các bản vá đã được nhập thành công vào Linux 3.4. Kiểm tra PermissionsHostTest
CTS có thể được sử dụng để xác minh hành vi chính xác của kernel.