Storage

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

Android đã phát triển theo thời gian để hỗ trợ nhiều loại thiết bị lưu trữ và tính năng. Tất cả phiên bản Android đều hỗ trợ các thiết bị có bộ nhớ truyền thống, bao gồm cả bộ nhớ di động và bộ nhớ được mô phỏng. Bộ nhớ di động có thể được cung cấp qua phương tiện thực, chẳng hạn như thẻ SD hoặc USB, dùng để lưu trữ tệp/chuyển dữ liệu tạm thời. Nội dung nghe nhìn thực có thể vẫn còn trên 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ị tháo ra. Thẻ SD đã được cung cấp làm bộ nhớ di động kể từ Android 1.0; Android 6.0 đã thêm tính năng 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.

Kể từ Android 6.0, Android hỗ trợ bộ nhớ có thể sử dụng. Bộ nhớ này đượ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ã hoá và định dạng để hoạt động như bộ nhớ trong. Bộ nhớ sử 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ằng nhiều quyền của Android. Kể từ Android 1.0, quyền ghi được bảo vệ bằng quyền WRITE_EXTERNAL_STORAGE. Kể từ Android 4.1, quyền truy cập để đọc được bảo vệ bằng quyền READ_EXTERNAL_STORAGE.

Kể từ Android 4.4, chủ sở hữu, nhóm và chế độ của tệp trên thiết bị bộ nhớ 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 trên bộ nhớ ngoài mà không yêu cầu các ứng dụng đó phải có quyền WRITE_EXTERNAL_STORAGE rộng. Ví dụ: ứng dụng có tên gói com.example.foo hiện có thể tự do truy cập vào Android/data/com.example.foo/ trên các thiết bị bộ nhớ ngoài mà không cần 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ô trong trình nền FUSE.

Kể từ Android 10, các ứng dụng nhắm đến Android 9 trở xuống sử dụng bộ nhớ cũ theo mặc định và có thể chọn sử dụng bộ nhớ riêng biệt. Các ứng dụng nhắm đến Android 10 và mặc định là bộ nhớ được tách biệt có thể tạm thời chọn không sử dụng bộ nhớ này. Sử dụng thuộc tính tệp kê khai requestLegacyExternalStorage để kiểm soát mô hình bộ nhớ, nhằm thay đổi trạng thái mặc định.

Vì cả 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 trắng, thì quyền này chỉ kiểm soát quyền truy cập vào các bộ sưu tập hình ảnh và âm thanh 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 phần 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 trắng, thì ứng dụng chạy ở chế độ cũ sẽ có hành vi không tách biệt quyền. Quyền này kiểm soát quyền truy cập vào thẻ SD cũng như các bộ sưu tập hình ảnh và âm thanh. Điều này xảy ra khi ứng dụng nhắm đến Android 9 trở xuống và không chọn sử dụng bộ nhớ được tách biệt, hoặc ứng dụng nhắm đến Android 10 và chọn không sử dụng.

Bạn chỉ có thể chỉ định trạng thái danh sách trắng tại thời điểm cài đặt và không thể thay đổi trạng thái này cho đến khi cài đặt ứng dụng.

Để 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 ra mắt các quyền truy cập vào nội dung nghe nhìn chi tiết để hỗ trợ các ứng dụng truy cập vào tệp nội dung nghe nhìn do các ứng dụng khác tạo ra. Ứng dụng phải yêu cầu một hoặc nhiều quyền truy cập nội dung nghe nhìn ở cấp độ chi tiết được liệt kê trong phần Quyền truy cập nội dung nghe nhìn ở cấp độ chi tiết thay vì quyền READ_EXTERNAL_STORAGE.

Android 14 xây dựng dựa trên quyền truy cập nội dung nghe nhìn ở cấp độ 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 nội dung nghe nhìn trực quan khi ứng dụng yêu cầu quyền truy cập nội dung nghe nhìn. Hãy xem bài viết 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 khi bắt đầu chạy

Android 6.0 giới thiệu một mô hình quyền khi bắt đầu chạy mới, trong đó ứng dụng yêu cầu các chức 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 linh động cấp quyền truy cập vào bộ nhớ mà không cần tắt hoặc khởi động lại các ứng dụng đang chạy. Thư viện này thực hiện việc này bằng cách duy trì 3 khung hiển thị riêng biệt của tất cả các thiết bị lưu trữ đã gắn:

  • /mnt/runtime/default hiển thị cho các ứng dụng không có quyền truy cập đặc biệt vào bộ nhớ và cho 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 hiển thị cho các ứng dụng có READ_EXTERNAL_STORAGE (Đặt LEGACY_STORAGE cho Android 10)
  • /mnt/runtime/write hiển thị cho các ứng dụng có WRITE_EXTERNAL_STORAGE

Tại thời điểm phát triển nhánh Zygote, chúng ta 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 khung hiển thị ban đầu thích hợp vào đúng vị trí. Sau đó, khi các quyền thời gian chạy được cấp, vold sẽ chuyển sang không gian tên của các ứng dụng đang chạy và liên kết các chế độ xem đã nâng cấp vào vị trí. Xin lưu ý rằng việc hạ cấp quyền luôn dẫn đến việc ứng dụng bị buộc thoát.

Chức năng setns() 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 điều chỉnh cho phiên bản cũ thành công lên Linux 3.4. Bạn có thể sử dụng kiểm thử CTS PermissionsHostTest để xác minh hành vi chính xác của nhân.