Menguji pencadangan dan pemulihan

Halaman ini menunjukkan cara menguji pencadangan cloud dan proses transfer perangkat ke perangkat (D2D) untuk aplikasi Anda. Penting untuk menguji keduanya dengan setiap rilis utama aplikasi untuk membantu memastikan bahwa pengguna dapat terus menggunakan aplikasi di perangkat baru. Meskipun pencadangan dan transfer serupa, ada perbedaan penting antara keduanya di Android 12 (API level 31) dan yang lebih tinggi—terutama transfer tersebut memiliki batas ukuran data yang jauh lebih besar, yaitu 2 GB, dibandingkan dengan 25 MB untuk pencadangan cloud.

Panduan ini menunjukkan cara menguji pencadangan dan pemulihan cloud serta transfer D2D secara efisien di sepanjang siklus pengembangan.

Cara kerja pengujian pencadangan

Bagian ini menjelaskan berbagai bagian dalam framework pencadangan Android dan cara berinteraksi dengan aplikasi yang mendukung Auto Backup dan pencadangan nilai kunci. Selama fase pengembangan aplikasi, sebagian besar pekerjaan internal framework akan diabstraksi, sehingga Anda tidak perlu mengetahui informasi ini. Namun, selama fase pengujian, pemahaman tentang konsep ini menjadi lebih penting.

Diagram berikut mengilustrasikan alur data selama pencadangan dan pemulihan cloud. Untuk tujuan pengujian, perangkat yang sama dapat digunakan untuk pencadangan dan pemulihan cloud.

Aliran Data Framework Pencadangan

Diagram berikut mengilustrasikan bagaimana data mengalir selama transfer D2D:

Aliran Data Framework Transfer

Tidak seperti pengujian pencadangan dan pemulihan cloud, pengujian D2D memerlukan perangkat sumber dan perangkat target untuk menyalin.

Backup Manager Service adalah layanan sistem Android yang mengatur dan memulai operasi pencadangan dan pemulihan. Layanan dapat diakses melalui Backup Manager API.

Selama operasi pencadangan, layanan tersebut akan mengkueri aplikasi Anda untuk pencadangan data, lalu meneruskannya ke backup transport, yang kemudian mengarsipkan data tersebut ke cloud. Selama operasi pemulihan, Layanan Backup Manager akan mengambil data cadangan dari backup transport dan memulihkan data tersebut ke perangkat. Untuk transfer D2D, Backup Manager Service mengkueri aplikasi Anda untuk mencadangkan data dan meneruskannya langsung ke Layanan Backup Manager di perangkat baru, yang memuatnya ke aplikasi Anda.

Backup Transport adalah komponen Android yang bertanggung jawab untuk menyimpan dan mengambil data aplikasi. Perangkat yang didukung Android dapat memiliki nol atau beberapa transpor cadangan, tetapi hanya satu dari transport tersebut yang dapat ditandai sebagai aktif. Transportasi cadangan yang tersedia berbeda di setiap perangkat, karena penyesuaian oleh produsen perangkat dan penyedia layanan, tetapi sebagian besar perangkat berkemampuan Google Play dikirim dengan transport berikut:

  • GMS Transport: Transportasi cadangan cloud aktif di sebagian besar perangkat, yang merupakan bagian dari Layanan Seluler Google. Transport ini menyimpan data di Android Backup Service.
  • Transport D2D: transport ini digunakan dalam migrasi D2D untuk mentransfer data langsung dari satu perangkat ke perangkat lainnya.

Alat

Untuk menguji operasi pencadangan dan pemulihan, Anda perlu mengetahui sedikit tentang alat berikut.

  • adb: untuk menjalankan perintah di perangkat atau emulator.
  • bmgr: untuk menjalankan berbagai operasi pencadangan dan pemulihan.
  • logcat: untuk melihat output operasi pencadangan dan pemulihan.

Menguji pencadangan cloud

Pencadangan dan pemulihan cloud dapat dilakukan menggunakan satu perangkat dengan mengikuti langkah-langkah di bagian ini.

Menyiapkan perangkat atau emulator untuk pencadangan cloud

Siapkan perangkat atau emulator untuk pengujian pencadangan dengan mengikuti checklist berikut:

  1. Untuk Auto Backup, pastikan Anda menggunakan perangkat atau emulator yang menjalankan Android 6.0 (API level 23) atau yang lebih tinggi.
  2. Untuk pencadangan nilai kunci, pastikan Anda menggunakan perangkat atau emulator yang menjalankan Android 2.2 (API level 8) atau yang lebih tinggi.
  3. Anda harus memiliki akses internet untuk menguji pencadangan cloud.
  4. Login ke perangkat dengan Akun Google dan setel sebagai akun pencadangan di Setelan -> Google -> Pencadangan.

Untuk menguji pencadangan cloud, picu pencadangan cloud, lalu uninstal dan instal ulang aplikasi. Agar langkah ini dapat diulang, Anda dapat menggunakan skrip berikut, test_cloud_backup.sh, yang mencadangkan aplikasi, mendownload APK secara lokal, meng-uninstalnya, dan menginstal ulang 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"

Langkah pengujian

  1. Buka aplikasi, login, dan ubah semua setelan.
  2. Jalankan skrip, dengan meneruskan nama paket Anda, seperti test_cloud_backup.sh com.example.myapp
  3. Buka kembali aplikasi dan validasi bahwa aplikasi berfungsi dengan benar, dengan semua data dipertahankan.

Anda tidak ingin pengguna perlu login, dan semua setelan, progres, serta data aplikasi mereka harus seperti sebelumnya. Jika hasil pengujian tidak memenuhi kriteria ini, pastikan Anda telah mengonfigurasi pencadangan dengan benar, tanpa menghapus bagian data yang penting, dan Anda juga menangani pembuatan ulang data yang disimpan dalam cache yang dikecualikan dari cadangan. Ulangi langkah 1-3 untuk setiap iterasi pengujian.

Menguji transfer D2D

Cara paling komprehensif untuk menguji transfer D2D adalah dengan mentransfer seluruh konten ponsel ke perangkat baru yang direset ke setelan pabrik dan memvalidasi bahwa perangkat tersebut berfungsi dengan benar. Namun, cara ini mungkin merepotkan dan menghabiskan waktu Anda jika Anda perlu mengulangi proses beberapa kali. Langkah-langkah ini menunjukkan cara menyimulasikan transfer dengan satu perangkat tanpa berulang kali melakukan reset ke setelan pabrik pada perangkat.

Menyiapkan perangkat untuk pengujian D2D

Untuk menguji transfer D2D pada satu perangkat, siapkan sebagai berikut:

  1. Perangkat Anda harus menjalankan Android 12 (API level 31) atau yang lebih baru.
  2. Untuk menguji D2D versi terbaru, targetkan Android 12 (API level 31) atau yang lebih baru di aplikasi Anda.
  3. Buat skrip berikut, test_d2d.sh, untuk mendukung pengulangan pengujian:
#!/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"

Langkah pengujian

  1. Instal aplikasi yang ingin diuji di perangkat.
  2. Buka aplikasi, login, dan ubah setelan aplikasi.
  3. Jalankan skrip di perangkat, dengan meneruskan nama paket Anda, seperti test_d2d.sh com.example.myapp.
  4. Setelah skrip selesai, buka aplikasi di perangkat dan validasi bahwa skrip berfungsi dengan benar, dengan semua data dipertahankan.

Anda tidak ingin pengguna perlu login, dan semua setelan, progres dan data aplikasi mereka harus muncul seperti sebelum menjalankan skrip. Jika hasil pengujian tidak memenuhi kriteria ini, pastikan Anda telah mengonfigurasi transfer dengan benar, tanpa menghilangkan bagian penting data, dan Anda juga menangani pembuatan ulang data yang disimpan dalam cache yang telah dikecualikan dari transfer. Ulangi langkah 2-4 untuk setiap iterasi pengujian.

Memecahkan masalah pencadangan dan pemulihan

Bagian ini membantu Anda memecahkan beberapa masalah umum.

Kuota transportasi terlampaui

Pesan berikut di Logcat menunjukkan bahwa aplikasi Anda telah melampaui kuota transpor:

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

--- or ---

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

Kurangi jumlah data pencadangan, lalu coba lagi. Misalnya, pastikan Anda hanya menyimpan data ke dalam cache dalam direktori cache aplikasi. Direktori cache tersebut tidak disertakan dalam cadangan.

Pencadangan penuh tidak dimungkinkan

Pesan di Logcat berikut menunjukkan bahwa operasi pencadangan penuh gagal karena belum ada operasi pencadangan nilai kunci yang terjadi di perangkat:

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

Picu pencadangan nilai kunci dengan perintah bmgr run, lalu coba lagi.

Waktu tunggu habis menunggu agen

Pesan berikut di Logcat menunjukkan bahwa aplikasi Anda memerlukan waktu lebih dari 10 detik untuk diluncurkan untuk pencadangan:

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

Perhatikan perbedaan stempel waktu dalam output log. Error ini biasanya terjadi saat aplikasi Anda menggunakan konfigurasi multidex tanpa ProGuard.

Akun pencadangan tidak diinisialisasi

Pesan berikut di Logcat menunjukkan bahwa pencadangan dihentikan karena set data pencadangan tidak diinisialisasi:

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

Jalankan pengelola pencadangan dengan perintah adb shell bmgr run, lalu coba lakukan pencadangan lagi.

Metode aplikasi tidak dipanggil

Karena Auto Backup meluncurkan aplikasi Anda dengan class dasar Application, metode penyiapan aplikasi Anda mungkin tidak dipanggil. Auto Backup juga tidak meluncurkan aktivitas aplikasi Anda, sehingga Anda mungkin melihat error jika aplikasi disiapkan dalam aktivitas. Untuk mempelajari lebih lanjut, baca Mengimplementasikan BackupAgent.

Sebaliknya, pencadangan nilai kunci meluncurkan aplikasi Anda dengan subclass Application apa pun yang Anda deklarasikan dalam file manifes aplikasi.

Tidak ada data untuk dicadangkan

Pesan berikut di Logcat menunjukkan bahwa aplikasi Anda tidak memiliki data untuk dicadangkan:

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.

Jika Anda mengimplementasikan BackupAgent Anda sendiri, kemungkinan Anda belum menambahkan data atau file apa pun ke cadangan.