Otomatik Yedekleme ile kullanıcı verilerini yedekleme

Uygulamalar için Otomatik Yedekleme, Android 6.0 (API düzeyi 23) veya sonraki sürümleri hedefleyen ve bu sürümlerde çalışan uygulamalardaki kullanıcı verilerini otomatik olarak yedekler. Android, uygulama verilerini kullanıcının Google Drive'ına yükleyerek korur. Bu veriler, kullanıcının Google Hesabı kimlik bilgileriyle korunur. Yedekleme, Android 9 veya sonraki sürümlerin yüklü olduğu cihazlarda cihazın PIN'i, deseni veya şifresi kullanılarak uçtan uca şifrelenir. Her uygulama, uygulama kullanıcısı başına en fazla 25 MB yedekleme verisi ayırabilir. Yedekleme verilerini depolamak için ücret alınmaz. Uygulamanız, yedekleme işlemini özelleştirebilir veya yedeklemeleri devre dışı bırakarak kapsam dışında kalmayı seçebilir.

Android'in yedekleme seçeneklerine genel bakış ve hangi verilerin yedeklenip geri yükleneceğiyle ilgili rehberlik için veri yedeklemeye genel bakış bölümünü inceleyin.

Yedeklenen dosyalar

Otomatik Yedekleme, varsayılan olarak sistem tarafından uygulamanıza atanan dizinlerin çoğundaki dosyaları içerir:

Otomatik Yedekleme; getCacheDir(), getCodeCacheDir() ve getNoBackupFilesDir() tarafından döndürülen dizinlerdeki dosyaları hariç tutar. Bu konumlara kaydedilen dosyalar yalnızca geçici olarak gereklidir ve yedekleme işlemlerinden kasıtlı olarak hariç tutulur.

Uygulamanızı belirli dosyaları dahil edecek ve hariç tutacak şekilde yapılandırabilirsiniz. Daha fazla bilgi için Dosyaları dahil etme ve hariç tutma bölümüne bakın.

Yedek konumu

Yedekleme verileri, kullanıcının Google Drive hesabındaki özel bir klasörde saklanır ve uygulama başına 25 MB ile sınırlıdır. Kaydedilen veriler, kullanıcının kişisel Google Drive kotasından düşülmez. Yalnızca en son yedekleme saklanır. Yedekleme yapıldığında önceki yedekler silinir. Yedekleme verileri, kullanıcı veya cihazdaki diğer uygulamalar tarafından okunamaz.

Kullanıcılar, Google Drive Android uygulamasında yedeklenen uygulamaların listesini görebilir. Android destekli bir cihazda kullanıcılar bu listeyi Drive uygulamasının gezinme çekmecesindeki Ayarlar > Yedekle ve sıfırla bölümünde bulabilir.

Her cihaz kurulumu yaşam döngüsüne ait yedekler, aşağıdaki örneklerde açıklandığı gibi ayrı veri kümelerinde depolanır:

  • Kullanıcının iki cihazı varsa her cihaz için bir yedek veri kümesi bulunur.

  • Kullanıcı bir cihazı fabrika ayarlarına sıfırlayıp aynı hesapla kurarsa yedek yeni bir veri kümesinde depolanır. Eski veri kümeleri, belirli bir süre işlem yapılmadığında otomatik olarak silinir.

Yedekleme programı

Aşağıdaki koşulların tümü karşılandığında yedekleme otomatik olarak gerçekleşir:

  • Kullanıcı, cihazda yedeklemeyi etkinleştirmiştir. Android 9'da bu ayar Ayarlar > Sistem > Yedekleme bölümündedir.
  • Son yedeklemenin üzerinden en az 24 saat geçmişse
  • Cihaz boştadır.
  • Cihaz bir kablosuz ağa bağlıysa (cihaz kullanıcısı mobil veri yedeklemelerini etkinleştirmediyse)

Uygulamada bu koşullar her gece gerçekleşir ancak bir cihaz hiçbir zaman yedekleme yapmayabilir (örneğin, hiçbir zaman ağa bağlanmazsa). Ağ bant genişliğinden tasarruf etmek için yükleme işlemi yalnızca uygulama verileri değiştiğinde gerçekleşir.

Otomatik yedekleme sırasında sistem, uygulamayı kapatarak dosya sistemine yazma işlemini durdurur. Yedekleme sistemi, kötü bir kullanıcı deneyimi yaşanmaması için ön planda çalışan uygulamaları varsayılan olarak yoksayar. android:backupInForeground özelliğini true olarak ayarlayarak varsayılan davranışı geçersiz kılabilirsiniz.

Android, test sürecini basitleştirmek için uygulamanızın yedeklemesini manuel olarak başlatmanıza olanak tanıyan araçlar içerir. Daha fazla bilgi için Yedekleme ve geri yüklemeyi test etme başlıklı makaleyi inceleyin.

Programı geri yükle

Veriler, uygulama her yüklendiğinde (Play Store'dan, cihaz kurulumu sırasında [sistem daha önce yüklenmiş uygulamaları yüklerken] veya adb install komutu çalıştırılarak) geri yüklenir. Geri yükleme işlemi, APK yüklendikten sonra ancak uygulama kullanıcı tarafından başlatılmadan önce gerçekleşir.

İlk cihaz kurulum sihirbazı sırasında kullanıcıya mevcut yedek veri kümelerinin bir listesi gösterilir ve verilerin hangisinden geri yükleneceği sorulur. Seçilen yedekleme veri kümesi, cihazın üst veri kümesi olur. Cihaz, kendi yedeklerinden veya üst veri kümesinden geri yükleme yapabilir. Her iki kaynaktan da yedekleme varsa cihaz kendi yedeklemesine öncelik verir. Kullanıcı cihaz kurulum sihirbazını kullanmadıysa cihaz yalnızca kendi yedeklerinden geri yükleme yapabilir.

Android, test sürecini basitleştirmek için uygulamanızın geri yükleme işlemini manuel olarak başlatmanıza olanak tanıyan araçlar içerir. Daha fazla bilgi için Yedekleme ve geri yüklemeyi test etme başlıklı makaleyi inceleyin.

Yedeklemeyi etkinleştirme ve devre dışı bırakma

Android 6.0 (API düzeyi 23) veya sonraki sürümleri hedefleyen uygulamalar otomatik olarak Otomatik Yedekleme'ye katılır. Yedeklemeyi etkinleştirmek veya devre dışı bırakmak için uygulama manifest dosyanızda boole değerini android:allowBackup olarak ayarlayın. Varsayılan değer true olsa da aşağıdaki örnekte gösterildiği gibi özelliği manifest dosyanızda açıkça ayarlamanızı öneririz:

<manifest ... >
    ...
    <application android:allowBackup="true" ... >
        ...
    </application>
</manifest>

android:allowBackup değerini false olarak ayarlayarak yedeklemeleri devre dışı bırakabilirsiniz. Uygulamanız, durumunu başka bir mekanizma aracılığıyla yeniden oluşturabiliyorsa veya hassas bilgilerle ilgileniyorsa bunu yapmak isteyebilirsiniz.

Dosyaları dahil etme ve hariç tutma

Sistem, varsayılan olarak neredeyse tüm uygulama verilerini yedekler. Daha fazla bilgi için yedeklenen dosyalar ile ilgili bölüme bakın.

Aktarım türüne göre yedeklemeye hangi verilerin dahil edileceğini kontrol edebilirsiniz. Otomatik Yedekleme, Google Drive'a bulut yedeklemelerini ve doğrudan cihazdan cihaza (D2D) aktarımları destekler. Yapılandırma yöntemleri, Android sürümüne ve uygulamanızın targetSdkVersion değerine göre değişiklik gösterir.

Android 11 ve önceki sürümlerde yedeklemeyi kontrol etme

Android 11 (API düzeyi 30) veya daha eski sürümleri çalıştıran cihazlarda hangi dosyaların yedekleneceğini kontrol etmek için bu bölümdeki adımları uygulayın.

  1. AndroidManifest.xml dosyanızda, aşağıdaki örnekte gösterildiği gibi <application> öğesine android:fullBackupContent özelliğini ekleyin. Bu özellik, yedekleme kurallarını içeren bir XML dosyasına işaret eder.

    <application ...
        android:fullBackupContent="@xml/backup_rules">
    </application>
    
  2. res/xml/ dizininde @xml/backup_rules adlı bir XML dosyası oluşturun. Bu dosyada, <include> ve <exclude> öğelerini içeren reklam kuralları ekleyin. Aşağıdaki örnekte, device.xml hariç tüm paylaşılan tercihler yedeklenmektedir:

    <?xml version="1.0" encoding="utf-8"?>
    <full-backup-content>
      <include domain="sharedpref" path="."/>
      <exclude domain="sharedpref" path="device.xml"/>
    </full-backup-content>
    

Yedekleme için gereken cihaz koşullarını tanımlama

Uygulamanız cihazda hassas bilgiler kaydediyorsa uygulama verilerinizin kullanıcının yedeklemesine dahil edileceği koşulları belirtebilirsiniz. Android 9 (API düzeyi 28) veya sonraki sürümlerde aşağıdaki koşulları ekleyebilirsiniz:

Geliştirme cihazlarınızı Android 9'a yükselttiyseniz yükseltme işleminden sonra veri yedeklemeyi devre dışı bırakıp yeniden etkinleştirmeniz gerekir. Bunun nedeni, Android'in yedeklemeleri yalnızca Ayarlar'da veya kurulum sihirbazında kullanıcıları bilgilendirdikten sonra istemci tarafı gizli anahtarla şifrelemesidir.

Dahil etme koşullarını bildirmek için yedekleme kuralları grubunuzdaki <include> öğelerinde requireFlags özelliğini seçilen bir değere veya değerlere ayarlayın:

backup_rules.xml

<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
    <!-- App data isn't included in user's backup
         unless client-side encryption is enabled. -->
    <include domain="file" path="."
             requireFlags="clientSideEncryption" />
</full-backup-content>

Uygulamanızda anahtar/değer yedekleme sistemi kullanılıyorsa veya BackupAgent'yi kendiniz uyguluyorsanız BackupDataOutput nesnesinin taşıma işaretleri grubu ile özel yedekleme aracınızın FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED veya FLAG_DEVICE_TO_DEVICE_TRANSFER işaretleri arasında bit düzeyinde karşılaştırma yaparak bu koşullu şartları yedekleme mantığınıza da uygulayabilirsiniz.

Aşağıdaki kod snippet'inde bu yöntemin örnek bir kullanımı gösterilmektedir:

Kotlin

class CustomBackupAgent : BackupAgent() {
    override fun onBackup(
        oldState: ParcelFileDescriptor?,
        data: BackupDataOutput?,
        newState: ParcelFileDescriptor?
    ) {
        if (data != null) {
            if ((data.transportFlags and
                    FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) {
                // Client-side backup encryption is enabled.
            }

            if ((data.transportFlags and FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) {
                // Local device-to-device transfer is enabled.
            }
        }
    }

    // Implementation of onRestore() here.
}

Java

public class CustomBackupAgent extends BackupAgent {
    @Override
    public void onBackup(
        ParcelFileDescriptor oldState,
        BackupDataOutput data,
        ParcelFileDescriptor newState
    ) throws IOException {
        if ((data.getTransportFlags() &
                FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED) != 0) {
            // Client-side backup encryption is enabled.
        }

        if ((data.getTransportFlags() &
                FLAG_DEVICE_TO_DEVICE_TRANSFER) != 0) {
            // Local device-to-device transfer is enabled.
        }
    }

    // Implementation of onRestore() here.
}

Android 12 veya sonraki sürümlerde yedeklemeyi kontrol etme

Uygulamanız Android 12 (API düzeyi 31) veya sonraki sürümleri hedefliyorsa Android 12 ya da sonraki sürümleri çalıştıran cihazlarda hangi dosyaların yedekleneceğini kontrol etmek için bu bölümdeki adımları uygulayın.

  1. AndroidManifest.xml dosyanızda, aşağıdaki örnekte gösterildiği gibi <application> öğesine android:dataExtractionRules özelliğini ekleyin. Bu özellik, yedekleme kurallarını içeren bir XML dosyasına işaret eder.

    <application ...
        android:dataExtractionRules="backup_rules.xml">
    </application>
    
  2. res/xml/ dizininde backup_rules.xml adlı bir XML dosyası oluşturun. Bu dosyada, <include> ve <exclude> öğelerini içeren reklam kuralları ekleyin. Aşağıdaki örnekte, device.xml hariç tüm paylaşılan tercihler yedeklenmektedir:

    <?xml version="1.0" encoding="utf-8"?>
    <data-extraction-rules>
      <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]>
        <include domain="sharedpref" path="."/>
        <exclude domain="sharedpref" path="device.xml"/>
      </cloud-backup>
    </data-extraction-rules>
    

XML yapılandırma söz dizimi

Yapılandırma dosyasının XML söz dizimi, uygulamanızın hedeflediği ve çalıştığı Android sürümüne göre değişir.

Android 11 veya önceki sürümler

Android 11 veya daha eski sürümleri çalıştıran cihazlarda yedeklemeyi kontrol eden yapılandırma dosyası için aşağıdaki XML söz dizimini kullanın.

<full-backup-content>
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"
    requireFlags=["clientSideEncryption" | "deviceToDeviceTransfer"] />
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string" />
</full-backup-content>

Android 12 veya sonraki sürümler

Uygulamanız Android 12 (API düzeyi 31) veya sonraki sürümleri hedefliyorsa Android 12 veya sonraki sürümleri çalıştıran cihazlarda yedeklemeyi kontrol eden yapılandırma dosyası için aşağıdaki XML söz dizimini kullanın.

<data-extraction-rules>
  <cloud-backup [disableIfNoEncryptionCapabilities="true|false"]>
    ...
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
  </cloud-backup>
  <device-transfer>
    ...
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
  </device-transfer>
  <cross-platform-transfer platform="ios">
    ...
    <include domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
    <exclude domain=["file" | "database" | "sharedpref" | "external" |
                     "root" | "device_file" | "device_database" |
                     "device_sharedpref" | "device_root" ] path="string"/>
    ...
    <platform-specific-params bundleId="string" teamId="string" contentVersion="string"/>
    ...
  </cross-platform-transfer>
</data-extraction-rules>

Yapılandırmanın her bölümü (<cloud-backup>, <device-transfer>, <cross-platform-transfer>) yalnızca ilgili aktarım türü için geçerli olan kurallar içerir. Bu ayrım sayesinde, örneğin bir dosyayı veya dizini Google Drive yedeklemelerinden hariç tutarken cihazdan cihaza (D2D) aktarımlar veya platformlar arası aktarımlar sırasında aktarmaya devam edebilirsiniz. Bu özellik, buluta yedeklenemeyecek kadar büyük olan ancak cihazlar arasında sorunsuz bir şekilde aktarılabilen dosyalarınız varsa kullanışlıdır.

Belirli bir yedekleme modu için kural yoksa (ör. <device-transfer> bölümü eksikse) bu mod, Yedeklenen dosyalar bölümünde açıklandığı gibi no-backup ve cache dizinleri hariç tüm içerikler için tamamen etkinleştirilir.

Uygulamanız, yedeklemenin yalnızca şifrelenebildiği durumlarda (ör. kullanıcının kilit ekranı olduğunda) gerçekleşmesini sağlamak için <cloud-backup> bölümünde disableIfNoEncryptionCapabilities işaretini ayarlayabilir. Bu kısıtlama ayarlandığında, kullanıcının cihazı şifrelemeyi desteklemiyorsa yedeklerin buluta gönderilmesi durdurulur. Ancak cihazdan cihaza aktarımlar sunucuya gönderilmediği için şifrelemeyi desteklemeyen cihazlarda bile çalışmaya devam eder.

Dahil etme ve hariç tutma öğelerinin söz dizimi

<full-backup-content>, <cloud-backup> ve <device-transfer> etiketlerinin içinde (cihazın Android sürümüne ve uygulamanızın targetSDKVersion değerine bağlı olarak) <include> ve <exclude> öğelerini tanımlayabilirsiniz:

<include>

Yedeklenecek bir dosya veya klasör belirtir. Varsayılan olarak Otomatik Yedekleme, neredeyse tüm uygulama dosyalarını içerir. Bir <include> öğesi belirtirseniz sistem artık varsayılan olarak herhangi bir dosya eklemez ve yalnızca belirtilen dosyaları yedekler. Birden fazla dosya eklemek için birden fazla <include> öğesi kullanın.

Android 11 ve önceki sürümlerde bu öğe, requireFlags özelliğini de içerebilir. Bu özellik, yedekleme için koşullu şartları tanımlama bölümünde daha ayrıntılı olarak ele alınmıştır.

getCacheDir(), getCodeCacheDir() veya getNoBackupFilesDir() tarafından döndürülen dizinlerdeki dosyalar, dahil etmeye çalışsanız bile her zaman hariç tutulur.

<exclude>

Yedekleme sırasında hariç tutulacak bir dosya veya klasör belirtir. Genellikle yedekleme kapsamı dışında tutulan bazı dosyalar şunlardır:

  • Bir sunucu tarafından verilen veya cihazda oluşturulan, cihaza özgü tanımlayıcıları olan dosyalar. Örneğin, Firebase Cloud Messaging (FCM), bir kullanıcı uygulamanızı yeni bir cihaza her yüklediğinde kayıt jetonu oluşturmalıdır. Eski kayıt jetonu geri yüklenirse uygulama beklenmedik şekilde davranabilir.

  • Uygulama hata ayıklamayla ilgili dosyalar.

  • Uygulamanın 25 MB'lık yedekleme kotasını aşmasına neden olan büyük dosyalar.

Her <include> ve <exclude> öğesi aşağıdaki iki özelliği içermelidir:

domain

Kaynağın konumunu belirtir. Bu özellik için geçerli değerler şunlardır:

  • root: Bu uygulamaya ait tüm özel dosyaların depolandığı dosya sistemindeki dizin.
  • file: getFilesDir() tarafından döndürülen dizinler.
  • database: getDatabasePath() tarafından döndürülen dizinler. SQLiteOpenHelper ile oluşturulan veritabanları burada depolanır.
  • sharedpref: SharedPreferences dosyalarının depolandığı dizin.
  • external: getExternalFilesDir() tarafından döndürülen dizin.
  • device_root: root ile benzerdir ancak cihaz korumalı depolama alanı için kullanılır.
  • device_file: file ile benzerdir ancak cihaz korumalı depolama alanı için kullanılır.
  • device_database: database ile benzerdir ancak cihaz korumalı depolama alanı için kullanılır.
  • device_sharedpref: sharedpref gibi ancak cihaz korumalı depolama alanı için.
path

Yedeklemeye dahil edilecek veya yedeklemeden hariç tutulacak bir dosya ya da klasör belirtir. Aşağıdakileri göz önünde bulundurun:

  • Bu özellik, joker karakter veya normal ifade söz dizimini desteklemez.
  • ./ kullanarak mevcut dizine referans verebilirsiniz ancak güvenlik nedeniyle .. kullanarak ana dizine referans veremezsiniz.
  • Bir dizin belirtirseniz kural, dizindeki ve yinelemeli alt dizinlerdeki tüm dosyalar için geçerli olur.

Platformlar arası aktarımları yapılandırma

Android 16 QPR2 (API düzeyi 36.1) sürümünden itibaren, Android olmayan cihazlara ve cihazlardan veri aktarımı için Otomatik Yedekleme'yi yapılandırabilirsiniz. Bunu yapmak için Android 12 veya sonraki sürümlerin söz diziminde gösterildiği gibi <cross-platform-transfer> öğesini <data-extraction-rules> yapılandırmanıza ekleyin. Zorunlu platform özelliğini kullanarak hedef platformu belirtmeniz gerekir. Desteklenen tek değer ios değeridir.

Bu bölümde, hangi verilerin aktarılacağını belirtmek için Dahil etme ve hariç tutma öğelerinin söz dizimi bölümünde açıklandığı gibi standart <include> ve <exclude> öğelerini kullanabilirsiniz.

Ayrıca, sistemin uygulamanızı hedef platformdaki ilgili uygulamayla eşleştirmesine yardımcı olmak için <platform-specific-params> öğesini eklemeniz gerekir. Bu öğe aşağıdaki zorunlu özelliklere sahiptir:

  • bundleId: Uygulamanın diğer platformdaki paket kimliği (ör. iOS uygulamanızın paket kimliği).
  • teamId: Uygulamanın diğer platformdaki ekip kimliği (ör. iOS uygulamanızın ekip kimliği).
  • contentVersion: Dışa aktarılan veri biçimiyle ilişkili, tanımladığınız bir sürüm dizesi.

bundleId ve teamId özellikleri, veri bütünlüğünü ve uygulamalar arası doğru eşleşmeyi doğrulamak için kullanılır. Dışa aktarma sırasında verilerin yalnızca diğer platformdaki belirtilen uygulamaya aktarılmasını ve içe aktarma sırasında bu Android uygulamasının yalnızca söz konusu uygulamadan veri almasını garanti ederler.

XML kurallarının sağladığından daha ayrıntılı bir veri dönüştürme ve aktarma süreci kontrolü için özel bir BackupAgent uygulayabilir ve Cross-Platform Transfer API'lerini kullanabilirsiniz.

iOS Aktarımları İçin Dosya Eşleme

Dosyaları iOS'e aktarırken <include> kurallarında belirttiğiniz Android domain ve path, belirli bir dizin yapısıyla eşlenir. Aşağıdaki tabloda, Android domain temel alınarak iOS'teki hedef yolların aktarım hedefi köküne göre konumu gösterilmektedir:

Android domain iOS'teki yol (aktarım köküne göre)
root app/
file app/files/
database app/databases/
sharedpref app/shared_prefs/
external external/files/
device_root device/app/
device_file device/app/files/
device_database device/app/databases/
device_sharedpref device/app/shared_prefs/

Örneğin, <include domain="file" path="my_settings.txt"/> ile eklenen bir dosya, iOS tarafında aktarım hedefi köküne göre app/files/my_settings.txt konumunda kullanılabilir.

BackupAgent'ı uygulama

Otomatik Yedekleme'yi uygulayan uygulamaların BackupAgent uygulaması gerekmez. Ancak dilerseniz özel bir BackupAgent uygulayabilirsiniz. Bunun genellikle iki nedeni vardır:

  • onRestoreFinished() ve onQuotaExceeded() gibi yedekleme etkinlikleriyle ilgili bildirim almak istiyorsanız. Bu geri çağırma yöntemleri, uygulama çalışmıyor olsa bile yürütülür.

  • Yedeklemek istediğiniz dosya grubunu XML kurallarıyla kolayca ifade edemiyorsanız. Bu nadir durumlarda, istediğiniz verileri depolamak için onFullBackup(FullBackupDataOutput)'yi geçersiz kılan bir BackupAgent uygulayabilirsiniz. Sistemin varsayılan uygulamasını korumak için super.onFullBackup() ile üst sınıfta ilgili yöntemi çağırın.

BackupAgent uygularsanız sistem varsayılan olarak uygulamanızın anahtar/değer yedekleme ve geri yükleme işlemini gerçekleştirmesini bekler. Bunun yerine dosya tabanlı Otomatik Yedekleme'yi kullanmak için uygulamanızın manifest dosyasında android:fullBackupOnly özelliğini true olarak ayarlayın.

Otomatik yedekleme ve geri yükleme işlemleri sırasında sistem, uygulamanın çakışmalara neden olabilecek dosyalara erişmesini önlemek ve uygulamanın BackupAgent içinde geri çağırma yöntemlerini yürütmesine izin vermek için uygulamayı kısıtlı bir modda başlatır. Bu kısıtlı modda, uygulamanın ana etkinliği otomatik olarak başlatılmaz, içerik sağlayıcıları başlatılmaz ve uygulamanın manifest dosyasında beyan edilen herhangi bir alt sınıf yerine temel sınıf Application örneklendirilir.

BackupAgent sınıfınız, anahtar/değer çifti yedeklemesi için kullanılan soyut onBackup() ve onRestore() yöntemlerini uygulamalıdır. Anahtar/değer yedeklemesi yapmak istemiyorsanız bu yöntemlerin uygulamasını boş bırakabilirsiniz.

Daha fazla bilgi için BackupAgent'ı genişletme başlıklı makaleyi inceleyin.

BackupAgent'ta platformlar arası aktarımları işleme

Android 16 QPR2 (API düzeyi 36.1) ile başlayarak, platformlar arası veri aktarımlarını daha iyi desteklemek için BackupAgent içinde birkaç yeni API kullanılabilir.

Yeni Taşıma İşareti:

  • FLAG_CROSS_PLATFORM_TRANSFER_IOS: Bu işaret, BackupAgent için sağlanan transportFlags öğesine eklenir.
    • onFullBackup içinde, mevcut yedekleme işlemi bir iOS cihazına veri aktarımının parçasıysa bu işaret ayarlanır.
    • Yeni onRestoreFile aşırı yüklemesinde, veriler bir iOS cihazdan içe aktarılıyorsa bu işaret ayarlanır.

Yeni onRestoreFile yöntemi:

Tek bir FullRestoreDataInput parametresi alan yeni bir onRestoreFile aşırı yüklemesi kullanıma sunuldu. Bu nesne, geri yükleme işlemi hakkında daha fazla bağlam bilgisi sağlar:

  • FullRestoreDataInput.getTransportFlags(): Mevcut geri yükleme işlemi için taşıma işaretlerini döndürür. Bu işaretler FLAG_CROSS_PLATFORM_TRANSFER_IOS değerini içerebilir.
  • FullRestoreDataInput.getContentVersion(): Platformlar arası aktarım sırasında diğer platformdaki kaynak uygulama tarafından sağlanan içerik sürümü dizesini döndürür. Kaynak tarafından sağlanmazsa bu değer boş bir dizedir.

Yeni Boyut Tahmini Yöntemi:

  • onEstimateFullBackupBytes(): Bu yöntem, uygulamanızın yedeklemeyi planladığı verilerin tahmini boyutunu belirtmenize olanak tanır. Uygulamanız yedekleme sırasında önemli veri dönüşümleri gerçekleştiriyorsa veya büyük miktarda veri işliyorsa varsayılan sistem deneme çalıştırmasını önleyerek verimliliği artırabileceğinden bu yöntemi uygulamanız kesinlikle önerilir. Küçük ve basit yedeklemeleri olan uygulamalar için bu yöntem genellikle gerekli değildir.

Örnek kullanım:

Kotlin

// In your custom BackupAgent class

override fun onFullBackup(out: FullBackupDataOutput) {
    // Check if this is a cross-platform export to iOS
    if ((out.transportFlags and FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
        Log.d(TAG, "onFullBackup for iOS transfer")
        // Your custom export logic here
        // Call fullBackupFile() for files to include
    }
}

override fun onRestoreFile(input: FullRestoreDataInput) {
    if ((input.transportFlags and FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
        val sourceContentVersion = input.contentVersion
        Log.d(TAG, "onRestoreFile from iOS, content version: $sourceContentVersion")
        // Your custom import logic here, using input.data, input.destination, etc.
    }
}

// Optional: Provide an estimate of the backup size
override fun onEstimateFullBackupBytes(): Long {
    return calculateEstimatedBackupSize()
}

Java

// In your custom BackupAgent class

@Override
public void onFullBackup(FullBackupDataOutput out) throws IOException {
    // Check if this is a cross-platform export to iOS
    if ((out.getTransportFlags() & FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
        Log.d(TAG, "onFullBackup for iOS transfer");
        // Your custom export logic here
        // Call fullBackupFile() for files to include
    }
}

@Override
public void onRestoreFile(FullRestoreDataInput input) {
    if ((input.getTransportFlags() & FLAG_CROSS_PLATFORM_TRANSFER_IOS) != 0) {
        String sourceContentVersion = input.getContentVersion();
        Log.d(TAG, "onRestoreFile from iOS, content version: " + sourceContentVersion);
        // Your custom import logic here, using input.getData(), input.getDestination(), etc.
    }
}

// Optional: Provide an estimate of the backup size
@Override
public long onEstimateFullBackupBytes() {
    return calculateEstimatedBackupSize();
}