Giới hạn file hệ thống là gì

Android sử dụng một hệ thống tệp tương tự như hệ thống tệp dựa trên ổ đĩa trong các nền tảng khác. Hệ thống này cung cấp một số lựa chọn để bạn lưu dữ liệu ứng dụng của mình:

  • Bộ nhớ dành riêng cho ứng dụng: Lưu trữ các tệp chỉ dành cho ứng dụng của bạn, trong các thư mục chuyên dụng thuộc ổ bộ nhớ trong hoặc các thư mục chuyên dụng khác trong bộ nhớ ngoài. Hãy dùng các thư mục thuộc bộ nhớ trong để lưu thông tin nhạy cảm mà những ứng dụng khác không được truy cập.
  • Bộ nhớ dùng chung: Lưu trữ các tệp mà ứng dụng của bạn định chia sẻ với ứng dụng khác, bao gồm cả nội dung đa phương tiện, tài liệu và các tệp khác.
  • Lựa chọn ưu tiên: Lưu trữ dữ liệu gốc và riêng tư trong các cặp khóa-giá trị.
  • Cơ sở dữ liệu: Lưu trữ dữ liệu có cấu trúc trong một cơ sở dữ liệu riêng tư bằng cách sử dụng thư viện lưu trữ Room.

Đặc điểm của các tuỳ chọn này được tóm tắt trong bảng sau:

Loại nội dungPhương thức truy cậpCần cấp quyềnCác ứng dụng khác có thể truy cập không?Các tệp bị xoá khi gỡ cài đặt ứng dụng?Tệp dành riêng cho ứng dụngTệp chỉ dành cho ứng dụng của bạnTừ bộ nhớ trong, getFilesDir() hoặc getCacheDir()

Từ bộ nhớ ngoài, getExternalFilesDir() hoặc getExternalCacheDir()Không cần thiết cho bộ nhớ trong

Không cần thiết cho bộ nhớ ngoài khi ứng dụng được dùng trên những thiết bị chạy Android 4.4 (API cấp 19) trở lênKhôngCóNội dung đa phương tiệnCác tệp đa phương tiện có thể chia sẻ (hình ảnh, tệp âm thanh, video)API MediaStoreREAD_EXTERNAL_STORAGE khi truy cập vào tệp của ứng dụng khác trên Android 11 (API cấp 30) trở lên

READ_EXTERNAL_STORAGE hoặc WRITE_EXTERNAL_STORAGE khi truy cập vào tệp của ứng dụng khác trên Android 10 (API cấp 29)

Cần có quyền đối với tất cả các tệp trên Android 9 (API cấp 28) trở xuốngCó, mặc dù ứng dụng khác cần quyền READ_EXTERNAL_STORAGEKhôngTài liệu và các tệp khácCác loại nội dung khác có thể chia sẻ, bao gồm cả tệp đã tải xuốngKhung truy cập bộ nhớKhông cóCó, thông qua bộ chọn tệp hệ thốngKhôngLựa chọn ưu tiên về ứng dụngCặp khóa-giá trịThư viện Lựa chọn ưu tiên về JetpackKhông cóKhôngCóCơ sở dữ liệuDữ liệu có cấu trúcThư viện lưu trữ RoomKhông cóKhôngCó

Giải pháp bạn chọn phụ thuộc vào nhu cầu cụ thể của bạn:

Dữ liệu của bạn cần bao nhiêu dung lượng?Bộ nhớ trong có dung lượng hạn chế đối với dữ liệu dành riêng cho ứng dụng. Hãy dùng các loại bộ nhớ khác nếu bạn cần tiết kiệm lượng dữ liệu đáng kể.Quyền truy cập dữ liệu cần có mức độ đáng tin cậy thế nào?Nếu chức năng cơ bản của ứng dụng yêu cầu các dữ liệu nhất định, chẳng hạn như khi ứng dụng khởi động, hãy đặt dữ liệu vào thư mục bộ nhớ trong hoặc một cơ sở dữ liệu. Các tệp dành riêng cho ứng dụng được lưu trữ trong bộ nhớ ngoài không phải lúc nào cũng truy cập được vì một số thiết bị cho phép người dùng tháo thiết bị thực tế tương ứng với bộ nhớ ngoài.Bạn cần lưu trữ loại dữ liệu nào?Nếu bạn có dữ liệu chỉ dành cho ứng dụng của mình, hãy dùng bộ nhớ dành riêng cho ứng dụng. Đối với nội dung đa phương tiện có thể chia sẻ, hãy sử dụng bộ nhớ dùng chung để các ứng dụng khác có thể truy cập vào nội dung đó. Đối với dữ liệu có cấu trúc, hãy sử dụng các lựa chọn ưu tiên (đối với dữ liệu khóa-giá trị) hoặc một cơ sở dữ liệu (đối với dữ liệu chứa nhiều hơn 2 cột).Dữ liệu có phải ở chế độ riêng tư trong ứng dụng của bạn không?Khi lưu trữ dữ liệu nhạy cảm – dữ liệu mà các ứng dụng khác không được truy cập, hãy sử dụng bộ nhớ trong, lựa chọn ưu tiên hoặc một cơ sở dữ liệu. Bộ nhớ trong có thêm lợi ích là dữ liệu được ẩn khỏi người dùng.

Danh mục vị trí bộ nhớ

Android cung cấp 2 loại vị trí bộ nhớ thực: bộ nhớ trong và bộ nhớ ngoài. Trên hầu hết các thiết bị, bộ nhớ trong nhỏ hơn bộ nhớ ngoài. Tuy nhiên, bộ nhớ trong luôn có sẵn trên mọi thiết bị, do đó, đây là nơi đáng tin cậy hơn để lưu dữ liệu mà ứng dụng của bạn dựa vào.

Các ổ đĩa di động, chẳng hạn như thẻ SD, sẽ xuất hiện trong hệ thống tệp như một phần của bộ nhớ ngoài. Android biểu thị các thiết bị này bằng một đường dẫn, chẳng hạn như getFilesDir()0.

Thận trọng: Vị trí chính xác mà bạn có thể lưu tệp sẽ khác nhau tùy theo thiết bị. Vì lý do này, đừng sử dụng đường dẫn tệp được mã hoá cứng.

Các ứng dụng được lưu trữ vào bộ nhớ trong theo mặc định. Tuy nhiên, nếu kích thước APK rất lớn, bạn có thể cho biết lựa chọn ưu tiên trong tệp kê khai của ứng dụng là cài đặt ứng dụng trên bộ nhớ ngoài:

android:installLocation="preferExternal">
  ...

Quyền và quyền truy cập vào bộ nhớ ngoài

Android xác định các quyền liên quan đến bộ nhớ sau đây: READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGEgetFilesDir()3.

Trong những phiên bản Android trước đây, các ứng dụng cần khai báo quyền READ_EXTERNAL_STORAGE để truy cập vào mọi tệp bên ngoài thư mục dành riêng cho ứng dụng trong bộ nhớ ngoài. Ngoài ra, các ứng dụng cũng cần phải khai báo quyền WRITE_EXTERNAL_STORAGE để ghi vào mọi tệp bên ngoài thư mục dành riêng cho ứng dụng.

Các phiên bản Android mới dựa vào mục đích của một tệp hơn là vị trí của tệp để xác định khả năng ứng dụng truy cập và ghi vào một tệp nhất định. Cụ thể là nếu ứng dụng của bạn nhắm đến Android 11 (API cấp 30) trở lên, thì quyền WRITE_EXTERNAL_STORAGE sẽ không ảnh hưởng đến quyền truy cập của ứng dụng vào bộ nhớ. Mô hình lưu trữ dựa trên mục đích này giúp cải thiện quyền riêng tư của người dùng vì các ứng dụng chỉ được cấp quyền truy cập vào những phần thực sự cần thiết trong hệ thống tệp của thiết bị.

Android 11 giới thiệu quyền getFilesDir()3, cho phép quyền ghi vào các tệp bên ngoài thư mục dành riêng cho ứng dụng và MediaStore. Để tìm hiểu thêm về quyền này và lý do hầu hết ứng dụng không cần phải khai báo quyền này để thực hiện đầy đủ các trường hợp sử dụng, hãy xem hướng dẫn về cách quản lý mọi tệp trên thiết bị lưu trữ.

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

Để mang lại cho người dùng nhiều quyền kiểm soát hơn đối với tệp của họ và giảm thiểu tình trạng tệp lộn xộn, các ứng dụng nhắm đến Android 10 (API cấp 29) trở lên được cấp quyền truy cập có giới hạn vào bộ nhớ ngoài, hoặc bộ nhớ có giới hạn, theo mặc định. Những ứng dụng như vậy chỉ có quyền truy cập vào thư mục dành riêng cho ứng dụng trong bộ nhớ ngoài, cũng như các loại nội dung đa phương tiện cụ thể mà ứng dụng đó đã tạo.

Lưu ý: Nếu ứng dụng của bạn yêu cầu quyền liên quan đến bộ nhớ trong thời gian chạy, thì hộp thoại mà người dùng nhìn thấy sẽ cho biết rằng ứng dụng của bạn đang yêu cầu quyền truy cập rộng vào bộ nhớ ngoài, ngay cả khi bộ nhớ có giới hạn được bật.

Hãy dùng bộ nhớ có giới hạn, trừ khi ứng dụng của bạn cần quyền truy cập vào một tệp được lưu trữ bên ngoài thư mục dành riêng cho ứng dụng và bên ngoài thư mục mà MediaStore API có thể truy cập. Nếu lưu trữ các tệp dành riêng cho ứng dụng trong bộ nhớ ngoài, bạn có thể làm cho việc sử dụng bộ nhớ có giới hạn hơn trở nên dễ dàng hơn bằng cách đặt các tệp này vào một thư mục dành riêng cho ứng dụng trong bộ nhớ bên ngoài. Bằng cách đó, ứng dụng của bạn vẫn duy trì quyền truy cập vào các tệp này khi bộ nhớ có giới hạn được bật.

Để chuẩn bị ứng dụng của bạn cho bộ nhớ có giới hạn, hãy xem hướng dẫn về các trường hợp sử dụng bộ nhớ và phương pháp hay nhất. Nếu ứng dụng của bạn có trường hợp sử dụng khác không thuộc phạm vi của bộ nhớ có giới hạn, hãy gửi một yêu cầu về tính năng. Bạn có thể tạm thời chọn không sử dụng bộ nhớ có giới hạn.

Xem tệp trên thiết bị

Để xem các tệp được lưu trữ trên một thiết bị, hãy dùng Trình khám phá tệp trên thiết bị của Android Studio.