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

Trang này cho bạn biết cách kiểm thử tính năng sao lưu trên đám mây và tính năng chuyển từ thiết bị sang thiết bị (D2D) cho ứng dụng của bạn. Bạn cần phải kiểm thử cả hai thành phần này trên mỗi bản phát hành chính của ứng dụng để đảm bảo người dùng có thể tiếp tục dùng ứng dụng trên một thiết bị mới. Mặc dù cả tính năng sao lưu và chuyển dữ liệu đều tương tự nhau, nhưng có điểm khác biệt quan trọng giữa 2 tính năng này trong Android 12 (API cấp 31) trở lên – đáng chú ý nhất là tính năng chuyển có giới hạn kích thước dữ liệu là 2 GB, lớn hơn nhiều so với giới hạn của tính năng sao lưu trên đám mây là 25 MB.

Hướng dẫn này chỉ cho bạn cách kiểm thử cả tính năng sao lưu và khôi phục trên đám mây cũng như chuyển D2D hiệu quả trong suốt chu trình phát triển.

Cách hoạt động của quy trình kiểm thử 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 chúng tương tác với các ứng dụng hỗ trợ tính năng Tự động sao lưu và sao lưu khoá-giá trị. 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 phải biết thông tin này. Tuy nhiên, trong giai đoạn kiểm thử, việc hiểu rõ các khái niệm này đóng vai trò quan trọng hơn.

Sơ đồ dưới đây minh hoạ cách dữ liệu di chuyển trong quá trình sao lưu và khôi phục trên đám mây. Đối với mục đích kiểm thử, bạn có thể sử dụng cùng một thiết bị để sao lưu và khôi phục trên đám mây.

Luồng dữ liệu khung sao lưu

Sơ đồ dưới đây minh hoạ cách dữ liệu di chuyển trong quá trình chuyển D2D:

Luồng dữ liệu khung chuyển

Không giống như quy trình kiểm thử tính năng sao lưu và khôi phục trên đám mây, quy trình kiểm thử D2D yêu cầu phải có thiết bị nguồn và thiết bị mục tiêu để sao chép.

Dịch vụ quản lý bản sao lưu là một dịch vụ hệ thống của Android có chức năng sắp xếp cũng như 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 API Backup Manager.

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 công cụ di chuyển bản sao lưu. Sau đó, công cụ này sẽ lưu trữ dữ liệu vào đám mây. Trong quá trình khôi phục, Dịch vụ quản lý bản sao lưu sẽ truy xuất dữ liệu sao lưu từ công cụ di chuyển bản sao lưu rồi khôi phục dữ liệu đó cho thiết bị. Để chuyển D2D, Dịch vụ quản lý bản sao lưu sẽ truy vấn ứng dụng của bạn để lấy dữ liệu sao lưu và chuyển trực tiếp sang Dịch vụ quản lý bản sao lưu trên thiết bị mới. Dịch vụ này sẽ tải dữ liệu đó vào ứng dụng của bạn.

Công cụ di chuyển bản sao lưu là các thành phần của Android chịu trách nhiệm lưu trữ và truy xuất dữ liệu ứng dụng của bạn. Thiết bị Android có thể không có hoặc có nhiều công cụ di chuyển bản sao lưu, nhưng chỉ có thể đánh dấu một trong những công cụ đó là đang hoạt động. Mỗi thiết bị sẽ có sẵn các công cụ di chuyển bản sao lưu khác nhau tuỳ thuộc vào các yếu tố tuỳ chỉnh của nhà sản xuất thiết bị và nhà cung cấp dịch vụ, nhưng hầu hết thiết bị hỗ trợ dịch vụ Google Play đều cung cấp các công cụ di chuyển sau đây:

  • Công cụ di chuyển GMS: Công cụ di chuyển bản sao lưu sang đám mây đ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. Công cụ di chuyển này lưu trữ dữ liệu trong Android Backup Service.
  • Công cụ di chuyển D2D: Công cụ di chuyển này được dùng trong quá trình di chuyển D2D để di chuyển dữ liệu trực tiếp từ thiết bị này sang thiết bị khác.

Công cụ

Để kiểm thử 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 hoạt động 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.

Kiểm thử tính năng sao lưu trên đám mây

Bạn có thể dùng một thiết bị duy nhất để sao lưu và khôi phục trên đám mây bằng cách làm theo các bước trong phần này.

Chuẩn bị thiết bị hoặc trình mô phỏng để sao lưu trên đám mây

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

  1. Đố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.
  2. Đối với tính năng sao lưu khoá-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.
  3. Bạn phải có kết nối Internet để kiểm thử bản sao lưu trên đám mây.
  4. Đăng nhập vào thiết bị bằng một Tài khoản Google và đặt tài khoản đó làm tài khoản sao lưu: Cài đặt -> Google -> Sao lưu.

Để kiểm thử tính năng sao lưu trên đám mây, hãy kích hoạt tính năng sao lưu trên đám mây, sau đó gỡ cài đặt rồi cài đặt lại ứng dụng. Để có thể lặp lại quy trình này, bạn có thể sử dụng tập lệnh test_cloud_backup.sh. Tập lệnh này giúp sao lưu ứng dụng, tải APK xuống thiết bị, gỡ cài đặt rồi cài đặt lại APK:

#!/bin/bash -eu
: "${1?"Usage: $0 package name"}"

# Initialize and create a backup
adb shell bmgr enable true
adb shell bmgr transport com.android.localtransport/.LocalTransport | grep -q "Selected transport" || (echo "Error: error selecting local transport"; exit 1)
adb shell settings put secure backup_local_transport_parameters 'is_encrypted=true'
adb shell bmgr backupnow "$1" | grep -F "Package $1 with result: Success" || (echo "Backup failed"; exit 1)

# Uninstall and reinstall the app to clear the data and trigger a restore
apk_path_list=$(adb shell pm path "$1")
OIFS=$IFS
IFS=$'\n'
apk_number=0
for apk_line in $apk_path_list
do
    (( ++apk_number ))
    apk_path=${apk_line:8:1000}
    adb pull "$apk_path" "myapk${apk_number}.apk"
done
IFS=$OIFS
adb shell pm uninstall --user 0 "$1"
apks=$(seq -f 'myapk%.f.apk' 1 $apk_number)
adb install-multiple -t --user 0 $apks

# Clean up
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
rm $apks

echo "Done"

Các bước kiểm thử

  1. Mở ứng dụng, đăng nhập và sửa đổi mọi chế độ cài đặt.
  2. Chạy tập lệnh, truyền tên gói của bạn vào, chẳng hạn như test_cloud_backup.sh com.example.myapp
  3. Mở lại ứng dụng và xác thực rằng tất cả các ứng dụng đều hoạt động đúng cách và mọi dữ liệu đều được giữ lại.

Bạn không muốn người dùng của mình phải đăng nhập và cần giữ nguyên mọi chế độ cài đặt, tiến trình và dữ liệu ứng dụng của họ. Nếu kết quả kiểm thử không đáp ứng các tiêu chí này, hãy đảm bảo rằng bạn đã định cấu hình chính xác cho bản sao lưu mà không bỏ qua các phần dữ liệu quan trọng, đồng thời bạn cũng đang tiến hành tái tạo mọi dữ liệu đã lưu vào bộ nhớ đệm mà bạn đã loại trừ khỏi quá trình sao lưu. Lặp lại các bước từ 1 đến 3 cho mỗi lần lặp lại quy trình kiểm thử.

Kiểm thử tính năng chuyển D2D

Cách toàn diện nhất để kiểm thử tính năng chuyển D2D là chuyển toàn bộ nội dung trên điện thoại sang một thiết bị mới đã đặt lại về trạng thái ban đầu và xác thực rằng tính năng đó hoạt động bình thường. Tuy nhiên, việc này có thể gây bất tiện và tốn thời gian nếu bạn cần lặp lại quá trình này nhiều lần. Các bước sau cho bạn biết cách mô phỏng quá trình chuyển bằng một thiết bị duy nhất mà không cần phải đặt đi đặt lại thiết bị về trạng thái ban đầu.

Chuẩn bị thiết bị của bạn để kiểm thử D2D

Để kiểm thử tính năng chuyển D2D trên một thiết bị, hãy chuẩn bị như sau:

  1. Thiết bị của bạn phải chạy Android 12 (API cấp 31) trở lên.
  2. Để kiểm thử phiên bản D2D mới nhất, hãy nhắm đến Android 12 (API cấp 31) trở lên trong ứng dụng của bạn.
  3. Tạo tập lệnh test_d2d.sh như sau để cho phép lặp lại quy trình kiểm thử:
#!/bin/bash -eu
: "${1?"Usage: $0 package name"}"

# Initialize and create a backup
adb shell bmgr enable true
adb shell settings put secure backup_enable_d2d_test_mode 1
adb shell bmgr transport com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell bmgr init com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell bmgr list transports | grep -q -F "  * com.google.android.gms/.backup.migrate.service.D2dTransport" || (echo "Failed to select and initialize backup transport"; exit 1)
adb shell bmgr backupnow "$1" | grep -F "Package $1 with result: Success" || (echo "Backup failed"; exit 1)

# Uninstall and reinstall the app to clear the data and trigger a restore
apk_path_list=$(adb shell pm path "$1")
OIFS=$IFS
IFS=$'\n'
apk_number=0
for apk_line in $apk_path_list
do
    (( ++apk_number ))
    apk_path=${apk_line:8:1000}
    adb pull "$apk_path" "myapk${apk_number}.apk"
done
IFS=$OIFS
adb shell pm uninstall --user 0 "$1"
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
apks=$(seq -f 'myapk%.f.apk' 1 $apk_number)
adb install-multiple -t --user 0 $apks

# Clean up
adb shell bmgr init com.google.android.gms/.backup.migrate.service.D2dTransport
adb shell settings put secure backup_enable_d2d_test_mode 0
adb shell bmgr transport com.google.android.gms/.backup.BackupTransportService
rm $apks

echo "Done"

Các bước kiểm thử

  1. Cài đặt ứng dụng bạn muốn kiểm thử trên thiết bị.
  2. Mở ứng dụng, đăng nhập và sửa đổi chế độ cài đặt của ứng dụng.
  3. Chạy tập lệnh trên thiết bị, truyền tên gói vào, chẳng hạn như test_d2d.sh com.example.myapp.
  4. Khi tập lệnh hoàn tất, hãy mở ứng dụng trên thiết bị và xác thực rằng tập lệnh đó hoạt động đúng cách và mọi dữ liệu đều được giữ lại.

Bạn không muốn người dùng của mình phải đăng nhập, đồng thời cần đảm bảo tất cả các chế độ cài đặt, tiến trình và dữ liệu ứng dụng của họ phải giống như trước khi chạy tập lệnh. Nếu kết quả kiểm thử không đáp ứng các tiêu chí này, hãy đảm bảo rằng bạn đã định cấu hình chính xác cho bản sao lưu mà không bỏ qua các phần dữ liệu quan trọng, đồng thời bạn cũng đang tiến hành tái tạo mọi dữ liệu đã lưu vào bộ nhớ đệm mà bạn đã loại trừ khỏi quá trình chuyển. Lặp lại các bước từ 2 đến 4 cho mỗi lần lặp lại quy trình kiểm thử.

Khắc phục sự cố sao lưu và khôi phụ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 di chuyển

Các thông báo sau trong Logcat cho biết ứng dụng của bạn đã vượt quá hạn mức di chuyển:

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

--- or ---

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

Hãy giảm lượng dữ liệu sao lưu rồi thử lại. Ví dụ: xác minh rằng bạn chỉ đang 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 trong bộ nhớ đệm không được sao lưu.

Không sao lưu được toàn bộ

Thông báo sau trong Logcat cho biết không thể tiến hành sao lưu toàn bộ vì chưa có hoạt động sao lưu khoá-giá trị nào diễn ra trên thiết bị:

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

Hãy kích hoạt tính năng sao lưu khoá-giá trị bằng lệnh bmgr run rồi thử lại.

Hết thời gian chờ tác nhân

Thông báo sau trong Logcat cho biết ứng dụng của bạn mất hơn 10 giây để khởi chạy bản sao lưu:

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

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 multidex mà không có ProGuard.

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

Các thông báo sau đây trong Logcat cho biết quá trình sao lưu bị tạm dừng vì tập dữ liệu sao lưu chưa được khởi chạy:

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

Hãy chạy trình quản lý sao lưu bằng lệnh adb shell bmgr run rồi thử sao lưu lại.

Các phương thức của ứ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 khoá-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.

Không có dữ liệu để sao lưu

Các thông báo sau trong Logcat cho biết ứng dụng của bạn không có dữ liệu để sao lưu:

I Backup  : [FullBackupSession] Package com.your.app.package doesn't have any backup data.

--- or ---

I Backup  : [D2dTransport] Package com.your.app.package doesn't have any backup data.

Nếu bạn tự mình triển khai BackupAgent, điều này có nghĩa là bạn chưa thêm bất kỳ dữ liệu hoặc tệp nào vào bản sao lưu.