Uygulamalar için Otomatik Yedekleme, Android 6.0 (API düzeyi 23) veya sonraki sürümleri hedefleyen ve çalışan uygulamalardaki kullanıcı verilerini otomatik olarak yedekler. Android, uygulama verilerini kullanıcının Google Drive'ına yükleyerek korur. Buradaki veriler, kullanıcının Google Hesabı kimlik bilgileriyle korunur. Yedek, Android 9 veya sonraki sürümleri çalıştıran cihazlarda cihazın PIN'i, deseni ya da şifresi kullanılarak uçtan uca şifrelenir. Veri miktarı kullanıcı başına 25 MB ile sınırlıdır. Yedek verileri depolamak için ücret alınmaz. Uygulamanız, yedekleme işlemini özelleştirebilir veya yedekleri devre dışı bırakarak yedeklemenin kapsamı dışında kalmayı seçebilir.
Android'in yedekleme seçeneklerine genel bakış ve hangi verilerin yedeklenip geri yükleneceği konusunda yol gösterici bilgiler için veri yedeklemeye genel bakış sayfasını inceleyin.
Yedeklenen dosyalar
Varsayılan olarak, Otomatik Yedekleme, uygulamanıza sistem tarafından atanan dizinlerin çoğunda bulunan dosyaları içerir:
Paylaşılan tercihler dosyaları
Uygulamanızın dahili depolama alanına kaydedilen ve
getFilesDir()
veyagetDir(String, int)
tarafından erişilen dosyalarDizinde
getDatabasePath(String)
tarafından döndürülen dosyalar veSQLiteOpenHelper
sınıfıyla oluşturulan dosyaları da içerirgetExternalFilesDir(String)
tarafından döndürülen dizinde harici depolamada bulunan dosyalar
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 bunlar, yedekleme işlemlerinden kasıtlı olarak hariç tutulur.
Uygulamanızı belirli dosyaları içerecek 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 gizli bir klasörde depolanı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 yedek saklanır. Yedekleme yapıldığında ö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 destekli cihazlarda, kullanıcılar bu listeyi Drive uygulamasının gezinme çekmecesinde Ayarlar > Yedekle ve sıfırla altında bulabilir.
Cihazın kurulum ömründeki her bir 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ırlar ve daha sonra cihazı aynı hesapla ayarlarsa 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 planlaması
Aşağıdaki koşulların tümü karşılandığında yedeklemeler otomatik olarak gerçekleşir:
- Kullanıcı, cihazda yedeklemeyi etkinleştirdi. Android 9'da bu ayar Ayarlar > Sistem > Yedekleme seçeneğindedir.
- Son yedeklemenin üzerinden en az 24 saat geçmiş olmalıdır.
- Cihaz boşta.
- Cihaz bir kablosuz ağa bağlı (cihaz kullanıcısı mobil veri yedeklemelerini etkinleştirmediyse).
Pratikte, bu koşullar yaklaşık her gece meydana gelir, ancak bir cihaz hiçbir zaman yedeklenmeyebilir (örneğin, hiçbir zaman 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, artık dosya sistemine yazmadığından emin olmak için uygulamayı kapatır. Yedekleme sistemi, kötü bir kullanıcı deneyimini önlemek için varsayılan olarak ön planda çalışan uygulamaları yok sayar. android:backupInForeground
özelliğini true olarak ayarlayarak varsayılan davranışı geçersiz kılabilirsiniz.
Testi kolaylaştırmak için Android, uygulamanızın yedeklemesini manuel olarak başlatmanızı sağlayan 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 yüklendiğinde, Play Store'dan, cihaz kurulumu sırasında (sistem daha önce yüklenen uygulamaları yüklerken) veya adb
yükleme yapı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ştirilir.
İlk cihaz kurulumu sihirbazı sırasında kullanıcıya kullanılabilir yedek veri kümelerinin listesi gösterilir ve verileri hangi veriden geri yüklediği sorulur. Seçilen yedek veri kümesi, cihazın üst veri kümesi olur. Cihaz, kendi yedeklerinden veya üstlerine ait veri kümesinden geri yükleme yapabilir. Her iki kaynaktan yedeklemeler varsa cihaz, kendi yedeklemesine öncelik verir. Kullanıcı, cihaz kurulum sihirbazını izlemediyse cihaz yalnızca kendi yedeklerinden geri yükleyebilir.
Android, testi kolaylaştırmak için uygulamanızın geri yüklemesini manuel olarak başlatmanızı sağlayan araçlar içerir. Daha fazla bilgi edinmek için Yedekleme ve geri yüklemeyi test etme başlıklı makaleye göz atın.
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. Yedeklemeyi etkinleştirmek veya devre dışı bırakmak için uygulama manifest dosyanızda android:allowBackup
boole değerini ayarlayın. Varsayılan değer true
olsa da aşağıdaki örnekte gösterildiği gibi, manifest dosyanızdaki özelliği açık bir şekilde 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 işliyorsa 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.
Bu bölümde, nelerin yedekleneceğini kontrol etmek için özel XML kurallarının nasıl tanımlanacağı gösterilmektedir. Uygulamanız Android 12 (API düzeyi 31) veya sonraki sürümleri hedefliyorsa bu Android sürümlerini çalıştıran cihazlarda kullanıma sunulan yedek geri yükleme değişikliklerini desteklemek için bu bölümde açıklandığı şekilde ek bir grup XML yedekleme kuralı belirtmeniz gerekir.
Android 11 ve önceki sürümlerde yedeklemeyi kontrol etme
Android 11 (API düzeyi 30) veya önceki sürümleri çalıştıran cihazlarda hangi dosyaların yedekleneceğini kontrol etmek için bu bölümdeki adımları uygulayın.
AndroidManifest.xml
dosyanızda<application>
öğesine aşağıdaki örnekte gösterildiği gibiandroid:fullBackupContent
özelliğini ekleyin. Bu özellik, yedekleme kuralları içeren bir XML dosyasına işaret eder.<application ... android:fullBackupContent="@xml/backup_rules"> </application>
res/xml/
dizininde@xml/backup_rules
adlı bir XML dosyası oluşturun. Bu dosyada,<include>
ve<exclude>
öğeleriyle 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ımlayın
Uygulamanız, cihaza hassas bilgiler kaydediyorsa uygulama verilerinizin, kullanıcının yedekleme işlemine dahil edileceği koşulları belirtebilirsiniz. Android 9 (API düzeyi 28) veya sonraki sürümlerde aşağıdaki koşulları ekleyebilirsiniz:
clientSideEncryption
: Kullanıcının yedeği, istemci taraflı bir gizli anahtarla şifrelenir. Bu şifreleme şekli, kullanıcı Android 9 veya sonraki sürümlerde yedeklemeyi etkinleştirdiği ve cihazı için ekran kilidi ayarladığı (PIN, desen veya şifre) olduğu sürece Android 9 veya sonraki sürümleri çalıştıran cihazlarda etkinleştirilir.deviceToDeviceTransfer
: Kullanıcı, yedeğini yerel cihazdan cihaza aktarımı destekleyen başka bir cihaza aktarıyordur (örneğin, Google Pixel).
Geliştirme cihazlarınızı Android 9'a yükselttiyseniz veri yedeklemeyi devre dışı bırakıp yeniden etkinleştirmeniz gerekir. Bunun nedeni, Android'in yalnızca Ayarlar'da veya kurulum sihirbazında kullanıcıları bilgilendirdikten sonra yedeklemeleri bir istemci tarafı gizli anahtarıyla şifrelemesidir.
Dahil etme koşullarını bildirmek için requireFlags
özelliğini, yedek kurallar grubunuzdaki <include>
öğelerinde seçilen bir değere veya değerlere ayarlayın:
<?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 bu koşullu gereksinimleri, BackupDataOutput
nesnesinin aktarım işaretleri grubu ile özel yedek aracınızın FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED
veya FLAG_DEVICE_TO_DEVICE_TRANSFER
işaretleri arasında bit tabanlı bir karşılaştırma yaparak da yedekleme mantığınıza uygulayabilirsiniz.
Aşağıdaki kod snippet'i, bu yöntemin bir örneğini gösterir:
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 veya sonraki sürümleri çalıştıran cihazlarda hangi dosyaların yedeklendiğini kontrol etmek için bu bölümdeki adımları uygulayın.
AndroidManifest.xml
dosyanızda,android:dataExtractionRules
özelliğini<application>
öğesine aşağıdaki örnekte gösterildiği gibi ekleyin. Bu özellik, yedek kurallar içeren bir XML dosyasına işaret eder.<application ... android:dataExtractionRules="backup_rules.xml"> </application>
res/xml/
dizinindebackup_rules.xml
adlı bir XML dosyası oluşturun. Bu dosyada,<include>
ve<exclude>
öğeleriyle 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ırması söz dizimi
Yapılandırma dosyası için XML söz dizimi, uygulamanızın hedeflediği ve çalıştığı Android sürümüne bağlı olarak değişiklik gösterir.
Android 11 veya önceki sürümler
Android 11 veya önceki 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> </data-extraction-rules>
Yapılandırmanın her bölümü (<cloud-backup>
, <device-transfer>
) yalnızca o aktarım türü için geçerli olan kurallar içerir. Bu ayırma işlemi, örneğin, bir dosyayı veya dizini cihazdan cihaza (D2D) aktarımlar sırasında aktarırken Google Drive yedeklerinden hariç tutmanıza olanak tanır. Buluta yedeklenemeyecek kadar büyük ancak cihazlar arasında sorunsuz şekilde aktarılabilen dosyalarınız varsa bu özellik faydalıdır.
Belirli bir yedekleme modu için kural yoksa (örneğin, <device-transfer>
bölümü eksikse) bu mod, Yedeklenen dosyalar bölümünde açıklandığı gibi no-backup
ve cache
dizinleri dışındaki tüm içerikler için tamamen etkinleştirilir.
Uygulamanız, yedeklemenin yalnızca şifrelenebilir olduğunda (ö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ıtlamanın ayarlanması, kullanıcının cihazı şifrelemeyi desteklemiyorsa yedeklemelerin buluta gönderilmesini durdurur. Ancak D2D aktarımları sunucuya gönderilmediği için şifrelemeyi desteklemeyen cihazlarda bile çalışmaya devam eder.
Dahil etme ve hariç tutma öğ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 dosyayı 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 dosya içermez ve yalnızca belirtilen dosyaları yedekler. 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. Bu özellik, yedekleme için koşullu gereksinimlerin nasıl tanımlanacağı bölümünde daha ayrıntılı olarak ele alınmaktadır.getCacheDir()
,getCodeCacheDir()
veyagetNoBackupFilesDir()
tarafından döndürülen dizinlerdeki dosyalar, bunları dahil etmeye çalışsanız bile her zaman hariç tutulur.<exclude>
Yedekleme sırasında hariç tutulacak dosya veya klasörü belirtir. Genellikle yedeklemeden hariç tutulan bazı dosyaları aşağıda bulabilirsiniz:
Bir sunucu tarafından yayınlanan veya cihazda oluşturulan cihaza özgü tanımlayıcılara sahip dosyalar. Örneğin, Firebase Cloud Messaging (FCM), kullanıcılar uygulamanızı yeni bir cihaza her yüklediğinde bir kayıt jetonu oluşturmalıdır. Eski kayıt jetonu geri yüklenirse uygulama beklenmedik şekilde davranabilir.
Uygulamada 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 gizli dosyaların dosya sistemi üzerinde depolandığı 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
hizmetinin depolandığı dizin.external
:getExternalFilesDir()
tarafından döndürülen dizin.device_root
:root
gibi cihaz korumalı depolama alanı için kullanılır.device_file
:file
gibi cihaz korumalı depolama alanı için kullanılır.device_database
:database
gibi cihaz korumalı depolama alanı için kullanılır.device_sharedpref
:sharedpref
gibi cihaz korumalı depolama alanı için kullanılır.
path
Yedeklemeye dahil edilecek veya yedekten hariç tutulacak dosyayı 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 geçerli dizine başvurabilirsiniz, ancak güvenlik nedeniyle üst dizine (..
kullanma gibi) başvuramazsınız.- Bir dizin belirtirseniz kural, dizindeki ve yinelemeli alt dizinlerdeki tüm dosyalara uygulanır.
BackupAgent'ı Uygulama
Otomatik Yedekleme'yi kullanan uygulamaların BackupAgent
uygulaması gerekmez.
Ancak, isteğe bağlı olarak özel bir BackupAgent
uygulayabilirsiniz. Bunu yapmanın genellikle
iki nedeni vardır:
onRestoreFinished()
veonQuotaExceeded(long, long)
gibi yedekleme etkinlikleriyle ilgili bildirim almak istiyorsunuz. Bu geri çağırma yöntemleri, uygulama çalışmıyorken bile yürütülür.XML kurallarıyla yedeklemek istediğiniz dosya grubunu kolayca ifade edemezsiniz. Bu gibi nadir durumlarda, istediğinizi depolamak için
onFullBackup(FullBackupDataOutput)
değerini geçersiz kılan birBackupAgent
uygulayabilirsiniz. Sistemin varsayılan uygulamasını korumak içinsuper.onFullBackup()
ile üst sınıfta ilgili yöntemi çağırın.
Bir BackupAgent
uygularsanız sistem, varsayılan olarak uygulamanızın anahtar/değer çifti yedekleme ve geri yükleme işlemi 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 BackupAgent
içinde geri çağırma yöntemlerini yürütmesine izin vermek için uygulamayı kısıtlı 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'inde belirtilen herhangi bir alt sınıf yerine temel sınıf Application
somutlaştırılır.
BackupAgent
öğeniz, anahtar/değer yedeklemesi için kullanılan onBackup()
ve onRestore()
soyut yöntemlerini uygulamalıdır. Anahtar/değer çifti yedeklemesi gerçekleştirmek istemiyorsanız bu yöntemlerin uygulanışını boş bırakabilirsiniz.
Daha fazla bilgi için BackupAgent'ı genişletme sayfasına bakın.