
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ợ các 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, để 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 thời gian dài, nhưng không bị ràng buộc với thiết bị và có thể bị gỡ bỏ. Thẻ SD đã có sẵn dưới dạng bộ nhớ di động kể từ Android 1.0; Hỗ trợ USB 6.0 được bổ sung Android. Bộ nhớ giả lập được cung cấp bằng cách để lộ một phần bộ nhớ trong 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ớ riêng biệt. 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_STORAGE
và WRITE_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, thì quyền đó sẽ chỉ kiểm soát quyền truy cập vào các 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 đơn nguyên. 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 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 tảng cần tự động cấp 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 khác 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à 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 ngã ba 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
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 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ị 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á đã đượ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.