Dung lượng lưu trữ

Biểu tượng HAL bộ nhớ ngoài của Android

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 thiết bị Android đều hỗ trợ 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ằng phương tiện vật lý, 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ể tồn tại với thiết bị trong một thời gian dài nhưng không bị ràng buộc 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 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ể sử dụng được cung cấp bởi phương tiện vật lý, 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ữ thích hợp 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 nhiều quyền khác nhau của Android. Bắt đầu từ Android 1.0, quyền truy cập ghi được bảo vệ bằng quyền WRITE_EXTERNAL_STORAGE . Bắt đầu từ Android 4.1, quyền truy cập đọ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ế độ của tệp trên thiết bị lưu trữ 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 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 gói các thiết bị lưu trữ thô vào 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 sẽ được mặc định sử dụng 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 sử dụng bộ nhớ biệt lập có thể tạm thời chọn không tham gia. Sử dụng thuộc tính tệp kê khai requestLegacyExternalStorage để 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_STORAGEWRITE_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 này chỉ kiểm soát quyền truy cập vào bộ sưu tập âm thanh và hình ảnh mà 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à hạn chế mềm trong Android 10 .

Nếu trình cài đặt đưa quyền vào danh sách cho phép thì ứ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 sử dụng bộ nhớ biệt lập hoặc 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 tại thời điểm 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 ứ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 .

Android 14 xây dựng dựa trên các quyền phương tiện chi tiết để cho phép người dùng cấp quyền truy cập một phần vào thư viện phương tiện trực quan của họ khi ứng dụng yêu cầu quyền phương tiện. Xem Cấp quyền truy cập một phần vào ảnh và video để biết thêm thông tin.

Quyền thời gian chạy

Android 6.0 giới thiệu mô hình quyền khi 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 cần 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à tới không gian tên gốc nơi adbd và các thành phần hệ thống khác tồn tại.
  • /mnt/runtime/read được hiển thị cho các ứng dụng có READ_EXTERNAL_STORAGE (Đặt LEGACY_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 rẽ nhánh Zygote, chúng tôi tạo một không gian tên gắn kết cho mỗi ứng dụng đang chạy và liên kết gắn chế độ xem ban đầu thích hợp vào đúng 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 mount của các ứng dụng đang chạy và liên kết gắn chế độ xem đã nâng cấp vào đúng 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 chuyển thành công sang Linux 3.4. Kiểm tra PermissionsHostTest CTS có thể được sử dụng để xác minh hành vi kernel chính xác.