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 gösterilmektedir. Kullanıcılarınızın uygulamanızı yeni bir cihazda kullanmaya devam edebilmesini sağlamak için bu iki işlemi de uygulamanızın her büyük sürümünde test etmeniz önemlidir. Yedekleme ve aktarma benzer olsa da Android 12 (API seviyesi 31) ve sonraki sürümlerde bu iki işlem arasında önemli farklar vardır. En önemlisi, aktarma işleminin veri boyutu sınırı 2 GB iken bulut yedeklemenin 25 MB olmasıdır.

Bu kılavuzda, geliştirme döngüsü boyunca hem bulut 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 ile anahtar/değer yedeklemeyi destekleyen uygulamalarla nasıl etkileşimde bulunduğ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. Test amacıyla, bulut yedekleme ve geri yükleme için aynı cihaz kullanılabilir.

Yedekleme Çerçevesi Veri Akışı

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

Aktarım Çerçevesi 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 üzerinden erişilebilir.

Yedekleme işlemi sırasında hizmet, yedekleme verileri için uygulamanızı sorgular ve ardından verileri yedekleme aktarımına teslim eder. Bu aktarım da verileri bulutta arşivler. Geri yükleme işlemi sırasında Yedekleme Yöneticisi Hizmeti, yedekleme verilerini yedekleme aktarımından 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 bu aktarımlardan yalnızca biri etkin olarak işaretlenebilir. Cihaz üreticileri ve servis sağlayıcılar tarafından yapılan özelleştirmeler nedeniyle, kullanılabilen yedekleme aktarımları cihazdan cihaza farklılık gösterir. Ancak Google Play'in etkin olduğu çoğu cihaz aşağıdaki aktarımlarla birlikte gönderilir:

  • 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 Yedekleme Hizmeti'nde 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 yedeklemeyi test etme

Buluta 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ü 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 düzeyi 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 bir 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, giriş yapın ve tüm ayarları değiştirin.
  2. Paket adınızı ileterek komut dosyasını çalıştırın. Örneğin: 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 eskisi gibi olmalıdır. Test sonuçlarınız bu ölçütleri karşılamıyorsa yedeklemeleri önemli veri parçalarını atlamadan doğru şekilde yapılandırdığınızdan ve yedeklemeye dahil etmediğiniz önbelleğe alınmış verilerin yeniden oluşturulmasını da 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

Cihazdan cihaza aktarımı test etmenin en kapsamlı yolu, telefonunuzdaki tüm içerikleri 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, birden fazla kez tekrarlanması gerektiğinde rahatsız edici ve zaman alıcı olabilir. Bu adımlar, cihazda tekrar tekrar fabrika ayarlarına sıfırlama işlemi yapmadan tek bir cihazla aktarımı nasıl simüle edeceğinizi gösterir.

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 son sürümünü test etmek için uygulamanızda Android 12'yi (API düzeyi 31) veya sonraki sürümleri 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, giriş yapı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 cihazda uygulamayı açın ve tüm veriler korunarak doğru şekilde çalıştığını doğrulayın.

Kullanıcılarınızın giriş yapması 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ı önemli veri parçalarını atlamadan doğru şekilde yapılandırdığı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 yapılmadığı 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ğradı

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 çoklu dex 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 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 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 herhangi bir Application alt sınıfla 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 yedekleme çözümünüzü uyguladıysanız BackupAgent bu, büyük olasılıkla yedeğe herhangi bir veri veya dosya eklemediğiniz anlamına gelir.