Yedekleme ve geri yüklemeyi test etme

Bu sayfada, uygulamanız için bulut yedeklemelerini ve cihazdan cihaza (D2D) aktarım sürecini nasıl test edeceğiniz açıklanmaktadır. Kullanıcılarınızın uygulamanızı yeni bir cihazda kullanmaya devam edebilmesini sağlamak için bu iki işlemi uygulamanızın her büyük sürümünde test etmeniz önemlidir. Yedekleme ve aktarma benzer olsa da Android 12 (API düzeyi 31) ve sonraki sürümlerde bu iki işlem arasında önemli farklar vardır. En önemlisi, aktarma işleminin 2 MB olan bulut yedekleme işlemine kıyasla çok daha yüksek bir veri boyutu sınırı (2 GB) olmasıdır.

Bu kılavuzda, geliştirme döngüsü boyunca hem buluta yedekleme ve geri yükleme hem de cihazdan cihaza aktarma işlemlerini nasıl verimli bir şekilde test edebileceğiniz gösterilmektedir.

Yedeklemeleri test etme

Bu bölümde, Android yedekleme çerçevesindeki çeşitli parçalar ve bunların, otomatik yedekleme ve anahtar/değer yedeklemeyi destekleyen uygulamalarla nasıl etkileşim kurduğu açıklanmaktadır. Uygulama geliştirme aşamasında, çerçevenin iç işleyişinin çoğu soyutlanır. Bu nedenle, bu bilgileri bilmeniz gerekmez. Ancak test aşamasında bu kavramları anlamak daha da önem kazanır.

Aşağıdaki şemada, bulut yedekleme ve geri yükleme sırasında verilerin nasıl aktığı gösterilmektedir:

Verilerin bir uygulamadan Yedekleme Yöneticisi Hizmeti'ne, ardından bir yedekleme aktarımına ve son olarak bulut depolama alanına aktığını gösteren diyagram.
Şekil 1: Bulut yedekleme ve geri yükleme veri akışı.

Aşağıdaki şemada, cihazdan cihaza aktarım sırasında verilerin nasıl aktığı gösterilmektedir:

Verilerin kaynak cihazdaki bir uygulama aracılığıyla kaynak cihazdaki Yedekleme Yöneticisi Hizmeti'ne, ardından doğrudan yeni cihazdaki Yedekleme Yöneticisi Hizmeti'ne ve son olarak yeni cihazdaki uygulamaya aktarıldığını gösteren şema.
Şekil 2: Cihazdan cihaza aktarım veri akışı.

Bulut yedekleme ve geri yükleme testinin aksine, D2D testi için kopyalama yapılacak bir kaynak cihaz ve kopyalanacak bir hedef cihaz gerekir.

Yedekleme Yöneticisi Hizmeti, yedekleme ve geri yükleme işlemlerini düzenleyen ve başlatan bir Android sistem hizmetidir. Hizmete Backup Manager API'si aracılığıyla erişilebilir.

Yedekleme işlemi sırasında hizmet, yedekleme verileri için uygulamanızı sorgular ve verileri bulutta arşivleyen yedekleme aktarımına iletir. Geri yükleme işlemi sırasında Yedekleme Yöneticisi Hizmeti, yedekleme taşıyıcısından yedekleme verilerini alır ve verileri cihaza geri yükler. Cihazdan cihaza aktarımda, Yedekleme Yöneticisi Hizmeti, yedekleme verileri için uygulamanızı sorgular ve bu verileri doğrudan yeni cihazdaki Yedekleme Yöneticisi Hizmeti'ne iletir. Bu hizmet de verileri uygulamanıza yükler.

Yedekleme Aktarımları, uygulama verilerinizi depolamaktan ve almaktan sorumlu Android bileşenleridir. Android destekli bir cihazda sıfır veya daha fazla yedek aktarım olabilir ancak aynı anda yalnızca biri etkin olabilir. Cihaz üreticileri ve servis sağlayıcılar tarafından yapılan özelleştirmeler nedeniyle, kullanılabilir yedekleme aktarımları cihazdan cihaza farklılık gösterir. Google Play'in etkin olduğu çoğu cihazda aşağıdaki taşıma yöntemleri bulunur:

  • GMS Transport: Çoğu cihazda etkin olan bulut yedekleme aktarımıdır ve Google Mobil Hizmetleri'nin bir parçasıdır. Bu aktarım, verileri Android Backup Service'te depolar.
  • D2D Transport: Bu aktarım, verileri doğrudan bir cihazdan diğerine aktarmak için D2D taşıma işleminde 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 komut çalıştırmak için.
  • bmgr: Çeşitli yedekleme ve geri yükleme işlemlerini gerçekleştirmek için.
  • logcat: Yedekleme ve geri yükleme işlemlerinin çıkışını görmek için.

Bulut yedeğini test etme

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

Cihazınızı veya emülatörünüzü bulut yedeklemelerine hazırlama

Aşağıdaki yapılacaklar listesini inceleyerek cihazınızı veya emülatörünüzü yedekleme testine hazırlayın:

  1. Otomatik Yedekleme için Android 6.0 (API düzeyi 23) veya sonraki sürümlerin yüklü olduğu bir cihaz ya da emülatör kullandığınızdan emin olun.
  2. Anahtar-değer yedekleme için Android 2.2 (API seviyesi 8) veya sonraki sürümlerin yüklü olduğu bir cihaz ya da emülatör kullandığınızdan emin olun.
  3. Bulut yedeklemeyi test etmek için internet erişiminiz olmalıdır.
  4. Cihazda Google Hesabı ile oturum açın ve Ayarlar > Google > Yedekleme bölümünde bu hesabı yedekleme hesabı olarak ayarlayın.

Bulut yedeğini test etmek için bulut yedeğini tetikleyin, ardından uygulamayı kaldırıp yeniden yükleyin. Bu adımları tekrarlanabilir hale getirmek için aşağıdaki komut dosyasını kullanabilirsiniz. test_cloud_backup.sh Bu komut dosyası, uygulamanızı yedekler, APK'yı yerel olarak indirir, kaldırır ve 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, oturum açın ve tüm ayarları değiştirin.
  2. Paket adınızı ileterek komut dosyasını çalıştırın (ör. test_cloud_backup.sh com.example.myapp).
  3. Uygulamayı yeniden açın ve tüm veriler korunarak doğru şekilde çalıştığını doğrulayın.

Kullanıcılarınızın oturum açması gerekmemeli ve tüm ayarları, ilerleme durumları ve uygulama verileri önceki gibi olmalıdır. Test sonuçlarınız bu ölçütleri karşılamıyorsa yedeklemeleri doğru şekilde yapılandırdığınızdan, önemli veri parçalarını atlamadığınızdan ve yedeklemeye dahil etmediğiniz tüm önbelleğe alınmış verilerin yeniden oluşturulmasını sağladığınızdan emin olun. Her test yinelemesi için 1-3 arasındaki adımları tekrarlayın.

Cihazdan cihaza aktarımı test etme

D2D aktarımını test etmenin en kapsamlı yolu, telefonunuzun tüm içeriğini fabrika ayarlarına sıfırlanmış yeni bir cihaza aktarmak ve aktarımın doğru şekilde çalıştığını doğrulamaktır. Ancak bu işlem, süreci birden fazla kez tekrarlamanız gerektiğinde rahatsız edici ve zaman alıcı olabilir. Bu adımlarda, cihazda tekrar tekrar fabrika ayarlarına sıfırlama işlemi yapmadan tek bir cihazla nasıl aktarım simülasyonu yapacağınız gösterilmektedir.

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

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

  1. Cihazınızda Android 12 (API düzeyi 31) veya sonraki bir sürüm yüklü olmalıdır.
  2. D2D'nin en yeni sürümünü test etmek için uygulamanızda Android 12'yi (API düzeyi 31) veya daha yeni bir sürümü hedefleyin.
  3. Testin tekrarlanmasını desteklemek için aşağıdaki komut dosyasını (test_d2d.sh) 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, oturum açın ve uygulamanızın ayarlarını değiştirin.
  3. Paket adınızı ileterek komut dosyasını cihazınızda çalıştırın (ör. test_d2d.sh com.example.myapp).
  4. Komut dosyası tamamlandığında uygulamayı cihazda açın ve tüm veriler korunarak doğru şekilde çalıştığını doğrulayın.

Kullanıcılarınızın oturum açması gerekmemeli ve tüm ayarları, ilerleme durumları ve uygulama verileri, komut dosyası çalıştırılmadan önceki gibi görünmelidir. Test sonuçlarınız bu ölçütleri karşılamıyorsa aktarımı doğru şekilde yapılandırdığınızdan, önemli veri parçalarını atlamadığınızdan ve aktarıma dahil etmediğiniz tüm önbelleğe alınmış verilerin yeniden oluşturulmasını da sağladığınızdan emin olun. Her test yinelemesi için 2-4 arasındaki adımları tekrarlayın.

Yedekleme ve geri yükleme ile ilgili sorunları giderme

Bu bölüm, sık karşılaşılan bazı sorunları gidermenize yardımcı olur.

Aktarım 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 verilerinin miktarını azaltıp tekrar deneyin. Örneğin, verileri yalnızca uygulamanızın önbellek dizininde ö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 yedekleme işlemi gerçekleşmediği için tam yedekleme işleminin başarısız olduğunu gösterir:

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

bmgr run komutuyla bir anahtar/değer çifti yedeklemesi tetikleyin ve tekrar deneyin.

Temsilci beklenirken zaman aşımına uğrama

Logcat'teki 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 olmadan multidex yapılandırması kullandığında oluşur.

Başlatılmamış yedekleme hesabı

Logcat'teki aşağıdaki mesajlar, yedekleme 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

Yedekleme yöneticisini adb shell bmgr run komutuyla çalıştırın ve ardından yedeklemeyi tekrar yapmayı deneyin.

Uygulama yöntemleri çağrılmıyor

Otomatik Yedekleme, uygulamanızı Application temel sınıfıyla başlattığı için uygulamanızın kurulum yöntemleri çağrılmayabilir. Otomatik Yedekleme, uygulamanızın etkinliklerini de başlatmaz. Bu nedenle, uygulamanız bir etkinlikte kurulum yapıyorsa hatalar görebilirsiniz. Daha fazla bilgi edinmek için BackupAgent'ı uygulama başlıklı makaleyi inceleyin.

Buna karşılık, anahtar/değer yedekleme, uygulama manifest dosyanızda beyan ettiğiniz tüm Application alt sınıflarıyla uygulamanızı 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'ınızı uyguladıysanız bu durum, yedeklemeye herhangi bir veri veya dosya eklemediğiniz anlamına gelir.