1. Giới thiệu về Android Auto Backup
Từ Android API 23 (Android 6.0) trở lên Google có hỗ trợ tự động sao lưu dữ liệu người dùng của các ứng dụng. Hệ thống Android lưu dữ liệu ứng dụng bằng cách tải nó lên Google Drive của người dùng. Lượng dữ liệu hoàn toàn miễn phí và giới hạn ở mức 25MB. Người dùng hoặc các ứng dụng khác không thể đọc được dữ liệu sao lưu đó. Khi bản sao lưu mới được cập nhật thì bản sao lưu cũ sẽ bị xoá.
2. Các tập tin được sao lưu
File shared preferences
File lưu trong bộ nhớ trong của app được truy cập bởi getFilesDir()hoặc getDir(String, int).
File trong bộ nhớ ngoài trong thư mục được trả về bởi getExternalFilesDir(String).
Các tệp trong thư mục được trả về bởi getDatabasePath(String), cũng bao gồm các tệp được tạo bởi lớp SQLiteOpenHelper.
Lưu ý:
Nếu người dùng sở hữu hai thiết bị, thì mỗi thiết bị tồn tại một bộ dữ liệu sao lưu riêng của mỗi thiết bị.
Nếu người dùng cài đặt lại thiết bị sau đó lại cài đặt ứng dụng trên chính thiết bị đó có cùng tài khoản bản sao lưu được lưu trữ trong bộ dữ liệu mới. Các bộ dữ liệu quá cũ sẽ tự động bị xóa sau một thời gian không hoạt động.
Nếu lượng dữ liệu trên 25 MB, hệ thống sẽ gọi onQuotaExceeded() và không sao lưu dữ liệu lên Google drive. Hệ thống kiểm tra định kỳ xem lượng dữ liệu sau đó có nằm dưới ngưỡng 25 MB hay không và tiếp tục tự động sao lưu khi thực hiện.
3. Thời điểm sao lưu
Sao lưu tự động xảy ra khi tất cả các điều kiện sau được đáp ứng:
Người dùng đã kích hoạt sao lưu trên thiết bị (vào Cài đặt> Hệ thống> Sao lưu .)
Ít nhất 24 giờ đã trôi qua kể từ lần sao lưu cuối cùng (hoặc có thể là 1 tuần - 1 tháng tuỳ vào cài đặt do người dùng)
Thiết bị được kết nối với mạng Wi-Fi (nếu người dùng thiết bị chưa chọn tham gia sao lưu dữ liệu di động).
Hoặc người dùng có thể tự sao lưu khi muốn bằng cách vào Cài đặt> Hệ thống> Sao lưu lúc này hệ thông sẽ lập tự sao lưu mà không cần đợi đến thời điểm 24h sau (Đây là 1 cách để mọi người có thể test tính năng tự động sao lưu này ngay lập tức được)
Lưu ý:
Để tiết kiệm băng thông mạng, việc tải lên chỉ diễn ra nếu dữ liệu ứng dụng đã thay đổi.
Trong quá trình sao lưu tự động, hệ thống sẽ tắt ứng dụng để đảm bảo ứng dụng không còn ghi vào hệ thống tệp. Theo mặc định, hệ thống sao lưu bỏ qua các ứng dụng đang chạy ở nền trước vì người dùng sẽ nhận thấy ứng dụng của họ bị tắt. Bạn có thể ghi đè hành vi mặc định bằng cách đặt thuộc tính backupInForeground thành true (Đó là lý do nhiều trường hợp app bạn crash khi đang sử dụng trong quá trình backup dữ liệu)
4. Thời điểm khôi phục
Dữ liệu được khôi phục bất cứ khi nào ứng dụng được cài đặt, từ cửa hàng Play, trong khi thiết lập thiết bị (khi hệ thống cài đặt các ứng dụng đã cài đặt trước đó) hoặc chạy cài đặt adb. Hoạt động khôi phục xảy ra sau khi APK được cài đặt, nhưng trước khi ứng dụng có sẵn để người dùng khởi chạy.
5. Cách thực hiện
5.1 Cách triển khai trong project
Hiện nay khi bạn tạo 1 project mới mặc định hệ thống sẽ cài đặt ứng dụng tự động sao lưu người dùng có thể tắt đi hoặc thêm vào các project cũ thông qua android:allowBackup="true" trong AndroidManifest. Mặc định sẽ android:allowBackup="true" nhưng để rõ ràng thì bạn nên liệt kê thuộc tính này ra trong lúc triển khai dự án
<manifest ... >
...
<application android:allowBackup="true" ... >
...
</application>
</manifest>
Nhưng đôi lúc vì một số lý do bạn chỉ muốn backup lại một số dữ liệu hoặc không muốn backup lại một số dữ liệu thì Android cũng đã hỗ trợ chúng ta việc đó thông qua android:fullBackupContent chúng ta sẽ tạo 1 file xml để quản lý các file được backup và các file không được backup và truyền đường dẫn vào
<application ...
android:fullBackupContent="@xml/my_backup_rules"> </application>
Tạo một tệp xml được gọi my_backup_rules.xml trong thư mục res/xml/. Trong tệp, thêm quy tắc với các phần tử <include> và <exclude>.
Ví dụ 1:
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
</full-backup-content>
Đây là ví dụ trong việc backup lại dữ liệu trong thư mục shared_pref. Với đoạn code như trên nghĩa là ta sẽ lưu toàn bộ các file trong thư mục shared_pref ngoại trừ file device.xml
Ví dụ 2:
<full-backup-content>
<include domain=["file" | "database" | "sharedpref" | "external" | "root"]
path="string"
requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] />
<exclude domain=["file" | "database" | "sharedpref" | "external" | "root"]
path="string" />
</full-backup-content>
<include> Chỉ định một tập tin hoặc thư mục để sao lưu. Theo mặc định, Tự động sao lưu bao gồm hầu hết tất cả các tệp ứng dụng. Nếu bạn chỉ định một phần tử<include>, hệ thống không còn bao gồm bất kỳ tệp nào theo mặc định và chỉ sao lưu các tệp được chỉ định . Để bao gồm nhiều tệp, sử dụng nhiều phần tử <include>.
<exclude> Chỉ định một tập tin hoặc thư mục để loại trừ trong quá trình sao lưu.
Lưu ý: Một số tệp thường được loại trừ khỏi bản sao lưu như
Các tệp có số nhận dạng cụ thể của thiết bị, do máy chủ cấp hoặc được tạo trên thiết bị Ví dụ: Google Cloud Messaging (GCM) cần tạo mã thông báo đăng ký mỗi khi người dùng cài đặt ứng dụng của bạn trên thiết bị mới. Nếu mã thông báo đăng ký cũ được khôi phục, ứng dụng có thể hoạt động bất ngờ.
Thông tin tài khoản hoặc thông tin nhạy cảm khác. Cân nhắc việc yêu cầu người dùng xác nhận lại lần đầu tiên khi họ khởi chạy một ứng dụng được khôi phục thay vì cho phép lưu trữ thông tin đó trong bản sao lưu.
Các tập tin liên quan đến gỡ lỗi ứng dụng.
Các tệp lớn khiến ứng dụng vượt quá dung lượng sao lưu 25 MB.
5.2 Các thuộc tính chính
domain Chỉ định vị trí của tài nguyên. Các thư mục hợp lệ trong danh sách sau:
root thư mục trên hệ thống tệp nơi lưu trữ tất cả các tệp riêng tư của ứng dụng này.
file thư mục được trả về bởi getFilesDir().
database thư mục được trả về bởi getDatabasePath(). Cơ sở dữ liệu được tạo với SQLiteOpenHelper được lưu trữ ở đây.
sharedpref thư mục nơi SharedPreferences được lưu trữ.
external thư mục được trả về bởi getExternalFilesDir()
path Chỉ định tệp hoặc thư mục để bao gồm hoặc loại trừ khỏi bản sao lưu. Lưu ý rằng:
Thuộc tính này không hỗ trợ cú pháp ký tự đại diện hoặc regex.
Bạn có thể sử dụng .để tham chiếu thư mục hiện tại, tuy nhiên, bạn không thể tham chiếu thư mục mẹ .. vì lý do bảo mật.
Nếu bạn chỉ định một thư mục, thì quy tắc sẽ áp dụng cho tất cả các tệp trong thư mục và thư mục con đệ quy.
5.3 Lưu ý
Nếu ứng dụng của bạn lưu thông tin nhạy cảm trên thiết bị, bạn có thể chỉ định các điều kiện theo đó dữ liệu của ứng dụng được bao gồm trong bản sao lưu của người dùng.
Bạn có thể thêm các điều kiện sau trong Android 9 (API cấp 28) trở lên:
clientSideEncryption: Bản sao lưu của người dùng được mã hóa với một bí mật phía máy khách. Hình thức mã hóa này được bật trên các thiết bị chạy Android 9 trở lên miễn là người dùng đã bật sao lưu trong Android 9 trở lên và đã đặt khóa màn hình (PIN, mẫu hoặc mật khẩu) cho thiết bị của họ.
deviceToDeviceTransfer: Người dùng đang chuyển bản sao lưu của họ sang một thiết bị khác hỗ trợ chuyển từ thiết bị sang thiết bị cục bộ (ví dụ: Google Pixel).
6. Tổng kết
Việc sao lưu dữ liệu rất hữu ích nhưng việc sử dụng nó cũng cần phải cân nhắc và cẩn thận trong trường hợp sử dụng để thông tin ứng dụng cũng như thông tin người dùng được bảo mật một cách tuyệt đối.
Comments