Auto Backup trong Android

Đối với một số ứng dụng, người dùng có thể phải bỏ ra kha khá thời gian của mình để có thể tinh chỉnh, tùy chỉnh lại setting của ứng dụng đó. Khi người dùng đổi máy hay up đời lên, việc khôi phục - restore lại các settings cho người dùng là một việc mang lại trải nghiệm khá tuyệt vời cho người dùng, họ không còn phải loay hoay với việc setting lại, nghĩ lại xem ngày xưa mình đặt như nào. Và điều quan trọng là giảm thiểu tối đa các bước có thể để người dùng có thể khôi phục lại settings như trên devices trước đây của họ. Và bạn có thể sử dụng Auto Backup để có thể restore settings data ngay cả khi người dùng không login vào app của bạn.

Để có thể restore user's settings data trên devices mới, bạn phải đảm bảo rằng có backup các settings user sau:

  • Bất cứ setting nào mà người dùng đã sửa đổi, chẳng hạn như PreferenceScreen
  • Người dùng đã bật hoặc tắt chuông và thông báo
  • Bất kỳ các cờ boolean nào mà sử dụng để tracking việc user có/đã sử dụng hay bỏ qua các bước như: Màn hình Tutorial, Màn hình Introduction, ...

Lưu ý: Auto Backup chỉ hỗ trợ các devives Android 6.0 (API 23) trở lên.

Turn on Auto Backup

Đầu tiên hãy turn on Auto Backup trong app của bạn. Việc turn on Auto Backup được xác định thông qua attribute allowBackup được khai báo trong <application>.

Trong manifests/AndroidManifest.xml:

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        ...
</application>

Ở đây mình sẽ thử chạy sample app để có thể hình dung dễ dàng hơn. Bạn có thể tham khảo sample app tại đây

Login to sample app

Ở trong sample app này ta sẽ thực hiện làm 1 form đăng nhập và hiển thị hint để nhắc nhở người dùng địa chỉ email được đăng nhập lần cuối.

Chúng ta hãy thử login với tài khoản sau:

Sau khi login thành công, app sẽ lưu thông tin đăng nhập của bạn vào shared prefs. Trong thực tế auth key sẽ được gen từ username và password, ở đây ta tạm xài theo password.

Manually create and restore a backup

Ở phần này tạm thời chúng ta chưa xài auto, xài tay trước đã. Ta sẽ thực hiện các bước thủ công để tạo backup và restore data đã được backup cho ứng dụng sample.

Check to see if backups are enabled on your current device or emulator

Bước đầu tiên là phải kiểm tra xem thiết bị của bạn có enable backup không đã, phải enable thì mới có thể triển tiếp.

Sử dụng ADB để check hàng:

$ adb shell bmgr enabled
Backup Manager currently disabled

Như này tức là thiết bị của bạn chưa enable backup.

Để có thể enable backup lên bạn vào Settings -> tìm mục Backup -> chọn On, sau đó chọn Account mà bạn muốn sử dụng cho backup.

Sau khi đã thực hiện các bước để enable backup, thực hiện check lại:

$ adb shell bmgr enabled
Backup Manager currently enabled
$ adb shell bmgr list transports
  com.sonyericsson.mtp.extension.backuprestore.transport/.MtpTransport
  android/com.android.internal.backup.LocalTransport
  com.google.android.gms/.backup.migrate.service.D2dTransport
* com.google.android.gms/.backup.BackupTransportService

Ở đây mình đang sử dụng con Sony để test nên sau khi sử dụng command adb shell bmgr list transports nó hiện ra như trên, trên device khác có thể sẽ có 1 vài dòng khác, quan trọng dòng android/com.android.internal.backup.LocalTransport* com.google.android.gms/.backup.BackupTransportService là được.

Force a backup of your application

Sau khi đã check và enable như bước trên rồi thì chúng ta tiếp tục đến bước backup data cho ứng dụng, cụ thể ở đây là app sample:

$ adb shell bmgr backupnow com.googlecodelabs.example.backupexample
Running incremental backup for 1 requested packages.
Package @pm@ with result: Success
Package com.googlecodelabs.example.backupexample with progress: 1536/1024
Package com.googlecodelabs.example.backupexample with progress: 2560/1024
Package com.googlecodelabs.example.backupexample with result: Success
Backup finished with result: Success

Sau khi chạy command adb shell bmgr backupnow com.googlecodelabs.example.backupexample mà nó hiển thị như trên là xong rồi đó =)) đơn giản phải không 😄

Uninstall your application

Backup thì cũng đã chạy xong, giờ chúng ta sẽ thực hiện uninstall sample app này đi. Ở đây ta sẽ làm theo cách là uninstall app rồi lại re-install app để check lại dữ liệu đã backup, làm cách này cho đơn giản và dễ hình dung.

Uninstall app với ADB:

$ adb uninstall com.googlecodelabs.example.backupexample
Success

Re-install your application without restore

Ta sẽ thực hiện cài đặt lại sample, nhớ rằng là cài mới hoàn toàn, build lại app lên devices nha.

Restore your app's data

Cài lại rồi, thực hiện restore data thôi:

  1. Đầu tiên fetch data backup từ Auto Backup
# see all backup information (optional - có thể dùng hoặc không)
# như này thì ta sẽ nhìn thấy toàn bộ thông tin backup sẽ có thể là list rất dài
$ adb shell dumpsys backup
...
# Nên sử dụng command này để xác định nhanh nhất backup của mình
$ adb shell dumpsys backup | grep "com.googlecodelabs.example.backupexample" -A 4 | grep Current
Current:   392da913e05115f0
  1. Sau khi tìm thấy data backup rồi thì thực hiện restore thôi
# adb shell bmgr restore <token> com.googlecodelabs.example.backupexample
$ adb shell bmgr restore 392da913e05115f0 com.googlecodelabs.example.backupexample
Scheduling restore: F8332
restoreStarting: 1 packages
onUpdate: 0 = com.googlecodelabs.example.backupexample
restoreFinished: 0
done

Như vậy là restore xong rồi, mở lại sample để check hàng thôi. Các bạn có thể thấy app đã được login luôn với đầy đủ thông tin trước đó.

Configure Auto Backup

Sau khi thực hiện các bước thủ công phía trên chắc các bạn đã phần nào đã hiểu được các bước cơ bản để backup - restore data, đó là các step cơ bản. Và đã hiểu rồi thì thôi không xài thủ công nữa, giờ mình sẽ thực hiện config Auto Backup cho app để người dùng ai cũng có thể sử dụng dễ dàng được, các bước thủ công bên trên chỉ xài cho dev thôi 😄

Như đã thấy ở phần trên, tất cả thông tin đã restore lại, nhưng ở phần này thì chúng ta sẽ chỉ config cho những giá trị cụ thể mong muốn.

Checking the data restored from a backup

Đối với ứng dụng thực tế thì bạn không nên backup cả những thông tin nhạy như password chẳng hạn, chúng ta chỉ nên backup những data nào cần thiết mà không quá nhạy cảm như password, đây là lý do chúng ta cần config cho những giá trị cụ thể không thể để full như trong phần backup thủ công được.

Cụ thể đối với sample app, chúng ta chỉ mong muốn tạo ra một hint cho những lần đăng nhập sau, gợi nhớ cho người dùng về last email mà họ đã đăng nhập, như vậy sẽ hay hơn là lưu trữ lại cả password của người dùng.

*Chú ý: Để đảm bảo được rằng backup data có lợi cho người dùng, bản backup nên folllow theo:

  • User settings
  • Thông tin về username hoặc email đã được sử dụng để đăng nhập*

Bản backup không nên chứa đựng full tất cả thông tin của user vì điều này không thực sự tốt.

Auto Backup cho phép bạn cấu hình cụ thể các files có thể backup hoặc các files sẽ không được backup. Theo mặc định, tất cả các files trong foder data của ứng dụng sẽ được backup. Và để config theo mong muốn, ta sử dụng attribute android:fullBackupContent trong <application>:

Trong manifests/AndroidManifest.xml:

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:fullBackupContent="@xml/backup_descriptor">
        ...
</application>

Ở đây bạn có thể thấy giá trị đầu vào là file xml android:fullBackupContent="@xml/backup_descriptor" file xml này sẽ quy định các config mà bạn mong muốn.

res/xml/backup_descriptor.xml:

<?xml version="1.0" encoding="utf-8"?>
full-backup-content>
    <!-- TODO Remove the following "exclude" elements to make them a part of the auto backup -->
    <!-- Exclude the shared preferences file that contains the GCM registrationId -->
    <exclude
        domain="sharedpref"
        path="com.googlecodelabs.example.backupexample.PREF_LOGIN_DETAILS.xml" />
</full-backup-content>

Ta sẽ thực hiện config loại bỏ không backup file com.googlecodelabs.example.backupexample.PREF_LOGIN_DETAILS.xml

Bạn có thể chỉ định các files được loại bỏ:

  • device ID như GCM registration IDs.
  • Databases: để loại bỏ database bạn có thể sử dụng domain="database" hoặc để cho Android Studio scan app của bạn sử dụng SQLiteHelper và tự add exclude.
  • Các files liên quan đến debug như instant run files: <exclude domain="file" path="instant-run"/>

Ngoài exclude element ra bạn cũng có thể sử dụng include element để chỉ định cụ thể những thành phần có thể backup. Nếu bạn sử dụng include element thì default của hệ thống sẽ không còn nữa, tất cả các option default sẽ bị loại bỏ và chỉ backup các thành phần được chỉ định theo include element.

Rồi, sau khi đã config xong ta thực hiện build lại app và làm các bước install app -> đăng nhập -> uninstall app -> và check lại app xem có sự khác biệt gì so với phần thủ công không.

Và đây là kết quả, bạn có thể thấy được rằng chỉ phần email được backup và hiển thị dưới dạng hint để gợi ý cho người dùng biết email cuối cùng được sử dụng để login.

Như vậy trên đây là những điều cơ bản về Auto Backup trong Android, mong nó có thể giúp bạn xây dựng app với trải nghiệm người dùng tốt hơn.