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 ya da ş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 sürecini ö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ış başlıklı makaleyi 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şlemlerinin dışında 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.

Yedekleme 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ına dahil edilmez. Yalnızca en son yedekleme saklanır. Yedekleme yapıldığında önceki yedeklemeler silinir. Yedekleme verileri, kullanıcı veya cihazdaki diğer uygulamalar tarafından okunamıyor.

Kullanıcılar, Google Drive Android uygulamasında yedeklenen uygulamaların listesini görebilir. Android destekli bir cihazda bu listeyi Drive uygulamasının gezinme çekmecesinde Ayarlar > Yedekleme ve sıfırlama bölümünde bulabilirler.

Her cihaz kurulumu ömründen alınan yedekler, aşağıdaki örneklerde açıklandığı gibi ayrı veri kümelerinde saklanı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 yedekleme yeni bir veri kümesinde saklanır. Eski veri kümeleri, belirli bir süre işlem yapılmadığında otomatik olarak silinir.

Yedekleme planlaması

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

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

Bu koşullar pratikte hemen hemen her gece gerçekleşir ancak bir cihaz hiçbir zaman yedeklenmeyebilir (örneğin, hiçbir zaman bir ağa bağlanmazsa). Ağ bant genişliğini korumak için yükleme yalnızca uygulama verileri değiştiyse gerçekleşir.

Otomatik yedekleme sırasında sistem, dosya sistemine yazılmadığından emin olmak için uygulamayı kapatır. Varsayılan olarak, yedekleme sistemi kötü bir kullanıcı deneyimini önlemek için ön planda çalışan uygulamaları yoksayar. android:backupInForeground özelliğini doğru 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ükleme işlemlerini test etme başlıklı makaleyi inceleyin.

Programı geri yükleme

Veriler, uygulama Play Store'dan, cihaz kurulumu sırasında (sistem daha önce yüklenen uygulamaları yüklediğinde) veya adb install komutu çalıştırılarak yüklendiğinde 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 kurulumu sihirbazı sırasında kullanıcıya kullanılabilir yedekleme veri kümelerinin listesi gösterilir ve verilerin hangi veri kümesinden geri yükleneceği sorulur. Hangi yedekleme veri kümesi seçilirse cihazın üst veri kümesi olur. Cihaz, kendi yedeklerinden veya atalara ait 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üklenebilir.

Android, test etme 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ükleme işlemlerini 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 Yedekleme'ye otomatik olarak katılır. Uygulama manifest dosyanızda, yedeklemeyi etkinleştirmek veya devre dışı bırakmak için Boole değeri android:allowBackup'ı ayarlayın. Varsayılan değer true'dır ancak aşağıdaki örnekte gösterildiği gibi özelliği manifestinizde 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 çalışıyorsa bunu yapmanız önerilir.

Dosyaları dahil etme ve hariç tutma

Sistem, varsayılan olarak neredeyse tüm uygulama verilerini yedekler. Daha fazla bilgi için yedeklenen dosyalar bölümüne 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 bağlı olarak değişir.

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

Android 11 (API düzeyi 30) veya daha eski sürümlerin yüklü olduğu 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. @xml/backup_rules dizininde res/xml/ adlı bir XML dosyası oluşturun. Bu dosyaya <include> ve <exclude> öğelerini içeren kurallar ekleyin. Aşağıdaki örnek, device.xml hariç tüm paylaşılan tercihleri yedekler:

    <?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 uygulamanızın verilerinin kullanıcının yedeğine 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 kullanıcılara Ayarlar'da veya kurulum sihirbazında bilgi verdikten sonra istemci tarafı gizli anahtarla şifrelemesidir.

Dahil etme koşullarını bildirmek için yedek kurallar kümenizdeki <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 uygulanıyorsa veya BackupAgent kendiniz uyguluyorsanız BackupDataOutput nesnesinin aktarım işaretleri kümesi 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 gereksinimleri yedekleme mantığınıza da uygulayabilirsiniz.

Aşağıdaki kod snippet'inde bu yöntemin örnek 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'yi (API düzeyi 31) veya sonraki sürümleri hedefliyorsa Android 12 ya da sonraki sürümlerin yüklü olduğu 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. backup_rules.xml dizininde res/xml/ adlı bir XML dosyası oluşturun. Bu dosyaya <include> ve <exclude> öğelerini içeren kurallar ekleyin. Aşağıdaki örnek, device.xml hariç tüm paylaşılan tercihleri yedekler:

    <?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 üzerinde çalıştığı Android sürümüne bağlı olarak değişir.

Android 11 veya önceki sürümler

Android 11 veya önceki sürümlerin yüklü olduğu 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'yi (API düzeyi 31) veya sonraki bir sürümü hedefliyorsa Android 12 veya sonraki sürümlerin yüklü olduğu 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 bu tür aktarımlar için geçerli olan kurallar içerir. Bu ayrım sayesinde, örneğin, bir dosyayı veya dizini Google Drive yedeklemelerinden hariç tutabilir, ancak 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.

<device-transfer> bölümünün eksik olması gibi belirli bir yedekleme modu için kural yoksa 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ı kilit ekranına sahip olduğunda) gerçekleşmesini sağlamak için <cloud-backup> bölümünde disableIfNoEncryptionCapabilities işaretini ayarlayabilir. Bu kısıtlamanın ayarlanması, kullanıcının cihazı şifrelemeyi desteklemiyorsa yedeklemelerin buluta gönderilmesini engeller. Ancak D2D aktarımları sunucuya gönderilmediğinden ş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 sürümüne bağlı olarak) <include> ve <exclude> öğelerini tanımlayabilirsiniz:

<include>

Yedeklenecek bir dosya veya klasör belirtir. Otomatik Yedekleme, varsayılan olarak neredeyse tüm uygulama dosyalarını içerir. Bir <include> öğesi belirtirseniz sistem artık varsayılan olarak hiçbir dosyayı içermez 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, yedekleme için koşullu şartların nasıl tanımlanacağını açıklayan bölümde daha ayrıntılı olarak ele alınan requireFlags özelliğini de içerebilir.

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

<exclude>

Yedekleme sırasında hariç tutulacak bir dosya veya klasör belirtir. Genellikle yedeklemeye dahil edilmeyen bazı dosyalar şunlardır:

  • Sunucu tarafından verilen veya cihazda oluşturulan, cihaza özgü tanımlayıcılar içeren 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 saklanır.
  • sharedpref: SharedPreferences öğelerinin depolandığı dizin.
  • external: getExternalFilesDir() tarafından döndürülen dizin.
  • device_root: root gibi ancak cihazla korunan depolama alanı için.
  • device_file: file gibi ancak cihazla korunan depolama alanı için.
  • device_database: database gibi ancak cihazla korunan depolama alanı için.
  • device_sharedpref: sharedpref gibi ancak cihazla korunan depolama alanı için.
path

Yedeklemeye dahil edilecek veya yedeklemenin dışında bırakılacak 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 .. gibi bir ifade kullanarak üst dizine referans veremezsiniz.
  • Bir dizin belirtirseniz kural, dizindeki ve alt dizinlerdeki tüm dosyalar için geçerli olur.

Platformlar Arası Aktarımları Yapılandırma

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

Bu bölümün içinde, 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: Diğer platformdaki uygulamanın ekip kimliği (ör. iOS uygulamanızın ekip kimliği).
  • contentVersion: Dışa aktarılan veri biçimiyle ilişkilendirilmiş, sizin tanımladığınız bir sürüm dizesi.

bundleId ve teamId özellikleri, veri bütünlüğünün doğrulanmasına ve uygulamalar arası eşleşmenin doğru şekilde yapılmasına yardımcı olmak için kullanılır. Bu uygulamalar, dışa aktarma sırasında verilerin yalnızca diğer platformdaki belirtilen uygulamaya aktarılacağını ve bu Android uygulamasının, içe aktarma sırasında yalnızca söz konusu uygulamadan veri içe aktaracağını garanti eder.

Veri dönüşümü ve aktarım süreci üzerinde XML kurallarının sağladığından daha ayrıntılı kontrol için özel bir BackupAgent uygulayabilir ve Platformlar Arası Aktarım 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'ye göre, aktarım hedefi köküne göre iOS'teki hedef yollar gösterilmektedir:

Android domain iOS'te 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 birlikte gelen bir dosya, aktarım hedefi köküne göre app/files/my_settings.txt konumunda iOS tarafında kullanılabilir.

BackupAgent'ı uygulama

Otomatik Yedekleme'yi uygulayan uygulamaların BackupAgent uygulaması gerekmez. Ancak isteğe bağlı olarak özel bir BackupAgent uygulayabilirsiniz. Genellikle bu işlemin 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 dosyaları XML kurallarıyla kolayca ifade edemezsiniz. Bu nadir durumlarda, istediğiniz öğeleri depolamak için BackupAgent geçersiz kılan bir onFullBackup(FullBackupDataOutput) 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 çifti yedekleme ve geri yükleme işlemini gerçekleştirmesini bekler. Bunun yerine dosya tabanlı otomatik yedeklemeyi kullanmak için uygulamanızın manifest dosyasında android:fullBackupOnly özelliğini true olarak ayarlayın.

Sistem, otomatik yedekleme ve geri yükleme işlemleri sırasında uygulamayı hem çakışmaya neden olabilecek dosyalara erişmesini önlemek hem de geri çağırma yöntemlerini BackupAgent içinde yürütmesine izin vermek için kısıtlanmış modda başlatır. Bu kısıtlanmış 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 belirtilen herhangi bir alt sınıf yerine temel sınıf Application oluşturulur.

BackupAgent, anahtar/değer çifti yedekleme için kullanılan onBackup() ve onRestore() soyut 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ı İşleme

Android 16 QPR2'den (API düzeyi 36.1) itibaren, platformlar arası veri aktarımlarını daha iyi desteklemek için BackupAgent'da çeşitli yeni API'ler kullanıma sunulmuştur.

Yeni Nakliye İşareti:

  • FLAG_CROSS_PLATFORM_TRANSFER_IOS: Bu işaret, BackupAgent hizmetinize sağlanan transportFlags öğesine eklenir.
    • onFullBackup içinde, mevcut yedekleme işlemi bir iOS cihaza veri dışa aktarma işleminin parçasıysa bu işaret ayarlanır.
    • Yeni onRestoreFile aşırı yüklenmesinde, veriler bir iOS cihazından içe aktarılıyorsa bu işaret ayarlanır.

Yeni onRestoreFile Yöntemi:

Tek bir FullRestoreDataInput parametresi alan onRestoreFile adlı yeni bir aşırı yükleme tanıtıldı. Bu nesne, geri yükleme işlemi hakkında daha fazla bilgi sağlar:

  • FullRestoreDataInput.getTransportFlags(): FLAG_CROSS_PLATFORM_TRANSFER_IOS dahil olmak üzere mevcut geri yükleme işlemi için aktarım işaretlerini döndürür.
  • 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. Bu değer, kaynak tarafından sağlanmazsa boş bir dizedir.

Yeni Boyut Tahmin 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 hacimli verileri işliyorsa varsayılan sistem deneme çalıştırmasını önleyerek verimliliği artırabileceğinden bu yöntemin uygulanması şiddetle tavsiye edilir. Küçük ve basit yedeklemeleri olan uygulamalarda bu yöntem genellikle gerekli değildir.

Kullanım örneği:

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();
}