Uji pencadangan dan pemulihan

Halaman ini menunjukkan cara menguji pencadangan cloud dan proses transfer dari perangkat ke perangkat (D2D) untuk aplikasi Anda. Penting untuk menguji keduanya dengan setiap rilis utama aplikasi Anda untuk membantu memastikan pengguna dapat terus menggunakan aplikasi Anda 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 memiliki batas ukuran data yang jauh lebih besar, yaitu 2 GB, dibandingkan dengan 2 MB untuk pencadangan cloud.

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

Cara kerja pengujian cadangan

Bagian ini menjelaskan berbagai bagian dalam framework pencadangan Android dan cara berinteraksi dengan aplikasi yang mendukung Pencadangan Otomatis dan pencadangan nilai kunci. Selama fase pengembangan aplikasi, sebagian besar tugas internal framework akan hilang, 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:

Diagram yang menunjukkan data mengalir dari aplikasi ke Layanan Pengelola Pencadangan, lalu ke backup transport, dan terakhir ke penyimpanan cloud.
Gambar 1: Alur data pencadangan dan pemulihan cloud.

Diagram berikut menggambarkan alur data selama transfer D2D:

Diagram yang menunjukkan data mengalir dari aplikasi perangkat sumber ke Layanan Pengelola Cadangan di perangkat sumber, lalu langsung ke Layanan Pengelola Cadangan di perangkat baru, dan akhirnya ke aplikasi di perangkat baru.
Gambar 2: Alur data transfer antarperangkat.

Tidak seperti pengujian pencadangan dan pemulihan cloud, pengujian D2D memerlukan perangkat sumber dan perangkat target untuk menyalin 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 dan meneruskannya ke backup transport, yang mengarsipkan data ke cloud. Selama operasi pemulihan, Backup Manager Service akan mengambil data cadangan dari backup transport dan memulihkan data tersebut ke perangkat. Untuk transfer D2D, Backup Manager Service akan mengkueri aplikasi Anda untuk mendapatkan data cadangan dan meneruskannya langsung ke Backup Manager Service di perangkat baru, yang akan memuatnya 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 yang dapat aktif dalam satu waktu. Backup transport yang tersedia berbeda di setiap perangkat karena penyesuaian oleh produsen perangkat dan penyedia layanan. Sebagian besar perangkat yang kompatibel dengan Google Play dikirimkan dengan transport berikut:

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

Alat

Untuk menguji operasi pencadangan dan pemulihan, Anda perlu mengetahui sedikit tentang alat-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 Anda untuk pencadangan cloud

Siapkan perangkat atau emulator Anda untuk melakukan pengujian pencadangan dengan memastikan 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 key-value, 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 pencadangan di Setelan > Google > Pencadangan.

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

  1. Buka aplikasi Anda, 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, dan data aplikasi mereka harus sama seperti sebelumnya. Jika hasil pengujian Anda tidak memenuhi kriteria ini, pastikan Anda telah mengonfigurasi pencadangan dengan benar, tanpa menghilangkan bagian penting data, dan Anda juga menangani pembuatan ulang data yang di-cache yang Anda kecualikan dari pencadangan. 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 transfer 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 perangkat sebagai berikut:

  1. Perangkat Anda harus menjalankan Android 12 (level API 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-langkah pengujian

  1. Instal aplikasi yang ingin Anda uji di perangkat.
  2. Buka aplikasi Anda, login, dan ubah setelan aplikasi Anda.
  3. Jalankan skrip di perangkat Anda, dengan meneruskan nama paket Anda, 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 perlu 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 menghilangkan bagian data penting, 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 transportasi:

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, verifikasi bahwa Anda hanya menyimpan ke cache data dalam direktori cache aplikasi. Direktori cache tersebut tidak disertakan dalam backup.

Pencadangan penuh tidak dimungkinkan

Pesan berikut di Logcat menunjukkan bahwa operasi pencadangan penuh gagal karena belum ada operasi pencadangan key-value 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 backup 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 key-value meluncurkan aplikasi Anda dengan subclass Application mana pun yang Anda deklarasikan di 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.