Yedekleme ve geri yüklemeyi test etme

Bu sayfada, uygulamanızın bulut yedeklemelerini ve cihazlar arası (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 ikisini de uygulamanızın her büyük sürümünde test etmeniz önemlidir. Hem yedekleme hem de aktarım benzer olsa da Android 12 (API seviyesi 31) ve sonraki sürümlerde ikisi arasında önemli farklılıklar vardır. En önemlisi, aktarım işleminin veri boyutu sınırının, bulut yedeklemenin 25 MB'lık sınırına kıyasla çok daha büyük olan 2 GB olmasıdır.

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

Yedeklerin test edilmesi

Bu bölümde, Android yedekleme çerçevesindeki çeşitli parçalar ve bu parçaların Otomatik Yedekleme ile anahtar/değer yedeklemeyi destekleyen uygulamalarla nasıl etkileşime geçtiği açıklanmaktadır. Uygulama geliştirme aşamasında, çerçevenin iç işleyişinin çoğu soyutlanır. Dolayısıyla bu bilgiyi bilmeniz gerekmez. Ancak test aşamasında bu kavramları anlamak daha da önemli hale gelir.

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ışları

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

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

Bulut yedekleme ve geri yükleme testinden farklı olarak D2D testi için hem kaynak cihaz hem de 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 aracılığıyla erişilebilir.

Hizmet, yedekleme işlemi sırasında yedek veriler için uygulamanızı sorgular ve ardından verileri bulutta arşivleyen yedekleme aktarıcısına iletir. Yedekleme Yöneticisi Hizmeti, geri yükleme işlemi sırasında yedek verileri yedek aktarım aracından alır ve verileri cihaza geri yükler. Cihazlar arası aktarım için Yedekleme Yöneticisi Hizmeti, yedek veriler için uygulamanızı sorgular ve doğrudan yeni cihazdaki Yedekleme Yöneticisi Hizmeti'ne iletir. Bu hizmet de verileri uygulamanıza yükler.

Yedekleme Aktarıcıları, uygulama verilerinizi depolama ve alma işlemlerinden sorumlu Android bileşenleridir. Android işletim sistemli bir cihazda sıfır veya daha fazla yedek aktarım olabilir ancak bu aktarımlardan yalnızca biri etkin olarak işaretlenebilir. Kullanılabilir yedek aktarım araçları, 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 cihazda aşağıdaki aktarım araçları bulunur:

  • GMS Aktarım: Ç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 Aktarımı: 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: Komutları cihazda veya emülatörde ç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 çıktısını görmek için.

Bulut yedeklemesini test etme

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

Cihazınızı veya emülatörünü bulut yedekleri için hazırlama

Aşağıdaki kontrol listesini uygulayarak 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 veya emülatör kullandığınızdan emin olun.
  2. Anahtar/değer yedekleme için Android 2.2 (API seviyesi 8) veya daha yeni bir sürümün yüklü olduğu bir cihaz ya da emülatör kullandığınızdan emin olun.
  3. Bulut yedeklemeyi test etmek için internete erişiminiz olmalıdır.
  4. Cihazda bir Google Hesabı ile oturum açın ve Ayarlar -> Google -> Yedekleme bölümünde bu hesabı yedek hesap olarak ayarlayın.

Bulut yedeklemeyi test etmek için bulut yedeklemeyi tetikleyin, ardından uygulamayı kaldırıp yeniden yükleyin. Bu adımları tekrarlanabilir hale getirmek için uygulamanızı yedekleyen, APK'yı yerel olarak indiren, kaldıran ve yeniden yükleyen aşağıdaki komut dosyasını test_cloud_backup.shkullanabilir:

#!/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ı çalıştırırken paket adınızı (ör. test_cloud_backup.sh com.example.myapp) iletin.
  3. Uygulamayı tekrar açın ve tüm verilerin korunduğundan emin olarak düzgün çalıştığından emin olun.

Kullanıcılarınızın oturum açması gerekmemelidir. Ayrıca tüm ayarları, ilerlemeleri ve uygulama verileri önceki 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 yedekleme kapsamı dışında bıraktığınız önbelleğe alınmış verilerin yeniden oluşturulmasını da sağladığınızdan emin olun. Her test iterasyonu için 1-3 arasındaki adımları tekrarlayın.

D2D aktarımını test etme

D2D aktarımını test etmenin en kapsamlı yolu, telefon içeriğinizin tamamını fabrika ayarlarına sıfırlanmış yeni bir cihaza aktarmak ve cihazın düzgün çalıştığını doğrulamaktır. Ancak bu işlemi birden fazla kez tekrarlamanız gerekirse bu durum can sıkıcı ve zaman alıcı olabilir. Bu adımlarda, tek bir cihazda aktarım işlemini nasıl simüle edebileceğiniz gösterilmektedir. Bu işlem için cihazı tekrar tekrar fabrika ayarlarına sıfırlamanız gerekmez.

Cihazınızı D2D testine hazırlama

D2D aktarımını tek bir cihazda test etmek için aşağıdaki şekilde 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 test_d2d.sh 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. test_d2d.sh com.example.myapp gibi paket adınızı ileterek komut dosyasını cihazınızda çalıştırın.
  4. Komut dosyası tamamlandığında uygulamayı cihazda açın ve tüm verilerin korunduğundan emin olarak düzgün çalıştığından emin olun.

Kullanıcılarınızın giriş yapmasına gerek yoktur ve tüm ayarları, ilerlemeleri ve uygulama verileri komut dosyasının çalıştırılmasının öncesindeki gibi görünmelidir. Test sonuçlarınız bu ölçütleri karşılamıyorsa önemli veri parçalarını atlamadan aktarımı doğru şekilde yapılandırdığınızdan ve aktarımdan hariç tuttuğunuz önbelleğe alınmış verilerin yeniden oluşturulmasını da ele aldığınızdan emin olun. Her test iterasyonu için 2-4 arasındaki adımları tekrarlayın.

Yedekleme ve geri yüklemeyle ilgili sorunları giderme

Bu bölüm, sık karşılaşılan bazı 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 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 yapılamıyor

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 yedeği tetikleyin ve ardından tekrar deneyin.

Temsilciyi beklerken zaman aşımı

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 çıkışındaki zaman damgası farkına dikkat edin. Bu hata genellikle uygulamanız ProGuard olmadan çoklu dex yapılandırması kullandığında ortaya çıkar.

İlk başlatılmamış yedek hesap

Logcat'te yer alan 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

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

Uygulama yöntemleri çağrılmadı

Otomatik Yedekleme, uygulamanızı Application temel sınıfıyla başlattığından uygulamanızın kurulum yöntemleri çağrılmayabilir. Otomatik Yedekleme, uygulamanızın etkinliklerinden hiçbirini de başlatmaz. Bu nedenle, uygulamanız bir etkinlikte kurulum yaparsa hatalarla karşılaşabilirsiniz. Daha fazla bilgi edinmek için BackupAgent'ı Uygulama bölümünü okuyun.

Anahtar/değer yedeği ise uygulamanızı, uygulama manifest dosyanızda beyan ettiğiniz Application alt sınıfla 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 uygulamanızı uyguladıysanız bu, büyük olasılıkla yedeklemeye veri veya dosya eklemediğiniz anlamına gelir.