Bộ nhớ có giới hạn

Bộ nhớ có phạm vi giới hạn quyền truy cập của ứng dụng vào bộ nhớ ngoài. Trong Android 11 trở lên, các ứng dụng nhắm mục tiêu API 30 trở lên phải sử dụng bộ nhớ có giới hạn. Trước đây trong Android 10, các ứng dụng có thể chọn không sử dụng bộ nhớ có giới hạn.

Hạn chế truy cập ứng dụng

Mục tiêu của bộ nhớ có giới hạn là bảo vệ quyền riêng tư của ứng dụng và dữ liệu người dùng. Điều này bao gồm bảo vệ thông tin người dùng (chẳng hạn như siêu dữ liệu ảnh), ngăn ứng dụng sửa đổi hoặc xóa tệp người dùng mà không có sự cho phép rõ ràng và bảo vệ các tài liệu nhạy cảm của người dùng được tải xuống Tải xuống hoặc các thư mục khác.

Các ứng dụng sử dụng bộ nhớ có giới hạn có thể có các cấp truy cập sau (quyền truy cập thực tế tùy theo cách triển khai cụ thể).

  • Quyền truy cập đọcghi vào các tệp của riêng họ mà không có quyền
  • Đọc quyền truy cập vào các tệp phương tiện của ứng dụng khác với quyền READ_EXTERNAL_STORAGE
  • Quyền ghi vào các tệp phương tiện của ứng dụng khác chỉ được phép khi có sự đồng ý trực tiếp của người dùng (ngoại lệ được cấp cho Thư viện hệ thống và các ứng dụng đủ điều kiện truy cập vào Tất cả các tệp)
  • Không có quyền truy cập đọc hoặc ghi vào thư mục dữ liệu ứng dụng bên ngoài của ứng dụng khác

Sử dụng bộ nhớ có phạm vi với FUSE

Android 11 trở lên hỗ trợ Hệ thống tệp trong không gian người dùng (FUSE), cho phép mô-đun MediaProvider kiểm tra hoạt động của tệp trong không gian người dùng và kiểm soát quyền truy cập vào tệp dựa trên chính sách cho phép , từ chối hoặc hạn chế quyền truy cập. Các ứng dụng trong bộ nhớ có giới hạn sử dụng FUSE sẽ có các tính năng bảo mật của bộ nhớ có giới hạn và khả năng truy cập các tệp bằng đường dẫn tệp trực tiếp (giữ cho API tệp hoạt động trong ứng dụng).

Android 10 đã thực thi các quy tắc lưu trữ có phạm vi đối với quyền truy cập tệp của MediaProvider, nhưng không áp dụng cho quyền truy cập đường dẫn tệp trực tiếp (ví dụ: sử dụng API tệp và API NDK) do nỗ lực cần thiết trong việc chặn lệnh gọi hạt nhân. Do đó, các ứng dụng trong bộ nhớ có giới hạn không thể truy cập vào tệp bằng đường dẫn tệp trực tiếp. Hạn chế này đã ảnh hưởng đến khả năng thích ứng của nhà phát triển ứng dụng vì nó yêu cầu những thay đổi đáng kể về mã để viết lại quyền truy cập API tệp vào API MediaProvider.

CẦU CHÌ và SDCardFS

Việc hỗ trợ Android 11 cho FUSE không liên quan đến việc ngừng sử dụng SDCardFS nhưng cung cấp giải pháp thay thế cho Media Store cho các thiết bị trước đây đã sử dụng SDCardFS. Thiết bị:

  • Khởi chạy với Android 11 trở lên sử dụng kernel 5.4 trở lên không thể sử dụng SDCardFS.
  • Nâng cấp lên Android 11 trở lên có thể lưu trữ FUSE trên SDCardFS để chặn các hoạt động của tệp và đáp ứng các mục tiêu về quyền riêng tư.

Điều chỉnh hiệu suất FUSE

Android trước đây đã hỗ trợ FUSE trong Android 7 trở xuống, trong đó bộ nhớ ngoài được gắn dưới dạng FUSE. Do các vấn đề về hiệu suất và sự bế tắc khi triển khai FUSE đó, Android 8 đã giới thiệu SDCardFS. Android 11 giới thiệu lại tính năng hỗ trợ cho FUSE bằng cách triển khai libfuse được cải tiến, được thử nghiệm tốt hơn, có thể điều chỉnh để giải quyết các vấn đề về hiệu suất trong Android 7 trở xuống.

Điều chỉnh FUSE bao gồm các điều chỉnh sau:

  • Bỏ qua FUSE cho các thư mục Android/dataAndroid/obb để cải thiện hiệu suất cho các ứng dụng trò chơi dựa trên các thư mục này.
  • Tối ưu hóa (chẳng hạn như điều chỉnh tỷ lệ đọc trước và tỷ lệ bẩn của hệ thống tệp FUSE) để duy trì hiệu suất đọc và phát lại phương tiện mượt mà.
  • Sử dụng bộ đệm ghi lại FUSE.
  • Quyền lưu vào bộ nhớ đệm để giảm IPC xuống máy chủ hệ thống.
  • Tối ưu hóa cho các ứng dụng có quyền truy cập Tất cả tệp để thực hiện các thao tác hàng loạt nhanh hơn.

Các điều chỉnh điều chỉnh ở trên có thể tạo ra hiệu suất tương đương giữa các thiết bị FUSE và không phải FUSE. Ví dụ: kiểm tra Pixel 2 đã điều chỉnh bằng FUSE và Pixel 2 bằng Media Store cho thấy hiệu suất đọc tuần tự tương đương (ví dụ: phát lại video) giữa truy cập đường dẫn tệp và Media Store. Tuy nhiên, khả năng ghi tuần tự kém hơn một chút với FUSE và việc đọc và ghi ngẫu nhiên có thể chậm hơn tới gấp đôi.

Các phép đo hiệu suất có thể thay đổi tùy theo thiết bị và giữa các trường hợp sử dụng cụ thể. Vì API MediaProvider mang lại hiệu suất ổn định nhất nên các nhà phát triển ứng dụng quan tâm đến hiệu suất nên sử dụng API MediaProvider cho ứng dụng của họ.

Giảm thiểu tác động đến hiệu suất của FUSE

Tác động đến hiệu suất của FUSE chỉ được giới hạn ở những người dùng nhiều tệp được lưu trữ trên bộ nhớ chia sẻ bên ngoài. Bộ nhớ riêng bên ngoài (bao gồm các thư mục android/dataandroid/obb ) bị FUSE bỏ qua, trong khi bộ nhớ trong (chẳng hạn như /data/data , nơi nhiều ứng dụng lưu trữ dữ liệu để mã hóa và bảo mật) không được FUSE gắn vào.

  • Các ứng dụng ít sử dụng bộ nhớ ngoài dùng chung thường tương tác với một nhóm tệp giới hạn (thường ít hơn 100 tệp). Các ứng dụng này được hưởng lợi từ các tính năng tối ưu hóa hiện có của các hoạt động đọc và ghi thông thường và sẽ không thấy bất kỳ tác động nào đến hiệu suất liên quan đến FUSE trong Android 11.

  • Các ứng dụng sử dụng nhiều bộ nhớ ngoài dùng chung thường thực hiện các thao tác với tệp hàng loạt, chẳng hạn như liệt kê hoặc xóa thư mục có 1000 tệp hoặc tạo hoặc xóa thư mục có một triệu tệp trên hệ thống tệp. Các hoạt động xử lý tệp hàng loạt có thể bị ảnh hưởng bởi FUSE trên Android 11, nhưng nếu những ứng dụng đó đủ điều kiện nhận được quyền MANAGE_EXTERNAL_STORAGE thì chúng sẽ được hưởng lợi từ tính năng tối ưu hóa hiệu suất có trong bản cập nhật tháng 10 năm 2020.

Để tránh tiêu tốn hiệu suất của FUSE, các ứng dụng có thể lưu trữ dữ liệu trong bộ nhớ riêng bên ngoài hoặc sử dụng các API hàng loạt trong lớp ContentProvider để bỏ qua FUSE và nhận đường dẫn được tối ưu hóa hiệu suất. Ngoài ra, bản cập nhật tháng 10 năm 2020 cho thành phần hệ thống MediaProvider bao gồm các tính năng tối ưu hóa hiệu suất cho trình quản lý tệp và các ứng dụng tương tự (như sao lưu/khôi phục, chống vi-rút) có quyền MANAGE_EXTERNAL_STORAGE .

Quyền riêng tư hơn hiệu suất

Trên các thiết bị đã được điều chỉnh cho FUSE, hầu hết các hành trình quan trọng của người dùng đều có hiệu suất như nhau giữa Android 10 và Android 11. Tuy nhiên, khi kiểm tra điểm chuẩn trên một tập hợp các thao tác tệp, Android 11 có thể hoạt động kém hơn Android 10. Đối với các kiểu truy cập tệp hoạt động hiệu quả tệ hơn trong Android 11 (ví dụ: đọc hoặc ghi ngẫu nhiên), chúng tôi khuyên bạn nên sử dụng API MediaProvider để cung cấp cho ứng dụng chế độ truy cập không phải FUSE, đây là tùy chọn tốt nhất và hoạt động nhất quán.

Cập nhật MediaProvider và FUSE

Hoạt động của thành phần hệ thống MediaProvider khác nhau giữa các bản phát hành Android.

  • Trong Android 10 trở xuống, SDCardFS là hệ thống tệp và MediaProvider cung cấp giao diện cho các bộ sưu tập tệp (ví dụ: hình ảnh, video, tệp nhạc, v.v.). Khi một ứng dụng tạo tệp bằng API tệp, ứng dụng đó có thể yêu cầu MediaProvider quét tệp và ghi vào cơ sở dữ liệu.

  • Trong Android 11 trở lên, SDCardFS không được dùng nữa và MediaProvider trở thành trình xử lý hệ thống tệp (cho FUSE) cho bộ nhớ ngoài, giúp hệ thống tệp trên bộ nhớ ngoài và cơ sở dữ liệu MediaProvider nhất quán. Với tư cách là trình xử lý không gian người dùng cho hệ thống tệp FUSE, MediaProvider có thể chặn các lệnh gọi hạt nhân và đảm bảo các hoạt động của tệp được an toàn về quyền riêng tư.

Trong Android 11 trở lên, MediaProvider cũng là một thành phần hệ thống mô-đun (mô-đun Mainline) có thể được cập nhật bên ngoài các bản phát hành Android. Điều này có nghĩa là các vấn đề về hiệu suất, quyền riêng tư hoặc bảo mật tìm thấy trong MediaProvider có thể được khắc phục và phân phối qua mạng từ Cửa hàng Google Play hoặc các cơ chế khác do đối tác cung cấp. Bất cứ điều gì trong phạm vi những gì được mong đợi từ trình xử lý FUSE cũng có thể cập nhật được, cho phép cập nhật để khắc phục các lỗi và hồi quy hiệu suất FUSE.