Tìm hiểu về bộ nhớ có phạm vi của Android: Điều gì đã thay đổi và tại sao nó lại quan trọng

A smartphone beside small storage drawers with one locked, illustrating Android scoped storage

Nếu bạn đã từng cố gắng quản lý tệp trên thiết bị Android, bạn có thể nhận thấy rằng mọi thứ hoạt động khác nhau tùy thuộc vào phiên bản Android bạn đang chạy. Bắt đầu với Android 10, Google đã giới thiệu một sự thay đổi cơ bản về cách ứng dụng tương tác với hệ thống tệp. Thay đổi này, được gọi là Bộ nhớ có phạm vi, đã xác định lại các quy tắc xung quanh việc đọc và ghi tệp trên bộ nhớ dùng chung. Đối với người dùng tải ứng dụng, quản lý tệp OBB hoặc làm việc với trình quản lý tệp, việc hiểu rõ phạm vi lưu trữ là điều cần thiết.

Trong bài viết này, chúng ta sẽ khám phá bộ nhớ có phạm vi là gì, tại sao Google triển khai nó, nó ảnh hưởng như thế nào đến người dùng và nhà phát triển hàng ngày cũng như ý nghĩa của nó đối với bất kỳ ai cài đặt tệp APK hoặc XAPK bên ngoài Cửa hàng Play.

Vấn đề với mô hình lưu trữ cũ

Trước Android 10, mọi ứng dụng yêu cầu quyền READ_EXTERNAL_STORAGE hoặc WRITE_EXTERNAL_STORAGE đều có thể truy cập hầu như mọi tệp trên bộ nhớ dùng chung của thiết bị. Điều này bao gồm ảnh, tài liệu, nội dung tải xuống và thậm chí cả các tệp được tạo bởi các ứng dụng khác. Mặc dù điều này giúp việc quản lý tệp trở nên thuận tiện nhưng nó gây ra những lo ngại nghiêm trọng về quyền riêng tư và bảo mật.

Hãy xem xét một ứng dụng đèn pin đơn giản. Theo mô hình cũ, nếu bạn cấp cho nó quyền lưu trữ, nó có thể âm thầm đọc ảnh của bạn, quét các tài liệu đã tải xuống hoặc thậm chí sửa đổi các tệp thuộc các ứng dụng khác. Không có sự kiểm soát chi tiết. Bạn đã cấp cho ứng dụng toàn quyền truy cập vào toàn bộ bộ nhớ của mình hoặc từ chối hoàn toàn.

Sự tiếp cận rộng rãi này đã dẫn đến các vấn đề trong thế giới thực. Một số ứng dụng thu thập dữ liệu người dùng bằng cách quét bộ nhớ để tìm các tệp nhạy cảm. Những người khác để lại các tập tin mồ côi làm lộn xộn thiết bị rất lâu sau khi ứng dụng được gỡ cài đặt. Google cần một giải pháp cân bằng giữa khả năng sử dụng với quyền riêng tư và bộ nhớ có giới hạn chính là câu trả lời của họ.

Scoped Storage thực sự làm được những gì

Bộ nhớ có phạm vi về cơ bản sẽ thay đổi mối quan hệ giữa ứng dụng và hệ thống tệp. Theo mô hình này, mỗi ứng dụng sẽ có hộp cát riêng trên bộ nhớ ngoài, thường nằm ở /Android/data/[package.name]/. Các ứng dụng có thể tự do đọc và ghi trong hộp cát của riêng chúng mà không cần bất kỳ quyền nào.

Tuy nhiên, việc truy cập các tệp bên ngoài hộp cát này yêu cầu phải thông qua các API được kiểm soát. Đây là cách mô hình mới hoạt động:

Bộ nhớ dành riêng cho ứng dụng

Mỗi ứng dụng đều có một thư mục chuyên dụng mà chỉ nó mới có thể truy cập. Khi ứng dụng được gỡ cài đặt, thư mục này sẽ tự động được dọn sạch. Không ứng dụng nào khác có thể đọc hoặc ghi vào vị trí này mà không có quyền truy cập root. Điều này giúp loại bỏ vấn đề về các tệp mồ côi và ngăn chặn việc thu thập dữ liệu giữa các ứng dụng.

Bộ sưu tập phương tiện

Đối với các tệp phương tiện dùng chung như ảnh, video và âm thanh, Android cung cấp MediaStore API. Các ứng dụng có thể đóng góp tệp phương tiện vào bộ sưu tập chung và đọc phương tiện do ứng dụng khác tạo ra, nhưng chỉ thông qua giao diện có cấu trúc này. Một ứng dụng có thể xem phương tiện của chính ứng dụng đó mà không cần bất kỳ quyền nào, nhưng việc truy cập vào phương tiện của ứng dụng khác yêu cầu các quyền READ_MEDIA_IMAGES, READ_MEDIA_VIDEO hoặc READ_MEDIA_AUDIO được giới thiệu trong Android 13.

Khung truy cập lưu trữ

Đối với tài liệu và các tệp không phải phương tiện khác, ứng dụng phải sử dụng Khung truy cập bộ nhớ (SAF). Điều này trình bày một bộ chọn tệp hệ thống cho người dùng, người dùng sẽ chọn rõ ràng những tệp hoặc thư mục nào mà ứng dụng có thể truy cập. Ứng dụng không bao giờ có quyền truy cập chung vào toàn bộ hệ thống tệp.

Quyền MANAGE_EXTERNAL_STORAGE

Đối với các ứng dụng thực sự cần quyền truy cập tệp rộng rãi, chẳng hạn như trình quản lý tệp, công cụ sao lưu và phần mềm chống vi-rút, Android sẽ cung cấp quyền MANAGE_EXTERNAL_STORAGE. Tuy nhiên, quyền này yêu cầu sự chấp thuận đặc biệt từ Google đối với các ứng dụng được phân phối qua Cửa hàng Play và người dùng phải cấp quyền theo cách thủ công thông qua cài đặt hệ thống thay vì một hộp thoại đơn giản.

Tiến trình triển khai

Google đã không thực thi phạm vi lưu trữ qua đêm. Quá trình chuyển đổi diễn ra dần dần:

  • Bộ nhớ có phạm vi Android 10 (API 29): đã được giới thiệu nhưng các ứng dụng có thể chọn không tham gia bằng cách sử dụng requestLegacyExternalStorage="true" trong bảng kê khai của chúng. Điều này đã cho các nhà phát triển thời gian để thích nghi.
  • Android 11 (API 30): Cờ cũ bị bỏ qua đối với các ứng dụng nhắm mục tiêu API 30 trở lên. Bộ nhớ có giới hạn trở thành bắt buộc đối với các ứng dụng mới và cập nhật trên Cửa hàng Play.
  • Android 12 trở lên: Các cải tiến khác đã được thực hiện, bao gồm các quyền phương tiện chi tiết và hiệu suất SAF được cải thiện.
  • Android 13 (API 33): Quyền READ_EXTERNAL_STORAGE rộng rãi không còn được dùng nữa để thay thế bằng các quyền phương tiện cụ thể.
  • Android 14 (API 34): Quyền truy cập một phần ảnh và video đã được giới thiệu, cho phép người dùng cấp quyền truy cập vào các tệp cụ thể thay vì toàn bộ thư viện phương tiện.

Lưu trữ có phạm vi ảnh hưởng như thế nào đến việc tải bên

Đối với người dùng cài đặt ứng dụng từ bên ngoài Cửa hàng Play, bộ nhớ có giới hạn đưa ra một số thách thức thực tế đáng để hiểu.

Tải xuống và truy cập tệp APK

Khi bạn tải xuống tệp APK thông qua trình duyệt, tệp này thường nằm trong thư mục Tải xuống. Trong phạm vi lưu trữ có phạm vi, ứng dụng trình duyệt sở hữu tệp đó. Nếu bạn muốn cài đặt nó bằng một ứng dụng khác, chẳng hạn như trình quản lý tệp, thì trình quản lý tệp đó cần có quyền truy cập thích hợp. Hầu hết các trình quản lý tệp hiện đại đều xử lý việc này một cách chính xác thông qua SAF, nhưng những trình quản lý cũ hơn có thể gặp khó khăn.

Trình cài đặt gói hệ thống vẫn có thể truy cập các tệp bạn chọn rõ ràng thông qua bộ chọn tệp, do đó quy trình tải xuống và cài đặt APK cơ bản vẫn hoạt động. Tuy nhiên, quy trình cài đặt tự động dựa vào quyền truy cập đường dẫn tệp trực tiếp có thể bị hỏng.

Tệp OBB và dữ liệu trò chơi

Đây là nơi lưu trữ có phạm vi tạo ra nhiều trở ngại nhất cho các trình tải phụ. Nhiều trò chơi lớn sử dụng tệp OBB (Opaque Binary Blob) được lưu trữ trong /Android/obb/[package.name]/. Theo mô hình cũ, bạn chỉ cần sao chép các tệp OBB vào đúng thư mục bằng bất kỳ trình quản lý tệp nào.

Với phạm vi lưu trữ, thư mục /Android/obb/ bị hạn chế. Trên Android 11 trở lên, các ứng dụng thông thường không thể ghi vào thư mục OBB của ứng dụng khác. Điều này có nghĩa là nếu bạn tải xuống tệp XAPK chứa dữ liệu OBB, trình cài đặt cần xử lý đặc biệt để đặt các tệp đó một cách chính xác.

Các công cụ như Trình trích xuất OBB của chúng tôi có thể giúp bạn trích xuất các tệp OBB từ các gói XAPK, nhưng việc đặt chúng vào đúng thư mục trên các phiên bản Android mới hơn có thể yêu cầu sử dụng trình quản lý tệp có quyền MANAGE_EXTERNAL_STORAGE hoặc sử dụng lệnh ADB từ máy tính.

Cân nhắc cài đặt XAPK

Các tệp XAPK kết hợp APK cùng với dữ liệu OBB và đôi khi phân chia cấu hình APK. Việc cài đặt những thứ này trên các thiết bị chạy Android 11 trở lên yêu cầu trình cài đặt hiểu được các hạn chế về bộ nhớ trong phạm vi. Trình cài đặt cần có quyền MANAGE_EXTERNAL_STORAGE hoặc sử dụng API thích hợp để đặt tệp OBB vào đúng vị trí.

Đây là một lý do tại sao việc chuyển đổi tệp XAPK sang định dạng APK tiêu chuẩn có thể hữu ích. APK độc lập không yêu cầu vị trí tệp OBB, đơn giản hóa quá trình cài đặt trên các phiên bản Android mới hơn. Bạn có thể sử dụng Công cụ chuyển đổi XAPKS sang APK của chúng tôi để trích xuất APK cơ sở từ gói XAPK.

Những điều nhà phát triển cần biết

Nếu bạn đang phát triển ứng dụng Android, bộ nhớ có phạm vi yêu cầu phải xem xét lại cách bạn xử lý tệp:

  • Sử dụng các thư mục dành riêng cho ứng dụng cho mọi tệp mà chỉ ứng dụng của bạn cần. Những thứ này không yêu cầu quyền và được tự động dọn sạch khi gỡ cài đặt.
  • Sử dụng MediaStore dành cho ảnh, video và âm thanh sẽ hiển thị với các ứng dụng khác và vẫn tồn tại khi gỡ cài đặt.
  • Sử dụng SAF khi ứng dụng của bạn cần hoạt động với các tài liệu hoặc thư mục do người dùng chọn.
  • Tránh các đường dẫn tập tin được mã hóa cứng. Các đường dẫn như /sdcard/MyApp/ không còn đáng tin cậy nữa. Thay vào đó hãy sử dụng Context.getExternalFilesDir().
  • Hành vi của Kiểm tra trên nhiều cấp độ API. khác biệt đáng kể giữa Android 10, 11, 13 và 14.

Chiến lược di chuyển

Nếu trước đây ứng dụng của bạn đã lưu trữ các tệp trong bộ nhớ dùng chung thì bạn cần có kế hoạch di chuyển. Phương pháp được đề xuất là sao chép các tệp hiện có vào bộ nhớ dành riêng cho ứng dụng trong lần khởi chạy đầu tiên sau khi cập nhật, sau đó xóa các bản sao cũ. Sử dụng Environment.getExternalStorageDirectory() với cờ kế thừa trong thời gian chuyển tiếp để đọc các tệp cũ, sau đó di chuyển chúng đến vị trí mới.

Những quan niệm sai lầm phổ biến

"Bộ nhớ có giới hạn nghĩa là ứng dụng không thể truy cập bất kỳ tệp nào"

Điều này là sai. Các ứng dụng vẫn có thể truy cập các tệp của riêng mình một cách tự do, đóng góp vào bộ sưu tập phương tiện được chia sẻ và yêu cầu quyền truy cập vào các tệp cụ thể thông qua bộ chọn hệ thống. Điều đã thay đổi là các ứng dụng không còn có thể duyệt âm thầm toàn bộ hệ thống tệp nữa.

"Trình quản lý tệp bị hỏng trên các phiên bản Android mới"

Trình quản lý tệp yêu cầu MANAGE_EXTERNAL_STORAGE vẫn hoạt động. Người dùng chỉ cần cấp quyền đặc biệt này thông qua cài đặt. Hầu hết các trình quản lý tệp phổ biến đã thích ứng với yêu cầu này.

"Bộ nhớ có phạm vi chỉ ảnh hưởng đến thẻ SD"

Bộ nhớ có giới hạn áp dụng cho tất cả bộ nhớ dùng chung, bao gồm cả bộ nhớ dùng chung nội bộ. Thuật ngữ "bộ nhớ ngoài" trong Android đề cập đến bộ nhớ dùng chung mà nhiều ứng dụng có thể truy cập được, không nhất thiết phải là thẻ SD vật lý.

Lời khuyên thiết thực cho người dùng

Nếu bạn thường xuyên tải ứng dụng hoặc quản lý tệp trên thiết bị Android của mình thì đây là một số đề xuất thiết thực:

  1. Sử dụng trình quản lý tập tin hiện đại hỗ trợ MANAGE_EXTERNAL_STORAGE. Các ứng dụng như Solid Explorer, MiXplorer và Total Commander đã thích ứng tốt với phạm vi lưu trữ.
  2. Cấp quyền cẩn thận. Khi trình quản lý tệp yêu cầu "Quyền truy cập tất cả các tệp", hãy hiểu rằng đây là quyền MANAGE_EXTERNAL_STORAGE và cần thiết để có đầy đủ chức năng.
  3. Sử dụng ADB cho các hoạt động tập tin cứng đầu. Nếu bạn không thể đặt các tệp OBB thông qua trình quản lý tệp, việc kết nối thiết bị của bạn với máy tính và sử dụng adb push sẽ bỏ qua hoàn toàn các hạn chế về phạm vi lưu trữ.
  4. Chuyển đổi các gói phức tạp sang các định dạng đơn giản hơn. Nếu tệp XAPK gây rắc rối cho bạn trên thiết bị mới hơn, thì chỉ trích xuất thành phần APK có thể là con đường ít gặp trở ngại nhất.
  5. Luôn cập nhật các ứng dụng cài đặt của bạn. Các phiên bản cũ hơn của trình cài đặt XAPK có thể không xử lý chính xác bộ nhớ trong phạm vi.

Tương lai của bộ nhớ Android

Google tiếp tục hoàn thiện mô hình lưu trữ qua mỗi phiên bản Android. Android 14 đã giới thiệu quyền truy cập phương tiện một phần, cho phép người dùng chỉ chia sẻ những bức ảnh cụ thể với ứng dụng thay vì toàn bộ thư viện của họ. Android 15 dự kiến sẽ mang lại những cải tiến hơn nữa về hiệu suất và khả năng sử dụng của Storage Access Framework.

Xu hướng rất rõ ràng: Android đang hướng tới một mô hình trong đó người dùng có quyền kiểm soát chi tiết đối với những gì mỗi ứng dụng có thể xem và sửa đổi. Mặc dù điều này tạo ra một số xích mích đối với người dùng thành thạo và người tải phụ, nhưng nó cải thiện đáng kể quyền riêng tư và bảo mật cho cơ sở người dùng rộng hơn.

Làm việc với bộ nhớ có phạm vi mà không làm hỏng dữ liệu ứng dụng

Bộ nhớ có phạm vi đại diện cho một trong những thay đổi quan trọng nhất đối với kiến trúc của Android trong những năm gần đây. Bằng cách giới hạn các ứng dụng trong hộp cát của riêng chúng và yêu cầu sự đồng ý rõ ràng của người dùng để có quyền truy cập rộng hơn, Google đã cải thiện đáng kể tình trạng bảo mật của nền tảng. Đối với những người dùng tải ứng dụng và quản lý tệp theo cách thủ công, việc hiểu những hạn chế này sẽ giúp bạn giải quyết các điểm xung đột thường xuyên xảy ra. Và đối với các nhà phát triển, việc thích ứng với bộ nhớ có phạm vi không phải là tùy chọn mà là một yêu cầu cơ bản để phát triển Android hiện đại.

Việc cài đặt APK, đặt tệp OBB và chỉ quản lý bộ nhớ hàng ngày đều chạy trên cùng một hệ thống: bộ nhớ có phạm vi. Khi bạn hiểu cách thức hoạt động của nó, bạn là người kiểm soát thiết bị của mình thay vì phó mặc cho các ứng dụng có thể lạm dụng quyền truy cập tệp rộng rãi.

Được thiết kế và ghi lại bởi Mst Shaefale Nhà phát triển chính và Kiến trúc sư gói Android • Đã xác minh trên Android 12–15

Bà Shaefale duy trì việc hợp nhất XAPK/APKS phía máy khách, trình phân tích cú pháp tệp kê khai nhị phân và các công cụ ký APK v1+v2 tại xapktoapk.com. Phát hiện lệnh đã lỗi thời hoặc thay đổi hệ điều hành? Gửi một ghi chú biên tập.