Kiểm tra chức năng sao lưu và khôi phục

Trang này cho biết cách kích hoạt tính năng sao lưu và khôi phục hoạt động theo cách thủ công bằng chế độ Auto Backup (Tự động sao lưu) và Key/Value Backup (Sao lưu khóa/giá trị) để đảm bảo ứng dụng lưu và khôi phục dữ liệu đúng cách.

Cách hoạt động của tính năng sao lưu

Phần này mô tả các phần trong khung Dịch vụ sao lưu của Android cũng như cách tương tác với các ứng dụng hỗ trợ tính năng Tự động sao lưu và Khóa/giá trị sao lưu. Trong giai đoạn phát triển ứng dụng, hầu hết hoạt động nội bộ của khung này đã bị loại bỏ, nên bạn không cần biết thông tin này. Tuy nhiên, trong giai đoạn kiểm tra, bạn cần phải hiểu rõ các khái niệm này.

Sơ đồ dưới đây minh hoạ luồng dữ liệu trong quá trình sao lưu và khôi phục:

Luồng dữ liệu khung dự phòng

Backup Manager Service (Dịch vụ quản lý sao lưu) là một dịch vụ hệ thống của Android có chức năng sắp xếp và bắt đầu các hoạt động sao lưu và khôi phục. Bạn có thể truy cập dịch vụ này qua Backup ManagerAPI. Trong quá trình sao lưu, dịch vụ này sẽ truy vấn ứng dụng của bạn để có dữ liệu sao lưu rồi chuyển ứng dụng đó đến phương tiện vận chuyển sao lưu, sau đó sẽ lưu trữ dữ liệu. Trong quá trình khôi phục, dịch vụ quản lý sao lưu sẽ truy xuất dữ liệu sao lưu từ quá trình truyền sao lưu rồi khôi phục dữ liệu đó cho thiết bị.

Backup Transports (Phương tiện vận chuyển sao lưu) là các thành phần của Android chịu trách nhiệm về việc lưu trữ và truy xuất dữ liệu sao lưu. Thiết bị Android có thể có không có hoặc có nhiều phương tiện vận chuyển sao lưu, nhưng chỉ có thể đánh dấu một trong phương tiện vận chuyển đó là đang hoạt động. Các gói phương tiện vận chuyển sao lưu có sẵn còn tuỳ theo loại thiết bị (do các nhà sản xuất thiết bị và nhà cung cấp dịch vụ tùy chỉnh) nhưng hầu hết thiết bị hỗ trợ dịch vụ Google Play đều cung cấp những phương tiện vận chuyển sau đây:

  • Google Transport (mặc định) – phương thức truyền tải dự phòng đang hoạt động trên hầu hết thiết bị, thuộc Các dịch vụ của Google dành cho thiết bị di động. Tài liệu này giả định người dùng đang sử dụng Google Transport. Quá trình truyền tải này lưu trữ dữ liệu trong Dịch vụ sao lưu của Android.
  • Local Transport (Phương tiện sao lưu cục bộ) – lưu trữ dữ liệu sao lưu trên thiết bị. Phương tiện vận chuyển này thường dùng cho mục đích phát triển/gỡ lỗi, nhưng không hữu ích trong thực tế.

Nếu thiết bị không có phương thức vận chuyển sao lưu nào, thì không thể sao lưu dữ liệu. Ứng dụng của bạn không bị ảnh hưởng bất lợi.

Điều kiện tiên quyết

Để kiểm tra các hoạt động sao lưu và khôi phục, bạn cần biết một chút về các công cụ sau đây.

  • adb – để chạy các lệnh trên thiết bị hoặc trình mô phỏng
  • bmgr – để thực hiện nhiều thao tác sao lưu và khôi phục
  • logcat – để xem kết quả của hoạt động sao lưu và khôi phục.

Chuẩn bị thiết bị hoặc trình mô phỏng

Chuẩn bị thiết bị hoặc trình mô phỏng của bạn để kiểm tra sao lưu bằng cách làm theo danh sách kiểm tra sau đây:

  • Đối với tính năng Tự động sao lưu, hãy kiểm tra để đảm bảo bạn đang sử dụng một thiết bị hoặc trình mô phỏng chạy Android 6.0 (API cấp 23) trở lên.
  • Đối với tính năng Sao lưu khóa/giá trị, hãy kiểm tra để đảm bảo bạn đang sử dụng một thiết bị hoặc trình mô phỏng chạy Android 2.2 (API cấp 8) trở lên.
  • Kiểm tra để đảm bảo bạn đã bật tính năng sao lưu và khôi phục trên thiết bị hoặc trình mô phỏng đồng thời Tài khoản Google đã được thêm. Có hai cách để kiểm tra:

    • Tuỳ thuộc vào phiên bản thiết bị, bạn có thể chuyển đến phần Settings (Cài đặt) > Backup & Restore (Sao lưu và khôi phục) hoặc chỉ cần tìm Backup (Sao lưu) trong thanh tìm kiếm ở đầu màn hình.
    • Trong shell adb, hãy chạy bmgr enabled

    Trên thiết bị thực, tính năng sao lưu và khôi phục thường được bật trong trình hướng dẫn thiết lập ban đầu. Trình mô phỏng không chạy trình hướng dẫn thiết lập, vì vậy, đừng quên bật tính năng sao lưu và chỉ định tài khoản sao lưu trong phần cài đặt của thiết bị.

  • Hãy đảm bảo Google Backup Transport (Google Di chuyển sao lưu) có sẵn và đang hoạt động bằng cách chạy lệnh:

    adb shell bmgr list transports
    

    Sau đó, kiểm tra bảng điều khiển để xem kết quả sau:

    android/com.android.internal.backup.LocalTransport
    * com.google.android.gms/.backup.BackupTransportService
    

Các thiết bị thực không có Google Play và trình mô phỏng không có API Google có thể không bao gồm Google Di chuyển sao lưu. Bài viết này giả định bạn đang sử dụng Google Backup Transport (Google Di chuyển sao lưu). Bạn có thể kiểm tra dữ liệu sao lưu và khôi phục các dữ liệu sao lưu khác, nhưng quy trình và dữ liệu đầu ra có thể khác nhau.

Kiểm tra bản sao lưu

Để bắt đầu sao lưu ứng dụng, hãy chạy lệnh sau:

adb shell bmgr backupnow <PACKAGE>

Lệnh backupnow có trên các thiết bị và trình mô phỏng chạy Android 7.0 trở lên. Thao tác này sẽ chạy tính năng Sao lưu khóa/giá trị hoặc Tự động sao lưu tùy thuộc vào các thông tin khai báo của gói. Kiểm tra logcat để xem kết quả của quy trình sao lưu. Ví dụ:

D/BackupManagerService: fullTransportBackup()
I/GmsBackupTransport: Attempt to do full backup on <PACKAGE>

---- or ----

V/BackupManagerService: Scheduling immediate backup pass
D/PerformBackupTask: starting key/value Backup of BackupRequest{pkg=<PACKAGE>}

Nếu lệnh backupnow không hoạt động trên thiết bị, hãy hoàn thành các bước bên dưới cho tính năng Tự động sao lưu hoặc Sao lưu khóa/giá trị.

Đối với Tự động sao lưu, hãy hoàn tất các bước sau:

  1. Chạy lệnh sau:

    adb shell bmgr backup @pm@ && adb shell bmgr run
    
  2. Chờ cho đến khi lệnh trong bước trước đó kết thúc bằng cách theo dõi adb logcat của đầu ra sau:

    I/BackupManagerService: K/V backup pass finished.
    
  3. Chạy lệnh sau để thực hiện sao lưu toàn bộ:

    adb shell bmgr fullbackup <PACKAGE>
    

Đối với Sao lưu khóa/giá trị, hãy lên lịch và chạy bản sao lưu bằng các bước sau:

  1. Nếu ứng dụng chưa gọi BackupManager.dataChanged() kể từ lần sao lưu gần đây nhất, bạn có thể đưa ứng dụng đó vào hoạt động sao lưu cho mục đích kiểm tra bằng cách chạy lệnh sau:

    adb shell bmgr backup <PACKAGE>
    
  2. Sau đó, bạn có thể kích hoạt bản sao lưu bằng cách chạy lệnh sau:

    adb shell bmgr run
    

bmgr backup sẽ thêm ứng dụng của bạn vào hàng đợi của Trình quản lý sao lưu. bmgr run sẽ bắt đầu hoạt động sao lưu, buộc Trình quản lý sao lưu thực hiện tất cả yêu cầu sao lưu đang nằm trong hàng đợi.

Khi kiểm tra các bản Sao lưu khóa/giá trị, bạn phải xác minh mọi thay đổi ưu tiên sẽ lên lịch sao lưu. Bạn có thể xác minh bản sao lưu được lên lịch bằng một trong những cách sau:

  • Chạy adb shell dumpsys backup và kiểm tra để đảm bảo rằng ứng dụng của bạn đã được liệt kê trong kết quả của lệnh trong Pending key/value backup.

  • Ghi nhật ký một tin nhắn khi bạn lên lịch sao lưu. Sau đó, bạn có thể chạy adb logcat và kiểm tra kết quả của lệnh để xác minh một bản sao lưu đã được lên lịch.

Kiểm tra bản khôi phục

Để bắt đầu khôi phục theo cách thủ công, hãy chạy lệnh sau bằng mã thông báo dự phòng (xem cách lấy một mã thông báo bên dưới):

adb shell bmgr restore <TOKEN> <PACKAGE>

Để tìm các mã thông báo dự phòng, hãy chạy adb shell dumpsys backup. Mã thông báo là chuỗi thập lục phân theo nhãn Ancestral:Current:. Mã thông báo cung cấp là tập dữ liệu sao lưu dùng để khôi phục thiết bị vào thời điểm thiết lập ban đầu (bằng trình hướng dẫn thiết lập thiết bị). Mã thông báo hiện tại là dữ liệu của tập dữ liệu sao lưu hiện tại của thiết bị (tập dữ liệu thiết bị hiện đang gửi dữ liệu sao lưu đến).

Sau đó, kiểm tra logcat để xem kết quả của quy trình khôi phục. Ví dụ:

V/BackupManagerService: beginRestoreSession: pkg=<PACKAGE> transport=null
V/RestoreSession: restorePackage pkg=<PACKAGE> token=368abb4465c5c683
...
I/BackupManagerService: Restore complete.

Bạn có thể kiểm tra việc khôi phục tự động cho ứng dụng của mình bằng cách gỡ cài đặt và cài đặt lại ứng dụng bằng adb hoặc thông qua ứng dụng Cửa hàng Google Play.

Khắc phục sự cố

Phần này giúp bạn khắc phục một số vấn đề thường gặp.

Vượt quá hạn mức vận chuyển

Nếu bạn thấy các thông báo sau trong logcat:

I/PFTBT: Transport rejected backup of <PACKAGE>, skipping

--- or ---

I/PFTBT: Transport quota exceeded for package: <PACKAGE>

Ứng dụng của bạn đã vượt quá hạn mức. Hãy giảm lượng dữ liệu sao lưu rồi thử lại. Ví dụ: xác minh bạn chỉ lưu dữ liệu vào bộ nhớ đệm trong thư mục bộ nhớ đệm của ứng dụng. Thư mục bộ nhớ đệm không bao gồm trong các bản sao lưu.

Không thể sao lưu toàn bộ

Nếu bạn thấy thông báo sau trong logcat:

I/BackupManagerService: Full backup not currently possible -- key/value backup not yet run?

Thao tác sao lưu toàn bộ không thành công do chưa có thao tác Sao lưu khóa/giá trị nào xảy ra trên thiết bị. Kích hoạt Sao lưu khóa/giá trị bằng lệnh bmgr run rồi thử lại.

Hết thời gian chờ hỗ trợ

Nếu bạn thấy thông báo sau trong logcat:

12-05 18:59:02.033  1910  2251 D BackupManagerService:
    awaiting agent for ApplicationInfo{5c7cde0 com.your.app.package}
12-05 18:59:12.117  1910  2251 W BackupManagerService:
    Timeout waiting for agent ApplicationInfo{5c7cde0 com.your.app.package}
12-05 18:59:12.117  1910  2251 W BackupManagerService:
    Can't find backup agent for com.your.app.package

Ứng dụng của bạn mất hơn 10 giây để chạy bản sao lưu. Hãy lưu ý sự khác biệt về dấu thời gian ở đầu ra nhật ký. Lỗi này thường xảy ra khi ứng dụng sử dụng cấu hình nhiều macro mà không có ProGuard.

Tài khoản sao lưu chưa khởi chạy

Nếu bạn thấy các thông báo sau trong logcat:

01-31 14:32:45.698 17280 17292 I Backup: [GmsBackupTransport] Try to backup for an uninitialized backup account.
01-31 14:32:45.699  1043 18255 W PFTBT: Transport failed; aborting backup: -1001
01-31 14:32:45.699  1043 18255 I PFTBT: Full backup completed with status: -1000

Quá trình sao lưu đã bị huỷ do tập dữ liệu sao lưu chưa được khởi chạy. Chạy trình quản lý sao lưu bằng lệnh adb shell bmgr run rồi thử thực hiện sao lưu lại.

Phương thức gọi ứng dụng không được gọi

Do tính năng Tự động sao lưu chạy ứng dụng của bạn bằng lớp cơ sở của Application, nên các phương thức thiết lập của ứng dụng có thể không được gọi. Tính năng Tự động sao lưu không chạy bất kỳ hoạt động nào của ứng dụng, vì vậy bạn có thể thấy lỗi nếu ứng dụng của bạn thiết lập một hoạt động. Để tìm hiểu thêm, hãy đọc bài viết Triển khai BackupAgent.

Ngược lại, tính năng Sao lưu khóa/giá trị sẽ chạy ứng dụng với mọi lớp con Application mà bạn khai báo trong tệp kê khai ứng dụng.