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 dung | Phương thức truy cập | Cần cấp quyền | Cá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ụng | Tệp chỉ dành cho ứng dụng của bạn | Từ 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ên |
Không | Có |
Nội dung đa phương tiện | Các tệp đa phương tiện có thể chia sẻ (hình ảnh, tệp âm thanh, video) | API MediaStore |
READ_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ênREAD_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ống |
Có, mặc dù ứng dụng khác cần
quyền READ_EXTERNAL_STORAGE |
Không |
Tài liệu và các tệp khác | Các loại nội dung khác có thể chia sẻ, bao gồm cả tệp đã tải xuống | Khung truy cập bộ nhớ | Không có | Có, thông qua bộ chọn tệp hệ thống | Không |
Lựa chọn ưu tiên về ứng dụng | Cặp khóa-giá trị | Thư viện Lựa chọn ưu tiên về Jetpack | Không có | Không | Có |
Cơ sở dữ liệu | Dữ liệu có cấu trúc | Thư viện lưu trữ Room | Không có | Không | Có |
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ư
/sdcard
.
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:
<manifest ... android:installLocation="preferExternal"> ... </manifest>
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_STORAGE
và
MANAGE_EXTERNAL_STORAGE
.
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 MANAGE_EXTERNAL_STORAGE
, 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.
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.
Tài nguyên khác
Để biết thêm thông tin về cách lưu trữ dữ liệu, hãy tham khảo các tài nguyên sau.