Yedekleme ve geri yüklemeyi test etme

Bu sayfada, uygulamanız için bulut yedeklemelerini ve cihazdan cihaza (D2D) aktarım işlemini nasıl test edeceğiniz gösterilmektedir. Kullanıcılarınızın yeni bir cihazda uygulamanızı kullanmaya devam edebilmesini sağlamak için uygulamanızın her ana sürümünde bu ikisini de test etmeniz önemlidir. Yedekleme ve aktarım benzer olsa da Android 12 (API düzeyi 31) ve sonraki sürümlerde önemli farklar vardır.

Bu kılavuzda, geliştirme döngüsü boyunca hem bulut yedekleme ve geri yükleme hem de D2D aktarımını nasıl verimli bir şekilde test edebileceğiniz gösterilmektedir.

Yedeklerin test edilmesi

Bu bölümde, Android yedekleme çerçevesinin çeşitli bölümleri ve Otomatik Yedekleme ile anahtar/değer çifti yedeklemesini destekleyen uygulamalarla nasıl etkileşimde bulundukları açıklanmaktadır. Uygulama geliştirme aşamasında, çerçevenin iç işleyişinin çoğu soyutlandığı için bu bilgiyi bilmeniz gerekmez. Ancak test aşamasında bu kavramların anlaşılması daha önemli hale gelir.

Aşağıdaki şemada, bulutta yedekleme ve geri yükleme sırasında nasıl veri akışı gösterilmektedir. Test amacıyla, aynı cihaz bulutta yedekleme ve geri yükleme için kullanılabilir.

Yedekleme Çerçevesi Veri Akışı

Aşağıdaki şemada, D2D aktarımı sırasında veri akışı nasıl gösterilmektedir:

Aktarım Çerçevesi Veri Akışı

D2D testi için, bulutta yedekleme ve geri yükleme testinden farklı olarak bir kaynak cihaz ve bir hedef cihaz gerekir.

Yedekleme Yöneticisi Hizmeti, yedekleme ve geri yükleme işlemlerini düzenleyip başlatan bir Android sistem hizmetidir. Hizmete Backup Manager API üzerinden erişilebilir.

Yedekleme işlemi sırasında hizmet, uygulamanızı yedekleme verileri için sorgular, ardından yedek aktarıma aktarır ve daha sonra verileri buluta arşivler. Geri yükleme işlemi sırasında, Yedekleme Yöneticisi Hizmeti yedek aktarımdan yedek verileri alır ve verileri cihaza geri yükler. D2D aktarımlarında, Yedekleme Yöneticisi Hizmeti, uygulamanızı yedek veriler için sorgular ve doğrudan yeni cihazdaki Yedekleme Yöneticisi Hizmeti'ne iletir. Böylece, veriler uygulamanıza yüklenir.

Yedek Aktarımlar, uygulama verilerinizi depolamak ve almaktan sorumlu Android bileşenleridir. Android destekli bir cihazda sıfır veya daha fazla yedek aktarım yapılabilir ancak bu aktarımlardan yalnızca biri etkin olarak işaretlenebilir. Kullanılabilir yedek taşımalar, cihaz üreticileri ve servis sağlayıcılar tarafından yapılan özelleştirmeler nedeniyle cihazdan cihaza farklılık gösterir, ancak Google Play özellikli çoğu cihaz aşağıdaki aktarımlarla birlikte gönderilir:

  • GMS Transport: Google Mobil Hizmetleri'nin bir parçası olarak çoğu cihazda bulunan etkin bulut yedek aktarımı. Bu taşıma işlemi, verileri Android Yedekleme Hizmeti'nde depolar.
  • D2D Aktarımı: Bu aktarım, verileri doğrudan bir cihazdan diğerine aktarmak için D2D taşımada kullanılır.

Araçlar

Yedekleme ve geri yükleme işlemlerinizi test etmek için aşağıdaki araçlar hakkında biraz bilgi sahibi olmanız gerekir.

  • adb: Cihazda veya emülatörde komutları çalıştırmanızı sağlar.
  • bmgr: Çeşitli yedekleme ve geri yükleme işlemlerini gerçekleştirmek için kullanılır.
  • logcat: Yedekleme ve geri yükleme işlemlerinin çıkışını gösterir.

Bulut yedeklemesini test et

Bulut yedekleme ve geri yükleme işlemleri, bu bölümdeki adımlar uygulanarak tek bir cihaz kullanılarak gerçekleştirilebilir.

Cihazınızı veya emülatörünüzü bulutta yedeklemeler için hazırlayın

Aşağıdaki kontrol listesini inceleyerek cihazınızı veya emülatörünüzü yedekleme testi için hazırlayın:

  1. Otomatik Yedekleme için, Android 6.0 (API düzeyi 23) veya sonraki sürümleri çalıştıran bir cihaz ya da emülatör kullandığınızdan emin olun.
  2. Anahtar/değer çifti yedeklemesi için Android 2.2 (API düzeyi 8) veya sonraki sürümleri çalıştıran bir cihaz ya da emülatör kullandığınızdan emin olun.
  3. Bulut yedeklemesini test etmek için internet erişiminizin olması gerekir.
  4. Cihaza bir Google hesabıyla giriş yapın ve bu hesabı Ayarlar -> Google -> Yedekleme bölümünde yedek hesap olarak ayarlayın.

Bulut yedeklemesini test etmek için, bulut yedeklemesini tetikleyin, ardından uygulamayı kaldırıp yeniden yükleyin. Bu adımları tekrarlanabilir hale getirmek için aşağıdaki komut dosyasını (test_cloud_backup.sh) kullanabilirsiniz. Bu komut; uygulamanızı yedekler, APK'yı yerel olarak indirir, yüklemesini kaldırır ve APK'yı yeniden yükler:

#!/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"

Test adımları

  1. Uygulamanızı açın, giriş yapın ve tüm ayarları değiştirin.
  2. Komut dosyasını, paket adınızı ileterek çalıştırın (ör. test_cloud_backup.sh com.example.myapp)
  3. Uygulamayı yeniden açın ve tüm veriler korunarak düzgün çalıştığını doğrulayın.

Kullanıcılarınızın giriş yapmasını istemezsiniz. Tüm ayarları, ilerleme durumu ve uygulama verileri önceki gibi olmalıdır. Test sonuçlarınız bu kriterleri karşılamıyorsa yedekleri, önemli verileri çıkarmadan doğru şekilde yapılandırdığınızdan ve yedekten hariç tuttuğunuz önbelleğe alınmış verilerin yeniden oluşturulması işlemini yönettiğinizden emin olun. Her test yinelemesi için 1'den 3'e kadar olan adımları tekrarlayın.

D2D aktarımını test et

D2D aktarımını test etmenin en kapsamlı yolu, telefonunuzun tüm içeriklerini fabrika ayarlarına sıfırlanmış yeni bir cihaza aktarmak ve cihazın düzgün şekilde çalıştığını doğrulamaktır. Ancak bu işlem, işlemi birden çok kez tekrarlamanız gerekiyorsa kullanışsız ve zaman alıcı olabilir. Bu adımlarda, tek bir cihazda tekrar tekrar fabrika ayarlarına sıfırlama işlemi gerçekleştirmeden aktarım simülasyonunun nasıl yapılacağı gösterilmektedir.

Cihazınızı D2D testi için hazırlayın

D2D aktarımını tek bir cihazda test etmek için cihazı aşağıdaki gibi hazırlayın:

  1. Cihazınız, Android 12 (API düzeyi 31) veya sonraki bir sürümü çalıştırıyor olmalıdır.
  2. D2D'nin en son sürümünü test etmek için uygulamanızda Android 12 (API düzeyi 31) veya sonraki bir sürümü hedefleyin.
  3. Testin tekrarlanmasını desteklemek için test_d2d.sh adlı komut dosyasını oluşturun:
#!/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"

Test adımları

  1. Test etmek istediğiniz uygulamayı cihaza yükleyin.
  2. Uygulamanızı açın, giriş yapın ve uygulamanızın ayarlarını değiştirin.
  3. Komut dosyasını, paket adınızı ileterek cihazınızda çalıştırın (ör. test_d2d.sh com.example.myapp).
  4. Komut dosyası tamamlandığında uygulamayı cihazda açın ve uygulamanın düzgün çalıştığını, tüm veriler saklandığını doğrulayın.

Kullanıcılarınızın giriş yapmasını istemezsiniz ve tüm ayarları, ilerleme durumu ve uygulama verileri komut dosyasını çalıştırmadan önce olduğu gibi görünür olmalıdır. Test sonuçlarınız bu ölçütleri karşılamıyorsa aktarımı önemli verileri çıkarmadan doğru bir şekilde yapılandırdığınızdan ve aktarımdan hariç tuttuğunuz önbelleğe alınmış verilerin yeniden oluşturulması işlemini de yönettiğinizden emin olun. Her test yinelemesi için 2-4 arasındaki adımları tekrarlayın.

Yedekleme ve geri yükleme sorunlarını giderme

Bu bölüm, bazı yaygın sorunları gidermenize yardımcı olur.

Taşıma kotası aşıldı

Logcat'teki aşağıdaki mesajlar, uygulamanızın aktarım kotasını aştığını gösterir:

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

--- or ---

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

Yedekleme veri miktarını azaltıp tekrar deneyin. Örneğin, yalnızca uygulamanızın önbellek dizininde verileri önbelleğe aldığınızı doğrulayın. Önbellek dizini yedeklemelere dahil edilmez.

Tam yedekleme mümkün değil

Logcat'teki aşağıdaki mesaj, cihazda henüz anahtar/değer çifti yedekleme işlemi gerçekleşmediği için tam yedekleme işleminin başarısız olduğunu belirtir:

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

bmgr run komutuyla anahtar/değer çifti yedeğini tetikleyip tekrar deneyin.

Temsilci beklenirken zaman aşımı

Logcat'te yer alan aşağıdaki mesaj, uygulamanızın yedekleme için başlatılmasının 10 saniyeden uzun sürdüğünü gösterir:

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

Günlük çıktısındaki zaman damgası farkına dikkat edin. Bu hata genellikle uygulamanız ProGuard'sız bir çokludex yapılandırması kullandığında ortaya çıkar.

Başlatılmamış yedekleme hesabı

Logcat'te yer alan aşağıdaki mesajlar, yedek veri kümesi başlatılmadığı için yedeklemenin durdurulduğunu gösterir:

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

Yedek yöneticiyi adb shell bmgr run komutuyla çalıştırın ve yedekleme işlemini tekrar gerçekleştirmeyi deneyin.

Çağrılmayan uygulama yöntemleri

Otomatik Yedekleme, uygulamanızı temel bir Application sınıfıyla başlattığından uygulamanızın kurulum yöntemleri çağrılmayabilir. Otomatik Yedekleme, uygulama etkinliklerinizi de başlatmaz. Bu nedenle, uygulamanız bir etkinlik içinde kurulum yaparsa hatalarla karşılaşabilirsiniz. Daha fazla bilgi için BackupAgent'ı uygulama makalesini okuyun.

Buna karşılık anahtar/değer çifti yedeklemesi, uygulamanızı uygulama manifest dosyanızda bildirdiğiniz herhangi bir Application alt sınıfıyla başlatır.

Yedeklenecek veri yok

Logcat'teki aşağıdaki mesajlar, uygulamanızda yedeklenecek veri olmadığını gösterir:

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.

Kendi BackupAgent ayarınızı uyguladıysanız bu durum büyük olasılıkla yedeklemeye veri veya dosya eklemediğiniz anlamına gelir.