blob: 1f9dacc15867d8ca0e4745168658292c56f95b7a [file] [log] [blame]
page.title=Автоматическое резервное копирование для приложений
page.tags=backup, previewresources, androidm
page.keywords=резервное копирование, автоматическое резервное копирование, предварительная версия
page.image=images/cards/card-auto-backup_2x.png
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Содержание документа</h2>
<ol>
<li><a href="#overview">Обзор</a></li>
<li><a href="#configuring">Настройка резервного копирования данных</a></li>
<li><a href="#testing">Тестирование конфигурации резервного копирования</a></li>
<li><a href="#issues">Известные проблемы</a></li>
</ol>
</div>
</div>
<p>
Пользователи зачастую тратят очень много времени и усилий на создание данных и настройку параметров в приложениях.
Поэтому одна из важнейших задач при разработке платформы сделать так, чтобы пользователь не терял свои данные, если его устройство вышло из строя или он решил перейти на новое.
Устройства под управлением Android M Preview
отлично справляются с этой задачей, автоматически выполняя резервное копирование данных
приложения в Google Drive. Если пользователь перейдет на новое устройство, данные приложений будут автоматически перенесены
на него.
</p>
<p>
Автоматическое резервное копирование предусмотрено для всех приложений, установленных на устройствах под управлением Android M Preview. При этом
вам не нужно добавлять в приложение дополнительный код. Система сама предложит пользователю возможность включить или отключить
автоматическое резервное копирование данных. Вы также можете указать, для каких данных приложения следует создавать резервные копии, а для каких нет.
</p>
<p>
В этой статье описывается новое поведение системы и порядок указания данных приложения,
подлежащих резервному копированию.
</p>
<h2 id="overview">Обзор</h2>
<p>
При автоматическом резервном копировании данные, создаваемые в вашем приложении на устройстве пользователя, отпраляются в
Google Drive пользователя и происходит их шифрование, что позволяет предотварить потерю данных. Хранилище для ваших данных предоставляется совершенно
бесплатно. Более того, данные резервного копирования засчитываются вне личной квоты пользователя на использование ресурсов Google Drive. В период использования M Developer Preview
пользователи могут хранить в облаке до 25 МБ данных для каждого приложения Android.
</p>
<p>
Автоматическое резервное копирование выполняется каждые 24 часа, когда устройство не используется, находится в режиме зарядки и подключено к сети
Wi-Fi. При соблюдении необходимых условий служба диспетчера резервного копирования отправляет все доступные резервные копии данных
в облако. Когда пользователь переходит на использование нового устройства или удаляет и заново устанавливает
приложение, для которого имеется резервная копия, выполняется операция восстановления и резервные копии данных переносятся в каталог
переустановленного приложения.
</p>
<p class="note">
<strong>Примечание.</strong> Если ваше приложение использует устаревшую
<a href="{@docRoot}google/backup/index.html">службу резервного копирования Android</a>, то
вместо нового поведения системы будет применяться существующий механизм резервного копирования.
</p>
<h3 id="auto-exclude">Автоматически исключаемые файлы данных</h3>
<p>
Не все данные приложения подлежат резервному копированию. В частности, временные файлы и кэш сохранять не нужно. Поэтому служба
автоматического резервного копирования по умолчанию исключает из этого процесса определенные файлы данных:
</p>
<ul>
<li>файлы в каталогах, на которые ссылаются методы {@link android.content.Context#getCacheDir
getCacheDir()} и {@link android.content.ContextWrapper#getCodeCacheDir getCodeCacheDir()};
</li>
<li>файлы во внешнем хранилище, кроме файлов, находящихся в каталогах, на которые ссылается метод
{@link android.content.Context#getExternalFilesDir getExternalFilesDir()};
</li>
<li>файлы в каталоге, на который ссылается метод
{@link android.content.Context#getNoBackupFilesDir getNoBackupFilesDir()}.
</li>
</ul>
<h2 id="configuring">Настройка резервного копирования данных</h2>
<p>
Резервные копии создаются для данных, создаваемых любым приложением, которое установлено на устройстве под управлением M Preview, исключение составляют только
файлы, обозначенные в предыдущем разделе. Если вы хотите самостоятельно определить,
какие данные вашего приложения подлежат резервному копированию, а какие нет, это можно сделать с помощью соответствующих настроек в манифесте приложения.
</p>
<h3 id="include-exclude">Включение или исключение данных</h3>
<p>
В зависимости о того, какие данные требуются вашему приложению и как вы их сохраняете, вам может потребоваться задать определенные правила
для включения или исключения определенных файлов или каталогов. Служба автоматического резервного копирования
поддерживает настройку таких правил посредством XML-файла конфигурации и
манифеста приложения. В манифесте приложения можно указать файл конфигурации схемы резервного копирования, как показано в примере
ниже.
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.my.appexample"&gt;
&lt;uses-sdk android:minSdkVersion="MNC"/&gt;
&lt;uses-sdk android:targetSdkVersion="MNC"/&gt;
&lt;app ...
<strong> android:fullBackupContent="&#64;xml/mybackupscheme"&gt;</strong>
&lt;/app&gt;
...
&lt;/manifest&gt;
</pre>
<p>
В этом примере кода атрибут <code>android:fullBackupContent</code> задает XML-файл,
расположенный в каталоге <code>res/xml/</code> проекта приложения, который называется
<code>mybackupscheme.xml</code>. В этом файле конфигурации содержатся правила резервного
копирования файлов. В следующем примере кода демонстрируется файл конфигурации, в котором из процесса резервного копирования исключается определенный
файл:
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;full-backup-content&gt;
&lt;exclude domain="database" path="device_info.db"/&gt;
&lt;/full-backup-content&gt;
</pre>
<p>
В этом примере конфигурации резервного копирования из операции исключается только определенный файл базы данных.
Для всех остальных файлов будут создаваться резервные копии.
</p>
<h4>Синтаксис конфигурации резервного копирования</h4>
<p>
Служба резервного копирования предоставляет вам возможность указать, какие файлы следует включить в процесс резервного копирования или
исключить из него. Синтаксис XML-файла конфигурации резервного копирования данных следующий:
</p>
<pre>
&lt;full-backup-content&gt;
&lt;include domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" /&gt;
&lt;exclude domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" /&gt;
&lt;/full-backup-content&gt;
</pre>
<p>
С помощью перечисленных ниже элементов и атрибутов можно указать файлы, которые вы хотите включить в процесс резервного копирования или исключить из
него:
</p>
<ul>
<li>
<code>&lt;include&gt;</code>: используйте этот элемент, если хотите, чтобы система не создавала резервные копии всех данных в вашем приложении, как это происходит по умолчанию, а копировала только определенный набор данных.
Если указан тег
<code>&lt;include&gt;</code>, система создает резервные копии <em>только для ресурсов</em>
с этим элементом.
</li>
<li>
<code>&lt;exclude&gt;</code>: используйте этот элемент, чтобы указать набор ресурсов, которые
следует исключить из процесса резервного копирования. В таком случае система будет создавать резервные копии всех данных в приложении, кроме ресурсов с этим
элементом;
</li>
<li>
<code>domain.</code>: тип ресурса, который необходимо включить в резервное копирование или исключить из него. Допустимые
значения для этого атрибута могут быть следующие:
</li>
<li style="list-style: none">
<ul>
<li>
<code>root</code>: указывает на то, что ресурс находится в корневом каталоге приложения;
</li>
<li>
<code>file</code>: соответствует ресурсу в каталоге, возвращаемом методом
{@link android.content.Context#getFilesDir getFilesDir()};
</li>
<li>
<code>database</code>: соответствует базе данных, возвращаемой методом
{@link android.content.Context#getDatabasePath getDatabasePath()} или классом
{@link android.database.sqlite.SQLiteOpenHelper};
</li>
<li>
<code>sharedpref</code>: соответствует объекту {@link android.content.SharedPreferences},
возвращаемому методом
{@link android.content.Context#getSharedPreferences getSharedPreferences()};
</li>
<li>
<code>external</code>: указывает на то, что ресурс находится во внешнем хранилище, и соответствует
файлу в каталоге, возвращаемом методом
{@link android.content.Context#getExternalFilesDir getExternalFilesDir()};
</li>
<li>
<code>path</code>: путь к ресурсу, который необходимо включить в резервное копирование или исключить
из него.
</li>
</ul>
</li>
</ul>
<h3 id="prohibit">Запрет резервного копирования данных</h3>
<p>
Можно запретить автоматическое резервное копирование любых данных приложения. Для этого в манифесте в элементе приложения задайте для атрибута
<code>android:allowBackup</code> значение<code>false</code>.
Как это делается, видно в примере кода ниже:
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.my.appexample"&gt;
&lt;uses-sdk android:minSdkVersion="MNC"/&gt;
&lt;uses-sdk android:targetSdkVersion="MNC"/&gt;
&lt;app ...
<strong> android:allowBackup="false"&gt;</strong>
&lt;/app&gt;
...
&lt;/manifest&gt;
</pre>
<h2 id="testing">Тестирование конфигурации резервного копирования</h2>
<p>
После создания конфигурации резервного копирования необходимо ее протестировать и убедиться, что ваше приложение сохраняет данные и впоследствии
они могут быть должным образом восстановлены.
</p>
<h4>Включение журнала резервного копирования</h4>
<p>
Чтобы упростить для себя анализ обработки вашего XML-файла функцией резервного копирования, прежде чем приступать к тестированию,
включите ведение журнала:
</p>
<pre class="noprettyprint">
$ adb shell setprop log.tag.BackupXmlParserLogging VERBOSE
</pre>
<h4>Тестирование резервного копирования</h4>
<p>Чтобы вручную запустить процесс резервного копирования, сначала активируйте диспетчер резервного копирования, выполнив следующую
команду:
</p>
<pre class="noprettyprint">
$ adb shell bmgr run
</pre>
<p>
Затем вручную выполните резервное копирование вашего приложения с помощью следующей команды, указав название
пакета в виде параметра <code>&lt;PACKAGE&gt;</code>:
</p>
<pre class="noprettyprint">
$ adb shell bmgr fullbackup &lt;PACKAGE&gt;</pre>
<h4>Тестирование восстановления</h4>
<p>
Чтобы вручную запустить процесс восстановления после резервного копирования данных приложения, выполните следующую команду, указав название
пакета в виде параметра <code>&lt;PACKAGE&gt;</code>:
</p>
<pre class="noprettyprint">
$ adb shell bmgr restore &lt;PACKAGE&gt;
</pre>
<p class="warning">
<b>Предупреждение.</b> При выполнении этого действия перед операцией
восстановления работа приложения будет остановлена и все его данные удалены.
</p>
<p>
Чтобы запустить процесс восстановления, удалите ваше приложение и снова установите его. Данные
приложения будут автоматически восстановлены из облака сразу по завершении установки.
</p>
<h4>Устранение неполадок резервного копирования</h4>
<p>
При возникновении проблем можно стереть резервные копии данных и все связанные с ними метаданные. Для этого
отключите и повторного включите резервное копирование в разделе <strong>Настройки &gt; Резервное копирование</strong>, восстановите заводские настройки устройства или выполните
следующую команду:
</p>
<pre>$ adb shell bmgr wipe &lt;TRANSPORT&gt; &lt;PACKAGE&gt;</pre>
<p>
Перед значением <code>&lt;TRANSPORT&gt;</code> должен быть префикс <code>com.google.android.gms</code>.
Чтобы получить список транспорта, выполните следующую команду:
</p>
<pre>$ adb shell bmgr list transports</pre>
<h2 id="issues">Известные проблемы</h2>
<p>Ниже перечислены известные проблемы в работе службы автоматического резервного копирования.</p>
<ul>
<li><strong>Google Cloud Messaging</strong>
существует проблема с приложениями, использующими Google Cloud Messaging для отправки push-уведомлений. Она связана с тем,
что при резервном копировании кода регистрации, возвращаемого Google Cloud Messaging, может нарушиться отправка
push-уведомлений для восстановленного приложения. Важно запросить у API-интерфейса новый код
регистрации после установки приложения на новое устройство, что не выполняется в случае резервного копирования
старого кода регистрации. Чтобы избежать этого, исключите код регистрации из списка файлов
для резервного копирования.
</li>
</ul>