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> <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.my.appexample"> <uses-sdk android:minSdkVersion="MNC"/> <uses-sdk android:targetSdkVersion="MNC"/> <app ... <strong> android:fullBackupContent="@xml/mybackupscheme"></strong> </app> ... </manifest> </pre> <p> В этом примере кода атрибут <code>android:fullBackupContent</code> задает XML-файл, расположенный в каталоге <code>res/xml/</code> проекта приложения, который называется <code>mybackupscheme.xml</code>. В этом файле конфигурации содержатся правила резервного копирования файлов. В следующем примере кода демонстрируется файл конфигурации, в котором из процесса резервного копирования исключается определенный файл: </p> <pre> <?xml version="1.0" encoding="utf-8"?> <full-backup-content> <exclude domain="database" path="device_info.db"/> </full-backup-content> </pre> <p> В этом примере конфигурации резервного копирования из операции исключается только определенный файл базы данных. Для всех остальных файлов будут создаваться резервные копии. </p> <h4>Синтаксис конфигурации резервного копирования</h4> <p> Служба резервного копирования предоставляет вам возможность указать, какие файлы следует включить в процесс резервного копирования или исключить из него. Синтаксис XML-файла конфигурации резервного копирования данных следующий: </p> <pre> <full-backup-content> <include domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" /> <exclude domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" /> </full-backup-content> </pre> <p> С помощью перечисленных ниже элементов и атрибутов можно указать файлы, которые вы хотите включить в процесс резервного копирования или исключить из него: </p> <ul> <li> <code><include></code>: используйте этот элемент, если хотите, чтобы система не создавала резервные копии всех данных в вашем приложении, как это происходит по умолчанию, а копировала только определенный набор данных. Если указан тег <code><include></code>, система создает резервные копии <em>только для ресурсов</em> с этим элементом. </li> <li> <code><exclude></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> <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.my.appexample"> <uses-sdk android:minSdkVersion="MNC"/> <uses-sdk android:targetSdkVersion="MNC"/> <app ... <strong> android:allowBackup="false"></strong> </app> ... </manifest> </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><PACKAGE></code>: </p> <pre class="noprettyprint"> $ adb shell bmgr fullbackup <PACKAGE></pre> <h4>Тестирование восстановления</h4> <p> Чтобы вручную запустить процесс восстановления после резервного копирования данных приложения, выполните следующую команду, указав название пакета в виде параметра <code><PACKAGE></code>: </p> <pre class="noprettyprint"> $ adb shell bmgr restore <PACKAGE> </pre> <p class="warning"> <b>Предупреждение.</b> При выполнении этого действия перед операцией восстановления работа приложения будет остановлена и все его данные удалены. </p> <p> Чтобы запустить процесс восстановления, удалите ваше приложение и снова установите его. Данные приложения будут автоматически восстановлены из облака сразу по завершении установки. </p> <h4>Устранение неполадок резервного копирования</h4> <p> При возникновении проблем можно стереть резервные копии данных и все связанные с ними метаданные. Для этого отключите и повторного включите резервное копирование в разделе <strong>Настройки > Резервное копирование</strong>, восстановите заводские настройки устройства или выполните следующую команду: </p> <pre>$ adb shell bmgr wipe <TRANSPORT> <PACKAGE></pre> <p> Перед значением <code><TRANSPORT></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>