Menguji pencadangan dan pemulihan

Halaman ini menunjukkan cara menguji pencadangan cloud dan proses transfer device-to-device (D2D) untuk aplikasi Anda. Kedua hal tersebut perlu diuji pada setiap rilis utama aplikasi Anda 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 (level API 31) dan yang lebih tinggi. Terutama bahwa 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 selama siklus pengembangan.

Cara kerja pengujian pencadangan

Bagian ini menjelaskan berbagai bagian dalam framework pencadangan Android dan cara interaksinya dengan aplikasi yang mendukung Pencadangan Otomatis dan pencadangan nilai kunci. Selama fase pengembangan aplikasi, sebagian besar tugas internal framework akan dihilangkan, sehingga Anda tidak perlu mengetahui informasi ini. Namun, selama tahap pengujian, pemahaman terhadap konsep-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 disalin dari dan ke.

Backup Manager Service adalah layanan sistem Android yang mengatur dan memulai operasi pencadangan dan pemulihan. Layanan ini 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 ke cloud. Selama operasi pemulihan, Backup Manager Service mengambil data cadangan dari backup transport dan memulihkan data tersebut ke perangkat. Untuk transfer D2D, Backup Manager Service mengkueri aplikasi Anda untuk data cadangan dan meneruskannya langsung ke Backup Manager Service di perangkat baru, yang memuat data tersebut ke aplikasi Anda.

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

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

Alat

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

  • adb: untuk menjalankan perintah pada 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 Anda untuk melakukan pengujian pencadangan dengan memastikan checklist berikut:

  1. Untuk Pencadangan Otomatis, pastikan Anda menggunakan perangkat atau emulator yang menjalankan Android 6.0 (level API 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 tetapkan sebagai akun cadangan di Setelan -> Google -> Pencadangan.

Untuk menguji pencadangan cloud, picu pencadangan cloud, lalu uninstal dan instal ulang aplikasi. Agar langkah-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 harus login, dan semua setelan, progres, dan data aplikasi mereka harus seperti sebelumnya. Jika hasil pengujian Anda tidak memenuhi kriteria ini, pastikan Anda telah mengonfigurasi cadangan dengan benar, tanpa menghapus bagian data yang penting, dan Anda juga menangani pembuatan ulang data yang di-cache yang Anda kecualikan 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 Anda ke perangkat baru yang direset ke setelan pabrik dan memvalidasi bahwa perangkat tersebut berfungsi dengan benar. Namun, hal ini dapat merepotkan dan memakan waktu 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 di satu perangkat, siapkan sebagai berikut:

  1. Perangkat Anda harus menjalankan Android 12 (API level 31) atau yang lebih tinggi.
  2. Untuk menguji D2D versi terbaru, targetkan Android 12 (API level 31) atau yang lebih tinggi 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 Anda, dengan meneruskan nama paket, seperti test_d2d.sh com.example.myapp.
  4. Setelah skrip selesai, buka aplikasi di perangkat dan validasi bahwa aplikasi berfungsi dengan benar, dengan semua data dipertahankan.

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

Memecahkan masalah pencadangan dan pemulihan

Bagian ini membantu Anda memecahkan masalah umum.

Kuota transport 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 dan coba lagi. Misalnya, verifikasi bahwa Anda hanya menyimpan ke cache data dalam direktori cache aplikasi. Direktori cache tersebut tidak disertakan dalam pencadangan.

Pencadangan penuh tidak dimungkinkan

Pesan berikut di Logcat 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 habis menunggu agen

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

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 pencadangan manager 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 Anda disiapkan di aktivitas. Untuk mempelajari lebih lanjut, baca Menerapkan BackupAgent.

Sebaliknya, pencadangan nilai kunci meluncurkan aplikasi Anda dengan subclass Application mana 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 menerapkan BackupAgent sendiri, hal ini mungkin berarti Anda belum menambahkan data atau file apa pun ke pencadangan.