Yedekleme ve geri yüklemeyi test etme

Bu sayfada, uygulamanız için 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 edebilmelerini sağlamak için bunların her ikisini de uygulamanızın her ana sürümünde test etmeniz önemlidir. Yedekleme ve aktarım işlemleri birbirine benzer olsa da Android 12 (API düzeyi 31) ve sonraki sürümlerde iki araç arasında önemli farklar vardır. Bu farklardan en önemlisi, bulut yedeklemede 25 MB'a kıyasla aktarımın 2 GB'lık veri boyutu sınırının çok daha büyük olmasıdır.

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

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. Bu nedenle bu bilgileri 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ışı

Aşağıdaki şemada, D2D 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, cihazdan cihaza test için bir kaynak cihaz ve kopyalama işleminin yapılacağı 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 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. Bir geri yükleme işlemi sırasında, Yedekleme Yöneticisi Hizmeti, yedek aktarımdan yedek verileri alır ve cihaza geri yükler. D2D aktarımda Yedek Yöneticisi Hizmeti, uygulamanızı yedek veriler için 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 Transport:Google Mobile Services'in bir parçası olan çoğu cihazda etkin bulut yedekleme aktarımı. Bu aktarım, verileri Android Yedekleme Hizmeti'nde depolar.
  • D2D Taşıma: Bu aktarım, D2D taşımada doğrudan bir cihazdan diğerine veri aktarmak için 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 yedeklemeyi 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üzü bulut yedeklemeleri için hazırlayın

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

  1. Otomatik Yedekleme özelliğini kullanmak için Android 6.0 (API düzeyi 23) veya sonraki bir sürümün yüklü olduğu 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 veya 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

Cihazlar arası aktarımı test etmenin en kapsamlı yolu, telefon içeriğinizin tamamını fabrika ayarlarına sıfırlanmış yeni bir cihaza aktarıp düzgün çalıştığından emin olmaktı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ı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'yi (API düzeyi 31) veya sonraki sürümleri hedefleyin.
  3. Testin tekrarlanmasını desteklemek için şu 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. 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 yinelemesi için 2-4. adımları tekrar edin.

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

Yedek veri 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 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ığı için 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 başlıklı makaleyi inceleyin.

Öte yandan anahtar/değer çifti yedeklemesi, uygulamanızı uygulama manifest dosyasında belirttiğ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 uygulamanızı uyguladıysanız bu, büyük olasılıkla yedeklemeye veri veya dosya eklemediğiniz anlamına gelir.