Google is committed to advancing racial equity for Black communities. See how.
This page was translated by the Cloud Translation API.
Switch to English

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 thiết bị lưu trữ và tính năng. Tất cả các phiên bản của Android đều hỗ trợ thiết bị có bộ nhớ truyền thống , bao gồm bộ nhớ di động và bộ nhớ giả lập. Bộ nhớ di động có thể được cung cấp bởi phương tiện vật lý, như thẻ SD hoặc USB, để chuyể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 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; Hỗ trợ USB 6.0 Android 6.0. Bộ nhớ giả lập được cung cấp bằng cách để lộ một phần bộ nhớ trong thông qua một lớp giả lập và đã có từ Android 3.0.

Bắt đầu từ Android 6.0, Android hỗ trợ bộ nhớ có thể chấp nhận được , đượ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ộ nhớ được chấp nhận 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ệ với quyền WRITE_EXTERNAL_STORAGE . Bắt đầu từ Android 4.1, quyền truy cập đọc được bảo vệ với 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ữ 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 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 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 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 cho bộ nhớ cũ và có thể chọn tham gia bộ nhớ biệt lập. Các ứng dụng nhắm mục tiêu đến Android 10 và mặc định là bộ nhớ riêng có thể tạm thời chọn không tham gia . Sử dụng thuộc tính tệp kê khai requestLegacyExternalStorage , điều khiển mô hình lưu trữ, để thay đổi trạng thái mặc định.

Vì cả READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE đều bị giới hạn mềm, nên nếu trình cài đặt không đưa ứng dụng vào danh sách trắng, quyền sẽ 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 đang chạy ở chế độ kế thừa sẽ có hành vi cấp quyền riêng. Quyền kiểm soát quyền truy cập thẻ SD và 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 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 .

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 các khả năng khi cần thiết 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 động quyền truy cập bộ nhớ mà không giết hoặc khởi động lại các ứng dụng đã 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 kết:

  • /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à cho không gian tên gốc nơi adbd 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 (Đặ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 fork Zygote, chúng tôi tạo 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 kết 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 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 chế độ xem được 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ị giết.

Hàm 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á lỗi đã được backport 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 chính xác của hạt nhân.