Otomatik Yedekleme ile kullanıcı verilerini yedekleme

Uygulamalar için Otomatik Yedekleme, kullanıcıların şu uygulamalardaki verilerini otomatik olarak yedekler: Android 6.0 (API düzeyi 23) veya sonraki sürümleri çalıştırmalı ve bu sürümleri çalıştırmalıdır. Android, uygulama verilerini kullanıcının Google Drive'ına yükleyerek korur. Bu veriler, kullanıcının Google Hesabı kimlik bilgileriyle korunur. Yedeklenen veriler cihazlarda uçtan uca şifrelenir Android 9 veya sonraki bir sürümü çalıştıran cihazlar (cihazın PIN'i, deseni veya şifresini kullanarak). Her uygulama, uygulama kullanıcısı başına 25 MB'a kadar yedek veri ayırabilir. Yedek verilerin depolanması 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 bilgi için veri yedeklemeye genel bakış başlıklı makaleyi inceleyin.

Yedeklenen dosyalar

Otomatik Yedekleme varsayılan olarak uygulamanıza sistem tarafından atanmıştır:

Otomatik Yedekleme, getCacheDir(), getCodeCacheDir() ve getNoBackupFilesDir() tarafından döndürülen dizinlerdeki dosyaları hariç tutar. Bu konumlara kaydedilen dosyalara yalnızca geçici olarak ihtiyaç duyulur ve bu dosyalar 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 gizli bir klasörde saklanır ve uygulama başına 25 MB ile sınırlıdır. Kayıtlı veriler, kullanıcının kişisel Google Drive kotasına dahil edilmez. Yalnızca en son yedek saklanır. Bir yedekleme yapılırsa önceki tüm 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 işletim sistemli bir cihazda bu listeyi Drive uygulamasının gezinme çekmecesinde Ayarlar > Yedekleme ve sıfırlama bölümünde bulabilirler.

Her bir cihaz kurulumu ömrü boyunca alınan yedekler, aşağıdaki örneklerde açıklandığını unutmayın:

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

  • Kullanıcı bir cihazı fabrika ayarlarına sıfırlayıp cihazı aynı hesapla kurarsa yedekleme yeni bir veri kümesinde depolanır. Eski veri kümeleri 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ündedir.
  • Son yedekleme işleminden bu yana en az 24 saat geçmiş olmalıdır.
  • Cihaz boştadır.
  • Cihaz bir kablosuz ağa bağlı (cihaz kullanıcısı mobil veri yedeklerini etkinleştirmediyse).

Pratikte bu koşullar yaklaşık olarak her gece gerçekleşir, ancak bir cihaz hiçbir zaman yedeklemez (ö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, uygulamanın artık kapatılmadığından emin olmak için her şeyi ekleyebilirsiniz. Yedekleme sistemi, varsayılan olarak kötü bir kullanıcı deneyimini önlemek için ön planda çalışıyor. varsayılan davranış olan android:backupInForeground özelliğini doğru.

Android, testi basitleştirmek için manuel olarak bir işlem başlatmanızı sağlayan araçlar içerir. yedeği de alırsınız. Daha fazla bilgi için Yedekleme ve geri yüklemeyi test etme başlıklı makaleyi inceleyin.

Programı geri yükleme

Uygulama her yüklendiğinde veriler geri yüklenir. Google Play Store, cihaz kurulumu sırasında (sistem daha önce yüklenmiş uygulamaları yüklediğinde) veya adb yükleme yapılıyor. 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, kullanılabilen ve verilerin hangi veri kümesinden geri yükleneceği sorulur. Hangi yedek? veri kümesi, cihazın üst veri kümesi olur. Cihaz, kendi yedeklerinden veya ata veri kümesinden geri yükleme yapabilir. Her iki kaynaktan da yedek varsa cihaz kendi yedeğine öncelik verir. Kullanıcı kurulum sihirbazından geçmediyse, cihaz yalnızca kendi yedeklerini kullanabilir.

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ştirin ve devre dışı bırakın

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

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

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

Dosyaları dahil etme ve hariç tutma

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

Bu bölümde, nelerin yedeklendiğini kontrol etmek için özel XML kurallarının nasıl tanımlanacağı gösterilmektedir yukarıya doğru. Uygulamanız Android 12 (API düzeyi 31) veya sonraki bir sürümü hedefliyorsa aşağıdaki gibi XML yedek kurallarından oluşan ek bir Cihazlar için kullanıma sunulan yedekleme geri yükleme değişikliklerini destekleme Android sürümleri kullanılıyor.

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ıza <application> öğesine android:fullBackupContent özelliğini eklerse aşağıda gösterildiği gibidir. Bu özellik, yedekleme kurallarını içeren bir XML dosyasını işaret eder.

    <application ...
     android:fullBackupContent="@xml/backup_rules">
    </application>
  2. @xml/backup_rules adında bir XML dosyası oluşturun. res/xml/ dizini. Bu dosyaya <include> ve <exclude> öğeleriyle kurallar ekleyin. Aşağıdaki örnek, paylaşılan tüm tercihleri yedekler device.xml hariç:

    <?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ımlayın

Uygulamanız cihaza hassas bilgiler kaydediyorsa uygulamanızın verilerinin kullanıcının yedeklemelerine 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 yalnızca Android'in Ayarlar'da veya Ayarlar'da kullanıcıları bilgilendirdikten sonra yedekleri bir istemci tarafı gizli anahtarıyla şifreler kurulum sihirbazını da tamamlar.

Dahil etme koşullarını beyan etmek için requireFlags özelliğini, yedek kural grubunuzdaki <include> öğelerinde seçili 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ız bir anahtar/değer yedekleme sistemi uyguluyorsa veya BackupAgent kendiniz uyguluyorsanız BackupDataOutput nesnesinin aktarım işaretleri ile özel yedekleme aracınızın FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED veya FLAG_DEVICE_TO_DEVICE_TRANSFER işaretleri arasında bit eşleme karşılaştırması yaparak bu koşullu koşulları 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 (API düzeyi 31) veya sonraki sürümleri hedefliyorsa şuradaki adımları uygulayın: çalıştırılan cihazlarda hangi dosyaların yedeklendiğini kontrol etmek için bu bölümü Android 12 veya sonraki sürümler

  1. AndroidManifest.xml dosyanıza <application> için android:dataExtractionRules özelliği öğesine sahip olmayabilir Bu özellik bir XML'e işaret ediyor dosyası oluşturun.

    <application ...
     android:dataExtractionRules="backup_rules.xml">
    </application>
  2. backup_rules.xml adında bir XML dosyası oluşturun. res/xml/ dizini. Bu dosyada <include> ve <exclude> öğeleri. Aşağıdaki örnek, device.xml hariç tüm paylaşılan tercihleri yedeklemektedir:

    <?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ırması 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 bağlı olarak değişir.

Android 11 veya önceki sürümler

Yedeklemeyi denetleyen yapılandırma dosyası için aşağıdaki XML söz dizimini kullanın Android 11 veya önceki sürümleri çalıştıran cihazlar için.

<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>
</data-extraction-rules>

Yapılandırmanın her bölümü (<cloud-backup>, <device-transfer>), yalnızca ilgili aktarım türü için geçerli olan kurallar içerir. Bu ayrım, örneğin, bir dosyayı veya dizini cihazlar arası (D2D) aktarım sırasında aktarırken Google Drive yedeklemelerinden hariç tutmanıza olanak tanır. Bu yöntem, bulutta yedeklenemeyecek kadar büyük 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 tam olarak etkinleştirilir.

Uygulamanız, yedeklemenin yalnızca şifrelenebildiği durumlarda (ör. kullanıcının kilit ekranı varsa) gerçekleşmesini sağlamak için <cloud-backup> bölümünde disableIfNoEncryptionCapabilities işaretini ayarlayabilir. Bu kısıtlamayı ayarlama Kullanıcının cihazı desteklemediği durumlarda, yedeklemelerin buluta gönderilmesini durdurur. D2D aktarımları sunucuya gönderilmediğinden bu aktarımlar devam eder şifrelemeyi desteklemeyen cihazlarda bile çalışabilmesini sağlar.

Dahil et ve hariç tut öğeleri için 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ı dahil etmez ve yalnızca belirtilen dosyaları yedekleyebilir. Birden çok dosya eklemek için birden çok <include> öğesi kullanın.

Android 11 ve önceki sürümlerde bu öğe requireFlags özelliğini de içerebilir. Yedekleme için koşullu koşulları tanımlama bölümünü inceleyerek bu özellik hakkında daha fazla bilgi edinebilirsiniz.

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

<exclude>

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

  • Bir sunucu tarafından yayınlanan, cihaza özgü tanımlayıcılara sahip dosyalar oluşturulan bir e-posta alırsınız. Örneğin, Firebase Cloud Messaging (FCM) tarafından sağlanan her bir kullanıcının her seferde bir kayıt jetonu oluşturması gerekir. uygulamanızı yeni bir cihaza yüklediğinden emin olun. 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: Dosya sisteminde, tüm gizli dosyaların bulunduğu dizin veriler depolanır.
  • 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 dosyalarının depolandığı dizin.
  • external: getExternalFilesDir() tarafından döndürülen dizin.
  • device_root: root gibi ancak cihaz tarafından korunan depolama alanı için.
  • device_file: file gibi ancak cihaz tarafından korunan depolama alanı için.
  • device_database: database gibi ancak cihaz tarafından korunan depolama alanı için.
  • device_sharedpref: sharedpref gibi, ancak cihaz korumalı için depolama alanına sahip olursunuz.
path

Yedeklemeye dahil edilecek veya yedekleme kapsamı dışında 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 desteklemiyor.
  • ./ kullanarak mevcut dizine referans verebilirsiniz ancak güvenlik nedeniyle üst dizine (ör. .. kullanarak) referans veremezsiniz.
  • Bir dizin belirtirseniz kural, aynı klasördeki tüm dosyalara dizin ve özyinelemeli alt dizinlerden oluşur.

BackupAgent'ı uygulama

Otomatik Yedekleme'yi kullanan uygulamaların BackupAgent uygulaması gerekmez. Ancak, isterseniz özel bir BackupAgent uygulayabilirsiniz. Bunu yapmanın genellikle iki nedeni vardır:

  • Aşağıdakiler gibi yedekleme etkinlikleri hakkında bildirim almak istiyorsanız: onRestoreFinished() ve onQuotaExceeded(long, long). Bu geri çağırma yöntemleri, uygulama çalışmasa bile yürütülür.

  • Yedeklemek istediğiniz dosya grubunu XML kurallarıyla kolayca ifade edemezsiniz. Nadiren de olsa, geçersiz kıldığı bir BackupAgent uygulayabilirsiniz. İstediğiniz verileri saklamak için onFullBackup(FullBackupDataOutput). Sistemin varsayılan uygulamasını korumak için super.onFullBackup() ile üst sınıftaki ilgili yöntemi çağırın.

Bir BackupAgent uygularsanız sistem, uygulamanızın varsayılan olarak anahtar/değer yedekleme ve geri yükleme işlemi gerçekleştirme. Dosya tabanlı Otomatik Yedekleme özelliğini kullanmak için Bunun yerine, android:fullBackupOnlytrue manifest dosyası olarak kaydedebilirsiniz.

Otomatik yedekleme ve geri yükleme işlemleri sırasında sistem, uygulamayı uygulamanın neden olabilecek dosyalara erişmesini engellemesi için çakışmaları ve uygulamanın BackupAgent içinde geri çağırma yöntemlerini yürütmesine izin verir. 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 tanımlanan alt sınıflar yerine temel sınıf Application örneklenir.

BackupAgent, anahtar/değer yedekleme için kullanılan soyut yöntemler onBackup() ve onRestore()'i uygulamalıdır. Anahtar/değer yedekleme yapmak istemiyorsanız bu yöntemlerin uygulamanızı boş bırakabilirsiniz.

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