Mencadangkan data pengguna dengan Auto Backup

Pencadangan Otomatis untuk Aplikasi otomatis mencadangkan data pengguna dari aplikasi yang menargetkan dan berjalan pada Android 6.0 (level API 23) atau yang lebih tinggi. Android menyimpan data aplikasi dengan menguploadnya ke Google Drive pengguna, yang dilindungi oleh kredensial Akun Google pengguna. Cadangan dienkripsi menyeluruh pada perangkat yang menjalankan Android 9 atau yang lebih baru menggunakan PIN, pola, atau sandi perangkat. Jumlah data dibatasi hingga 25 MB per pengguna. Menyimpan data cadangan tidak dikenai biaya. Aplikasi Anda dapat menyesuaikan proses pencadangan atau memilih tidak mencadangkan dengan menonaktifkan pencadangan.

Untuk ringkasan mengenai opsi pencadangan Android dan panduan terkait data apa saja yang sebaiknya dicadangkan dan dipulihkan, baca ringkasan pencadangan data.

File yang dicadangkan

Secara default, Pencadangan Otomatis menyertakan file di sebagian besar direktori yang ditetapkan oleh sistem ke aplikasi Anda:

Pencadangan Otomatis mengecualikan file di direktori yang ditampilkan oleh getCacheDir(), getCodeCacheDir(), dan getNoBackupFilesDir(). File yang disimpan di lokasi ini hanya diperlukan sementara dan sengaja dikecualikan dari operasi pencadangan.

Anda dapat mengonfigurasi aplikasi agar menyertakan dan mengecualikan file tertentu. Untuk mengetahui informasi selengkapnya, lihat bagian Menyertakan dan mengecualikan file.

Lokasi cadangan

Data cadangan disimpan dalam folder pribadi di akun Google Drive pengguna, yang dibatasi hingga 25 MB per aplikasi. Data yang disimpan tidak memengaruhi kuota pribadi Google Drive pengguna. Hanya cadangan terbaru yang disimpan. Saat cadangan dibuat, cadangan sebelumnya akan dihapus. Data cadangan tidak dapat dibaca oleh pengguna atau aplikasi lain di perangkat.

Pengguna dapat melihat daftar aplikasi yang telah dicadangkan di aplikasi Android Google Drive. Pada perangkat Android, pengguna dapat menemukan daftar ini di panel navigasi aplikasi Drive di bagian Setelan > Pencadangan dan reset.

Cadangan dari setiap perangkat-penyiapan-masa pakai disimpan dalam set data terpisah, seperti dijelaskan dalam contoh berikut:

  • Jika pengguna memiliki dua perangkat, set data cadangan akan dibuat untuk setiap perangkat.

  • Jika pengguna mereset perangkat ke setelan pabrik, lalu menyiapkannya dengan akun yang sama, cadangan akan disimpan dalam set data baru. Set data lama otomatis dihapus setelah tidak aktif selama beberapa waktu.

Jadwal pencadangan

Pencadangan otomatis terjadi saat semua kondisi berikut terpenuhi:

  • Pengguna telah mengaktifkan pencadangan di perangkatnya. Pada Android 9, setelan ini ada di Setelan > Sistem > Pencadangan.
  • Minimal 24 jam telah berlalu sejak pencadangan terakhir.
  • Tidak ada aktivitas pada perangkat.
  • Perangkat tersambung ke jaringan Wi-Fi (jika pengguna perangkat belum memilih untuk menjalankan pencadangan menggunakan data seluler).

Dalam praktiknya, kondisi ini terjadi kira-kira setiap malam, tetapi mungkin juga perangkat tidak pernah menjalankan pencadangan (misalnya, jika tidak pernah terhubung ke jaringan). Untuk menghemat bandwidth jaringan, upload hanya dilakukan jika data aplikasi telah berubah.

Selama Pencadangan Otomatis, sistem akan menghentikan aplikasi untuk memastikan tidak lagi menuliskan ke sistem file. Secara default, sistem pencadangan mengabaikan aplikasi yang berjalan di latar depan untuk menghindari pengalaman pengguna yang buruk. Anda dapat mengganti perilaku default ini dengan menyetel atribut android:backupInForeground ke benar (true).

Untuk menyederhanakan pengujian, Android menyertakan alat yang memungkinkan Anda memulai pencadangan aplikasi secara manual. Untuk informasi lebih lanjut, lihat Menguji pencadangan dan pemulihan.

Jadwal pemulihan

Data dipulihkan setiap kali aplikasi diinstal, baik dari Play Store, selama penyiapan perangkat (saat sistem menginstal aplikasi yang pernah diinstal sebelumnya), atau dengan menjalankan penginstalan adb. Operasi pemulihan terjadi setelah APK diinstal, tetapi sebelum aplikasi dapat diluncurkan oleh pengguna.

Selama wizard penyiapan perangkat awal, daftar set data cadangan yang tersedia akan ditampilkan kepada pengguna diikuti pertanyaan dari set data cadangan mana data akan dipulihkan. Set data cadangan yang dipilih akan menjadi set data ancestral untuk perangkat tersebut. Perangkat dapat dipulihkan dari cadangannya sendiri atau set data ancestral. Jika cadangan dari kedua sumber tersedia, perangkat akan memprioritaskan cadangannya sendiri. Jika pengguna tidak memanfaatkan wizard penyiapan perangkat, perangkat hanya dapat dipulihkan dari cadangannya sendiri.

Untuk menyederhanakan pengujian, Android menyertakan alat yang memungkinkan Anda memulai pemulihan aplikasi secara manual. Untuk informasi lebih lanjut, lihat Menguji pencadangan dan pemulihan.

Mengaktifkan dan menonaktifkan pencadangan

Aplikasi yang menargetkan Android 6.0 (level API 23) atau yang lebih baru otomatis mengimplementasikan Pencadangan Otomatis. Di file manifes aplikasi, tetapkan nilai boolean android:allowBackup untuk mengaktifkan atau menonaktifkan pencadangan. Nilai defaultnya adalah true, tetapi sebaiknya setel atribut secara eksplisit dalam manifes, seperti yang ditunjukkan dalam contoh berikut:

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

Anda dapat menonaktifkan pencadangan dengan menyetel android:allowBackup ke false. Anda mungkin perlu menggunakan opsi ini jika aplikasi Anda dapat membuat ulang statusnya melalui mekanisme lain, atau jika aplikasi Anda menangani informasi sensitif.

Menyertakan dan mengecualikan file

Secara default, sistem mencadangkan hampir semua data aplikasi. Untuk mengetahui informasi selengkapnya, lihat bagian tentang file yang dicadangkan.

Bagian ini menunjukkan cara menetapkan aturan XML kustom untuk mengontrol file apa saja yang dicadangkan. Jika aplikasi menargetkan Android 12 (level API 31) atau yang lebih baru, Anda harus menentukan serangkaian aturan pencadangan XML tambahan, seperti yang dijelaskan di bagian ini, untuk mendukung perubahan pada pemulihan cadangan yang diperkenalkan untuk perangkat yang menjalankan versi Android ini.

Mengontrol pencadangan di Android 11 dan yang lebih lama

Ikuti langkah-langkah di bagian ini untuk mengontrol file mana yang dicadangkan di perangkat yang menjalankan Android 11 (level API 30) atau yang lebih rendah.

  1. Dalam file AndroidManifest.xml Anda, tambahkan atribut android:fullBackupContent ke elemen <application>, seperti yang ditunjukkan dalam contoh berikut. Atribut ini mengarah ke file XML yang berisi aturan pencadangan.

    <application ...
     android:fullBackupContent="@xml/backup_rules">
    </application>
    
  2. Buat file XML bernama @xml/backup_rules di direktori res/xml/. Dalam file ini, tambahkan aturan dengan elemen <include> dan <exclude>. Contoh berikut mencadangkan semua preferensi bersama kecuali device.xml:

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

Menetapkan kondisi perangkat yang diperlukan untuk pencadangan

Jika aplikasi Anda menyimpan informasi sensitif pada perangkat, Anda dapat menentukan kondisi yang mengatur penyertaan data aplikasi Anda dalam cadangan pengguna. Anda dapat menambahkan kondisi berikut pada Android 9 (API level 28) atau yang lebih baru:

Jika sudah mengupgrade perangkat pengembangan ke Android 9, Anda perlu menonaktifkan lalu mengaktifkan kembali pencadangan data setelah proses upgrade. Hal ini karena Android hanya mengenkripsi cadangan dengan secret sisi klien setelah memberi tahu pengguna melalui Setelan atau wizard penyiapan.

Untuk mendeklarasikan kondisi penyertaan, tetapkan atribut requireFlags ke nilai yang dipilih atau nilai dalam elemen <include> dalam kumpulan aturan pencadangan:

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>

Jika aplikasi Anda mengimplementasikan sistem pencadangan nilai kunci atau jika Anda menerapkan BackupAgent sendiri, Anda juga dapat menerapkan persyaratan bersyarat ini pada logika pencadangan dengan melakukan perbandingan bitwise antara kumpulan tanda transpor objek BackupDataOutput dan tanda FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED atau FLAG_DEVICE_TO_DEVICE_TRANSFER agen pencadangan kustom Anda.

Cuplikan kode berikut menunjukkan contoh penggunaan metode ini:

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.
}

Mengontrol cadangan di Android 12 atau yang lebih baru

Jika aplikasi Anda menargetkan Android 12 (level API 31) atau yang lebih baru, ikuti langkah-langkah di bagian ini untuk mengontrol file mana yang dicadangkan di perangkat yang menjalankan Android 12 atau yang lebih baru.

  1. Dalam file AndroidManifest.xml Anda, tambahkan atribut android:dataExtractionRules ke elemen <application>, seperti yang ditunjukkan dalam contoh berikut. Atribut ini mengarah ke file XML yang memuat aturan pencadangan.

    <application ...
     android:dataExtractionRules="backup_rules.xml">
    </application>
    
  2. Buat file XML bernama backup_rules.xml di direktori res/xml/. Dalam file ini, tambahkan aturan dengan elemen <include> dan <exclude>. Contoh berikut mencadangkan semua preferensi bersama kecuali device.xml:

    <?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>
    

Sintaksis konfigurasi XML

Sintaksis XML untuk file konfigurasi bervariasi bergantung pada versi Android yang ditargetkan dan dijalankan oleh aplikasi Anda.

Android 11 atau yang lebih lama

Gunakan sintaksis XML berikut untuk file konfigurasi yang mengontrol pencadangan untuk perangkat yang menjalankan Android 11 atau yang lebih lama.

<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 atau yang lebih baru

Jika aplikasi Anda menargetkan Android 12 (level API 31) atau yang lebih baru, gunakan sintaksis XML berikut untuk file konfigurasi yang mengontrol pencadangan untuk perangkat yang menjalankan Android 12 atau yang lebih baru.

<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>

Setiap bagian konfigurasi (<cloud-backup>, <device-transfer>) berisi aturan yang hanya berlaku untuk jenis transfer tersebut. Pemisahan ini memungkinkan Anda, misalnya, mengecualikan file atau direktori dari cadangan Google Drive saat masih mentransfernya selama transfer perangkat-ke-perangkat (D2D). Hal ini berguna jika Anda memiliki file berukuran terlalu besar untuk dicadangkan ke cloud, tetapi dapat ditransfer antar-perangkat tanpa masalah.

Jika tidak ada aturan untuk mode pencadangan tertentu, seperti jika bagian <device-transfer> tidak ada, mode tersebut akan diaktifkan sepenuhnya untuk semua konten kecuali untuk direktori no-backup dan cache, seperti dijelaskan di bagian File yang dicadangkan.

Aplikasi Anda dapat menetapkan flag disableIfNoEncryptionCapabilities di bagian <cloud-backup> untuk memastikan pencadangan hanya terjadi jika dapat dienkripsi, seperti saat pengguna memiliki layar kunci. Menyetel batasan ini akan mencegah cadangan dikirim ke cloud jika perangkat pengguna tidak dapat mendukung enkripsi. Akan tetapi, karena transfer D2D tidak dikirim ke server, pencadangan akan terus beroperasi bahkan pada perangkat yang tidak mendukung enkripsi.

Sintaksis untuk elemen sertakan dan kecualikan

Di dalam tag <full-backup-content>, <cloud-backup>, dan <device-transfer> (bergantung pada versi Android perangkat dan targetSDKVersion aplikasi), Anda dapat menentukan elemen <include> dan <exclude>:

<include>

Menentukan file atau folder yang akan dicadangkan. Secara default, Auto Backup menyertakan hampir semua file aplikasi. Jika Anda menentukan elemen <include>, sistem tidak lagi menyertakan semua file secara default dan mencadangkan hanya file yang ditentukan. Untuk menyertakan beberapa file, gunakan beberapa elemen <include>.

Di Android 11 dan yang lebih lama, elemen ini juga dapat berisi atribut requireFlags, yang menjelaskan cara menentukan persyaratan bersyarat untuk pencadangan dibahas secara lebih mendetail.

File di direktori yang ditampilkan oleh getCacheDir(), getCodeCacheDir(), atau getNoBackupFilesDir() selalu dikecualikan, meskipun Anda mencoba menyertakannya.

<exclude>

Menentukan file atau folder yang akan dikecualikan selama proses pencadangan. Berikut ini beberapa file yang biasanya dikecualikan dari pencadangan:

  • File yang menyimpan ID khusus perangkat, baik yang diterbitkan oleh server maupun yang dihasilkan pada perangkat. Misalnya, Firebase Cloud Messaging (FCM) perlu membuat token registrasi setiap kali pengguna menginstal aplikasi Anda di perangkat baru. Jika token registrasi lama dipulihkan, aplikasi mungkin menampilkan perilaku yang tidak terduga.

  • File yang terkait dengan proses debug aplikasi.

  • File besar yang menyebabkan aplikasi melebihi kuota pencadangan 25 MB.

Setiap elemen <include> dan <exclude> harus menyertakan dua atribut berikut:

domain

Menentukan lokasi resource. Nilai yang valid untuk atribut ini mencakup hal berikut:

  • root: direktori di sistem file tempat semua file pribadi dalam aplikasi ini disimpan.
  • file: direktori yang ditampilkan oleh getFilesDir().
  • database: direktori yang ditampilkan oleh getDatabasePath(). Database yang dibuat dengan SQLiteOpenHelper disimpan di sini.
  • sharedpref: direktori tempat SharedPreferences disimpan.
  • external: direktori yang ditampilkan oleh getExternalFilesDir().
  • device_root: seperti root, tetapi untuk penyimpanan yang dilindungi perangkat.
  • device_file: seperti file, tetapi untuk penyimpanan yang dilindungi perangkat.
  • device_database: seperti database, tetapi untuk penyimpanan yang dilindungi perangkat.
  • device_sharedpref: seperti sharedpref, tetapi untuk penyimpanan yang dilindungi perangkat.
path

Menentukan file atau folder yang akan disertakan atau dikecualikan dari pencadangan. Perhatikan hal berikut:

  • Atribut ini tidak mendukung sintaksis karakter pengganti atau ekspresi reguler.
  • Anda dapat merujuk direktori saat ini menggunakan ./, tetapi Anda tidak dapat mereferensikan direktori induk, misalnya menggunakan .., untuk alasan keamanan.
  • Jika Anda menentukan direktori, aturan tersebut akan berlaku pada semua file dalam direktori dan subdirektori berulang.

Mengimplementasikan BackupAgent

Aplikasi yang mengimplementasikan Pencadangan Otomatis tidak perlu mengimplementasikan BackupAgent. Namun, Anda dapat memilih untuk mengimplementasikan BackupAgent kustom. Biasanya, ada dua alasan untuk menggunakan opsi ini:

  • Anda ingin menerima notifikasi peristiwa pencadangan, seperti onRestoreFinished() dan onQuotaExceeded(long, long). Metode callback ini akan tetap dieksekusi meskipun aplikasi tidak sedang berjalan.

  • Anda tidak dapat mengekspresikan dengan mudah kumpulan file yang ingin Anda cadangkan dengan aturan XML. Dalam kasus yang jarang terjadi ini, Anda dapat mengimplementasikan BackupAgent sebagai pengganti onFullBackup(FullBackupDataOutput) untuk menyimpan file yang Anda inginkan. Untuk mempertahankan implementasi default sistem, panggil metode terkait pada superclass dengan super.onFullBackup().

Jika Anda mengimplementasikan BackupAgent, secara default sistem mengharapkan aplikasi Anda menjalankan pencadangan dan pemulihan nilai kunci. Untuk menggunakan Pencadangan Otomatis berbasis file, tetapkan atribut android:fullBackupOnly ke true dalam manifes aplikasi Anda.

Selama operasi pencadangan dan pemulihan otomatis, sistem meluncurkan aplikasi dalam mode terbatas agar aplikasi tidak mengakses file yang mungkin menyebabkan konflik dan untuk memungkinkan aplikasi mengeksekusi metode callback dalam BackupAgent-nya. Dalam mode terbatas ini, aktivitas utama aplikasi tidak otomatis diluncurkan, penyedia kontennya tidak diinisialisasi, dan class dasar Application dibuat instance, bukan subclass apa pun yang dideklarasikan dalam manifes aplikasi.

BackupAgent Anda harus mengimplementasikan metode abstrak di onBackup() dan onRestore(), yang digunakan untuk pencadangan nilai kunci. Jika tidak ingin melakukan pencadangan nilai kunci, Anda dapat membiarkan implementasi metode tersebut kosong.

Untuk mengetahui informasi selengkapnya, lihat Memperluas BackupAgent.