1page.title=Configuring Auto Backup for Apps
2page.tags=backup, marshmallow, androidm
3page.keywords=backup, autobackup
4page.image=images/cards/card-auto-backup_2x.png
5
6@jd:body
7
8<div id="tb-wrapper">
9<div id="tb">
10<h2>This lesson teaches you to</h2>
11<ol>
12        <li><a href="#configuring">Configure Data Backup</a></li>
13        <li><a href="#previous-androids">Support Lower Versions of Android</a></li>
14        <li><a href="#testing">Test Backup Configuration</a></li>
15        <li><a href="#issues">Handle Google Cloud Messaging</a></li>
16</ol>
17    <h2>You should also read</h2>
18    <ul>
19      <li><a href="{@docRoot}guide/topics/data/backup.html">Data Backup</a></li>
20      <li><a href="{@docRoot}training/backup/backupapi.html">Using the Backup API</a>
21      </li>
22    </ul>
23
24</div>
25</div>
26
27<p>
28  Users frequently invest time and effort to configure apps just the way they like them. Switching
29  to a new device can cancel out all that careful configuration. For apps whose <a href=
30  "{@docRoot}guide/topics/manifest/uses-sdk-element.html#target">target SDK version</a>
31  is Android 6.0 (API level 23) and higher, devices running Android 6.0 and higher automatically
32  back up app data to the cloud. The system performs this automatic backup
33  for nearly all app data by default, and does so without your having to write any additional app
34  code.
35</p>
36
37<p class="note">
38<strong>Note:</strong> To protect user privacy, the device user must have opted in to Google
39services for Auto Backup to work. The Google services opt-in dialog appears when the user goes
40through the Setup Wizard or configures the first Google account on the device.
41</p>
42
43<p>
44  When a user installs your app on
45  a new device, or reinstalls your app on one (for example, after a factory reset), the system
46  automatically restores the app data from the cloud. This lesson provides information about how to
47  configure the Auto Backup for Apps feature, explaining its default behavior and how to
48  exclude data that you don't want the system to back up.
49</p>
50
51<p>
52  The automatic backup feature preserves the data your app creates on a user device by uploading it
53  to the user’s Google Drive account and encrypting it. There is no charge to you or the user for
54  data storage, and the saved data does not count towards the user's personal Google Drive quota.
55  Each app can store up to 25MB. Once its backed-up data reaches 25MB, the app no longer sends
56  data to the cloud. If the system performs a data restore, it uses the last data snapshot that
57  the app had sent to the cloud.
58</p>
59
60<p>Automatic backups occur when the following conditions are met:</p>
61  <ul>
62     <li>The device is idle.</li>
63     <li>The device is charging.</li>
64     <li>The device is connected to a Wi-Fi network.</li>
65     <li>At least 24 hours have elapsed since the last backup.</li>
66  </ul>
67</p>
68
69<h2 id="configuring">Configure Data Backup</h2>
70
71<p>
72  On devices running Android 6.0 (API level 23) or higher, the default system behavior is to back up
73  almost all data that an app creates. The exception is <a href="#auto-exclude">
74  automatically excluded data files</a>. This section explains how you can use settings in
75  your app <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">manifest</a> to further
76  limit and configure what data the system backs up.
77</p>
78
79<h3 id="include-exclude">Including or excluding data</h3>
80
81<p>
82  Depending on what data your app needs and how you save it, you may need to set specific
83  rules for including or excluding certain files or directories. Auto Backup for Apps
84  lets you set these backup rules through the app manifest, in which you specify a backup scheme
85  configuration XML file. For example:
86</p>
87
88<pre>
89&lt;?xml version="1.0" encoding="utf-8"?&gt;
90&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
91        xmlns:tools="http://schemas.android.com/tools"
92        package="com.my.appexample"&gt;
93    &lt;uses-sdk android:minSdkVersion="23"/&gt;
94    &lt;uses-sdk android:targetSdkVersion="23"/&gt;
95    &lt;application ...
96<strong>        android:fullBackupContent="&#64;xml/mybackupscheme"&gt;</strong>
97    &lt;/app&gt;
98    ...
99&lt;/manifest&gt;
100</pre>
101
102<p>
103  In this example, the <code>android:fullBackupContent</code> attribute specifies an XML file
104  called {@code mybackupscheme.xml}, which resides in the <code>res/xml/</code> directory of your
105  app development project. This configuration file contains rules controlling which files are backed
106  up. The following example code shows a configuration file that excludes a specific file,
107  {@code device_info.db}:
108</p>
109
110<pre>
111&lt;?xml version="1.0" encoding="utf-8"?&gt;
112&lt;full-backup-content&gt;
113    &lt;exclude domain="database" path="device_info.db"/&gt;
114&lt;/full-backup-content&gt;
115</pre>
116
117<h3 id="auto-exclude">Automatically excluded data files</h3>
118
119<p>
120  Most apps do not need to, and in fact should not, back up all data. For example, the system
121  should not back up temporary files and caches. For this reason, the automatic backup
122  service excludes certain data files by default:
123</p>
124
125<ul>
126  <li>Files in the directories to which the
127  {@link android.content.Context#getCacheDir getCacheDir()} and
128  {@link android.content.Context#getCodeCacheDir getCodeCacheDir()} methods refer.
129  </li>
130
131  <li>Files located on external storage, unless they reside in the directory to which the
132    {@link android.content.Context#getExternalFilesDir getExternalFilesDir()} method refers.
133  </li>
134
135  <li>Files located in the directory to which the
136    {@link android.content.Context#getNoBackupFilesDir getNoBackupFilesDir()} method refers.
137  </li>
138</ul>
139<h3>Backup Configuration Syntax</h3>
140
141<p>
142  The backup service configuration allows you to specify what files to include or exclude from
143  backup. The syntax for the data backup configuration XML file is as follows:
144</p>
145
146<pre>
147&lt;full-backup-content&gt;
148    &lt;include domain=["file" | "database" | "sharedpref" | "external" | "root"]
149    path="string" /&gt;
150    &lt;exclude domain=["file" | "database" | "sharedpref" | "external" | "root"]
151    path="string" /&gt;
152&lt;/full-backup-content&gt;
153</pre>
154
155<p>
156  The following elements and attributes allow you to specify the files to include in, and exclude
157  from, backup:
158</p>
159
160<ul>
161  <li>
162  <code>&lt;include&gt;</code>: Specifies a set of resources to
163  back up, instead of having the system back up all data in your app by default. If you specify
164  an <code>&lt;include&gt;</code> element, the system backs up <em>only the resources specified</em>
165  with this element. You can specify multiple sets of resources to back up by using multiple
166  <code>&lt;include&gt;</code> elements
167  </li>
168
169  <li>
170  <code>&lt;exclude&gt;</code>: Specifies any data you want the system to exclude
171  when it does a full backup. If you target the same set of resources with both the
172  <code>&lt;include&gt;</code> and <code>&lt;exclude&gt;</code> elements,
173  <code>&lt;exclude&gt;</code> takes precedence.
174  </li>
175
176  <li>
177  <code>domain</code>: Specifies the type of resource you want to include in,
178  or exclude from, backup. Valid values for this attribute include:
179
180
181
182  <ul>
183    <li>
184    <code>root</code>: Specifies that the resource is in the app’s root directory.
185    </li>
186
187    <li>
188    <code>file</code>: Specifies a resource in the directory returned by the
189    {@link android.content.Context#getFilesDir getFilesDir()} method.
190    </li>
191
192    <li>
193    <code>database</code>: Specifies a database that the
194    {@link android.content.Context#getDatabasePath getDatabasePath()} method returns, or that
195    the app interacts with via the {@link android.database.sqlite.SQLiteOpenHelper} class.
196    </li>
197
198    <li>
199    <code>sharedpref</code>: Specifies a {@link android.content.SharedPreferences} object
200    that the {@link android.content.Context#getSharedPreferences getSharedPreferences()}
201    method returns.
202    </li>
203
204    <li>
205    <code>external</code>: Specifies that the resource is in external storage, and corresponds
206    to a file in the directory that the
207    {@link android.content.Context#getExternalFilesDir getExternalFilesDir()} method returns.
208    </li>
209  </ul>
210  </li>
211    <li>
212    <code>path</code>: Specifies the file path to a resource that you want to include in, or
213    exclude from, backup.
214    </li>
215
216  </li>
217</ul>
218
219
220<h3 id="disabling">Disabling data backups</h3>
221
222<p>
223  You can choose to prevent automatic backups of any of your app data by setting the
224  <code>android:allowBackup</code> attribute to <code>false</code> in the {@code app} element of
225  your manifest. This setting is illustrated in the following example:
226</p>
227
228<pre>
229&lt;?xml version="1.0" encoding="utf-8"?&gt;
230&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
231        xmlns:tools="http://schemas.android.com/tools"
232        package="com.my.appexample"&gt;
233    &lt;uses-sdk android:minSdkVersion="23"/&gt;
234    &lt;uses-sdk android:targetSdkVersion="23"/&gt;
235    &lt;application ...
236<strong>        android:allowBackup="false"&gt;</strong>
237    &lt;/application&gt;
238    ...
239&lt;/manifest&gt;
240</pre>
241
242<h2 id="previous-androids">Support Lower Versions of Android</h2>
243
244<p>There are two scenarios in which you may also need to support versions of Android lower
245than 6.0 (API level 23): You may be updating your existing app to take advantage of the
246new auto backup functionality in Android 6.0, while wanting
247to continue supporting earlier versions of Android. Or you may be releasing a new app, but
248want to make sure devices running on versions of Android predating 6.0 also have backup
249functionality.</p>
250
251<h3 id="updating">Updating an existing app to support auto backup</h3>
252
253<p>Earlier versions of Android supported a key/value-pair-based backup mechanism, in which the app
254defines a subclass of {@link android.app.backup.BackupAgent} and sets
255<a href="{@docRoot}guide/topics/manifest/application-element.html#agent">
256{@code android:backupAgent}</a> in its
257<a href="{@docRoot}guide/topics/manifest/application-element.html">app manifest</a>. If your app
258used this legacy approach, you can transition to full-data backups by adding the
259{@code android:fullBackupOnly="true"} attribute to the
260<a href="{@docRoot}guide/topics/manifest/application-element.html">{@code &lt;application/&gt;}</a>
261element in the manifest. When running on a device with Android 5.1
262(API level 22) or lower, your app ignores this value in the manifest, and continues performing
263backups in the previous manner.</p>
264
265<p>Even if you’re not using key/value backups, you can still use the approach described above to do
266any custom processing in {@link android.app.Activity#onCreate(android.os.Bundle) onCreate()}
267or {@link android.app.backup.BackupAgent#onFullBackup onFullBackup()}. You can also use that
268approach to receive a notification when a restore operation happens in
269{@link android.app.backup.BackupAgent#onRestoreFinished onRestoreFinished()}. If you want to retain
270the system's default implementation of
271<a href="#include-exclude">XML include/exclude rules handling</a>, call
272{@link android.app.backup.BackupAgent#onFullBackup super.onFullBackup()}.</p>
273
274<h3 id="lower-versions">Giving your new app support for lower versions of Android</h3>
275
276<p>If you are creating a new app that targets Android 6.0, but you also want to enable cloud backup
277for devices running on Android 5.1 (API level 22) and lower, you must also
278<a href="{@docRoot}training/backup/backupapi.html">implement the Backup API</a>.</p>
279
280<h2 id="testing">Test Backup Configuration</h2>
281
282<p>
283  Once you have created a backup configuration, you should test it to make sure your app saves data
284  and can restore it properly.
285</p>
286
287
288<h3>Enabling Backup Logging</h3>
289
290<p>
291  To help determine how the backup feature is parsing your XML file, enable logging before
292  performing a test backup:
293</p>
294
295<pre class="no-pretty-print">
296$ adb shell setprop log.tag.BackupXmlParserLogging VERBOSE
297</pre>
298
299<h3>Testing Backup</h3>
300
301<p>To manually run a backup, first initialize the Backup Manager by executing the following
302  command:
303</p>
304
305<pre class="no-pretty-print">
306$ adb shell bmgr run
307</pre>
308
309<p>
310  Next, manually back up your application using the following command. Use the
311  <code>&lt;PACKAGE&gt;</code> parameter to specify the package name for your app:
312</p>
313
314<pre class="no-pretty-print">
315$ adb shell bmgr fullbackup &lt;PACKAGE&gt;</pre>
316
317
318<h3>Testing restore</h3>
319
320<p>
321  To manually initiate a restore after the system has backed up your app data, execute the following
322  command, using the <code>&lt;PACKAGE&gt;</code> parameter to specify the package name for your
323  app:
324</p>
325
326<pre class="noprettyprint">
327$ adb shell bmgr restore &lt;PACKAGE&gt;
328</pre>
329
330<p class="warning">
331  <b>Warning:</b> This action stops your app and wipes its data before performing the restore
332  operation.
333</p>
334
335<p>
336  You can test automatic restore for your app by uninstalling and reinstalling your app. The app
337  data is automatically restored from the cloud once the app installation is complete.
338</p>
339
340
341<h3>Troubleshooting backups</h3>
342
343<p>
344  If backup fails, you can clear the backup data and associated metadata either by turning backup
345  off and on in <strong>Settings &gt; Backup</strong>, factory-resetting the device, or
346  executing this command:
347</p>
348
349<pre>$ adb shell bmgr wipe &lt;TRANSPORT&gt; &lt;PACKAGE&gt;</pre>
350
351<p>
352  You must prepend <code>com.google.android.gms</code> to the {@code &lt;TRANSPORT&gt;} value.
353  To get the list of <a href="{@docRoot}google/backup/index.html">transports</a>, execute the
354  following command:
355</p>
356
357<pre>$ adb shell bmgr list transports</pre>
358
359<h2 id="gcm">Handle Google Cloud Messaging</h2>
360
361  <p>
362  For apps that use <a href="https://developers.google.com/cloud-messaging/gcm">Google Cloud
363  Messaging</a> (GCM) for push notifications, backing up the registration
364  token that Google Cloud Messaging registration returned can cause unexpected behavior in
365  notifications for the restored app. This is because when a user installs your app on a new device,
366  the app must <a href="https://developers.google.com/cloud-messaging/android/client#sample-register">
367  query the GCM API for a new registration token</a>. If the old registration is present, because the
368  system had backed it up and restored it, the app doesn't seek the new token. To prevent this issue
369  from arising, exclude the registration token from the set of backed-up files.
370  </p>
371