1page.title=Автоматическое резервное копирование для приложений 2page.tags=backup, previewresources, androidm 3page.keywords=резервное копирование, автоматическое резервное копирование, предварительная версия 4page.image=images/cards/card-auto-backup_2x.png 5@jd:body 6 7<div id="qv-wrapper"> 8 <div id="qv"> 9 <h2>Содержание документа</h2> 10 <ol> 11 <li><a href="#overview">Обзор</a></li> 12 <li><a href="#configuring">Настройка резервного копирования данных</a></li> 13 <li><a href="#testing">Тестирование конфигурации резервного копирования</a></li> 14 <li><a href="#issues">Известные проблемы</a></li> 15 </ol> 16 </div> 17</div> 18 19<p> 20 Пользователи зачастую тратят очень много времени и усилий на создание данных и настройку параметров в приложениях. 21 Поэтому одна из важнейших задач при разработке платформы — сделать так, чтобы пользователь не терял свои данные, если его устройство вышло из строя или он решил перейти на новое. 22 Устройства под управлением Android M Preview 23отлично справляются с этой задачей, автоматически выполняя резервное копирование данных 24приложения в Google Drive. Если пользователь перейдет на новое устройство, данные приложений будут автоматически перенесены 25на него. 26</p> 27 28<p> 29 Автоматическое резервное копирование предусмотрено для всех приложений, установленных на устройствах под управлением Android M Preview. При этом 30вам не нужно добавлять в приложение дополнительный код. Система сама предложит пользователю возможность включить или отключить 31автоматическое резервное копирование данных. Вы также можете указать, для каких данных приложения следует создавать резервные копии, а для каких — нет. 32</p> 33 34<p> 35 В этой статье описывается новое поведение системы и порядок указания данных приложения, 36подлежащих резервному копированию. 37</p> 38 39<h2 id="overview">Обзор</h2> 40 41<p> 42 При автоматическом резервном копировании данные, создаваемые в вашем приложении на устройстве пользователя, отпраляются в 43Google Drive пользователя и происходит их шифрование, что позволяет предотварить потерю данных. Хранилище для ваших данных предоставляется совершенно 44бесплатно. Более того, данные резервного копирования засчитываются вне личной квоты пользователя на использование ресурсов Google Drive. В период использования M Developer Preview 45пользователи могут хранить в облаке до 25 МБ данных для каждого приложения Android. 46</p> 47 48<p> 49 Автоматическое резервное копирование выполняется каждые 24 часа, когда устройство не используется, находится в режиме зарядки и подключено к сети 50Wi-Fi. При соблюдении необходимых условий служба диспетчера резервного копирования отправляет все доступные резервные копии данных 51в облако. Когда пользователь переходит на использование нового устройства или удаляет и заново устанавливает 52приложение, для которого имеется резервная копия, выполняется операция восстановления и резервные копии данных переносятся в каталог 53переустановленного приложения. 54</p> 55 56<p class="note"> 57 <strong>Примечание.</strong> Если ваше приложение использует устаревшую 58<a href="{@docRoot}google/backup/index.html">службу резервного копирования Android</a>, то 59вместо нового поведения системы будет применяться существующий механизм резервного копирования. 60</p> 61 62 63<h3 id="auto-exclude">Автоматически исключаемые файлы данных</h3> 64 65<p> 66 Не все данные приложения подлежат резервному копированию. В частности, временные файлы и кэш сохранять не нужно. Поэтому служба 67автоматического резервного копирования по умолчанию исключает из этого процесса определенные файлы данных: 68</p> 69 70<ul> 71 <li>файлы в каталогах, на которые ссылаются методы {@link android.content.Context#getCacheDir 72getCacheDir()} и {@link android.content.ContextWrapper#getCodeCacheDir getCodeCacheDir()}; 73 74 </li> 75 76 <li>файлы во внешнем хранилище, кроме файлов, находящихся в каталогах, на которые ссылается метод 77{@link android.content.Context#getExternalFilesDir getExternalFilesDir()}; 78 79 </li> 80 81 <li>файлы в каталоге, на который ссылается метод 82{@link android.content.Context#getNoBackupFilesDir getNoBackupFilesDir()}. 83 </li> 84</ul> 85 86<h2 id="configuring">Настройка резервного копирования данных</h2> 87 88<p> 89 Резервные копии создаются для данных, создаваемых любым приложением, которое установлено на устройстве под управлением M Preview, исключение составляют только 90файлы, обозначенные в предыдущем разделе. Если вы хотите самостоятельно определить, 91какие данные вашего приложения подлежат резервному копированию, а какие нет, это можно сделать с помощью соответствующих настроек в манифесте приложения. 92</p> 93 94<h3 id="include-exclude">Включение или исключение данных</h3> 95 96<p> 97 В зависимости о того, какие данные требуются вашему приложению и как вы их сохраняете, вам может потребоваться задать определенные правила 98для включения или исключения определенных файлов или каталогов. Служба автоматического резервного копирования 99поддерживает настройку таких правил посредством XML-файла конфигурации и 100манифеста приложения. В манифесте приложения можно указать файл конфигурации схемы резервного копирования, как показано в примере 101ниже. 102</p> 103 104<pre> 105<?xml version="1.0" encoding="utf-8"?> 106<manifest xmlns:android="http://schemas.android.com/apk/res/android" 107 xmlns:tools="http://schemas.android.com/tools" 108 package="com.my.appexample"> 109 <uses-sdk android:minSdkVersion="MNC"/> 110 <uses-sdk android:targetSdkVersion="MNC"/> 111 <app ... 112<strong> android:fullBackupContent="@xml/mybackupscheme"></strong> 113 </app> 114 ... 115</manifest> 116</pre> 117 118<p> 119 В этом примере кода атрибут <code>android:fullBackupContent</code> задает XML-файл, 120расположенный в каталоге <code>res/xml/</code> проекта приложения, который называется 121<code>mybackupscheme.xml</code>. В этом файле конфигурации содержатся правила резервного 122копирования файлов. В следующем примере кода демонстрируется файл конфигурации, в котором из процесса резервного копирования исключается определенный 123файл: 124</p> 125 126<pre> 127<?xml version="1.0" encoding="utf-8"?> 128<full-backup-content> 129 <exclude domain="database" path="device_info.db"/> 130</full-backup-content> 131</pre> 132 133<p> 134 В этом примере конфигурации резервного копирования из операции исключается только определенный файл базы данных. 135 Для всех остальных файлов будут создаваться резервные копии. 136</p> 137 138<h4>Синтаксис конфигурации резервного копирования</h4> 139 140<p> 141 Служба резервного копирования предоставляет вам возможность указать, какие файлы следует включить в процесс резервного копирования или 142исключить из него. Синтаксис XML-файла конфигурации резервного копирования данных следующий: 143</p> 144 145<pre> 146<full-backup-content> 147 <include domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" /> 148 <exclude domain=["file" | "database" | "sharedpref" | "external" | "root"] path="string" /> 149</full-backup-content> 150</pre> 151 152<p> 153 С помощью перечисленных ниже элементов и атрибутов можно указать файлы, которые вы хотите включить в процесс резервного копирования или исключить из 154него: 155</p> 156 157<ul> 158 <li> 159 <code><include></code>: используйте этот элемент, если хотите, чтобы система не создавала резервные копии всех данных в вашем приложении, как это происходит по умолчанию, а копировала только определенный набор данных. 160 Если указан тег 161<code><include></code>, система создает резервные копии <em>только для ресурсов</em> 162с этим элементом. 163 </li> 164 165 <li> 166 <code><exclude></code>: используйте этот элемент, чтобы указать набор ресурсов, которые 167следует исключить из процесса резервного копирования. В таком случае система будет создавать резервные копии всех данных в приложении, кроме ресурсов с этим 168элементом; 169 </li> 170 171 <li> 172 <code>domain.</code>: тип ресурса, который необходимо включить в резервное копирование или исключить из него. Допустимые 173значения для этого атрибута могут быть следующие: 174 </li> 175 176 <li style="list-style: none"> 177 <ul> 178 <li> 179 <code>root</code>: указывает на то, что ресурс находится в корневом каталоге приложения; 180 </li> 181 182 <li> 183 <code>file</code>: соответствует ресурсу в каталоге, возвращаемом методом 184{@link android.content.Context#getFilesDir getFilesDir()}; 185 </li> 186 187 <li> 188 <code>database</code>: соответствует базе данных, возвращаемой методом 189{@link android.content.Context#getDatabasePath getDatabasePath()} или классом 190{@link android.database.sqlite.SQLiteOpenHelper}; 191 </li> 192 193 <li> 194 <code>sharedpref</code>: соответствует объекту {@link android.content.SharedPreferences}, 195возвращаемому методом 196{@link android.content.Context#getSharedPreferences getSharedPreferences()}; 197 </li> 198 199 <li> 200 <code>external</code>: указывает на то, что ресурс находится во внешнем хранилище, и соответствует 201файлу в каталоге, возвращаемом методом 202{@link android.content.Context#getExternalFilesDir getExternalFilesDir()}; 203 </li> 204 205 <li> 206 <code>path</code>: путь к ресурсу, который необходимо включить в резервное копирование или исключить 207из него. 208 </li> 209 </ul> 210 </li> 211</ul> 212 213 214<h3 id="prohibit">Запрет резервного копирования данных</h3> 215 216<p> 217 Можно запретить автоматическое резервное копирование любых данных приложения. Для этого в манифесте в элементе приложения задайте для атрибута 218<code>android:allowBackup</code> значение<code>false</code>. 219 Как это делается, видно в примере кода ниже: 220</p> 221 222<pre> 223<?xml version="1.0" encoding="utf-8"?> 224<manifest xmlns:android="http://schemas.android.com/apk/res/android" 225 xmlns:tools="http://schemas.android.com/tools" 226 package="com.my.appexample"> 227 <uses-sdk android:minSdkVersion="MNC"/> 228 <uses-sdk android:targetSdkVersion="MNC"/> 229 <app ... 230<strong> android:allowBackup="false"></strong> 231 </app> 232 ... 233</manifest> 234</pre> 235 236 237<h2 id="testing">Тестирование конфигурации резервного копирования</h2> 238 239<p> 240 После создания конфигурации резервного копирования необходимо ее протестировать и убедиться, что ваше приложение сохраняет данные и впоследствии 241они могут быть должным образом восстановлены. 242</p> 243 244 245<h4>Включение журнала резервного копирования</h4> 246 247<p> 248 Чтобы упростить для себя анализ обработки вашего XML-файла функцией резервного копирования, прежде чем приступать к тестированию, 249включите ведение журнала: 250</p> 251 252<pre class="noprettyprint"> 253$ adb shell setprop log.tag.BackupXmlParserLogging VERBOSE 254</pre> 255 256<h4>Тестирование резервного копирования</h4> 257 258<p>Чтобы вручную запустить процесс резервного копирования, сначала активируйте диспетчер резервного копирования, выполнив следующую 259команду: 260</p> 261 262<pre class="noprettyprint"> 263$ adb shell bmgr run 264</pre> 265 266<p> 267 Затем вручную выполните резервное копирование вашего приложения с помощью следующей команды, указав название 268пакета в виде параметра <code><PACKAGE></code>: 269</p> 270 271<pre class="noprettyprint"> 272$ adb shell bmgr fullbackup <PACKAGE></pre> 273 274 275<h4>Тестирование восстановления</h4> 276 277<p> 278 Чтобы вручную запустить процесс восстановления после резервного копирования данных приложения, выполните следующую команду, указав название 279пакета в виде параметра <code><PACKAGE></code>: 280</p> 281 282<pre class="noprettyprint"> 283$ adb shell bmgr restore <PACKAGE> 284</pre> 285 286<p class="warning"> 287 <b>Предупреждение.</b> При выполнении этого действия перед операцией 288восстановления работа приложения будет остановлена и все его данные удалены. 289</p> 290 291<p> 292 Чтобы запустить процесс восстановления, удалите ваше приложение и снова установите его. Данные 293приложения будут автоматически восстановлены из облака сразу по завершении установки. 294</p> 295 296 297<h4>Устранение неполадок резервного копирования</h4> 298 299<p> 300 При возникновении проблем можно стереть резервные копии данных и все связанные с ними метаданные. Для этого 301отключите и повторного включите резервное копирование в разделе <strong>Настройки > Резервное копирование</strong>, восстановите заводские настройки устройства или выполните 302следующую команду: 303</p> 304 305<pre>$ adb shell bmgr wipe <TRANSPORT> <PACKAGE></pre> 306 307<p> 308 Перед значением <code><TRANSPORT></code> должен быть префикс <code>com.google.android.gms</code>. 309 Чтобы получить список транспорта, выполните следующую команду: 310</p> 311 312<pre>$ adb shell bmgr list transports</pre> 313 314<h2 id="issues">Известные проблемы</h2> 315 316<p>Ниже перечислены известные проблемы в работе службы автоматического резервного копирования.</p> 317 318<ul> 319 <li><strong>Google Cloud Messaging</strong> 320– существует проблема с приложениями, использующими Google Cloud Messaging для отправки push-уведомлений. Она связана с тем, 321что при резервном копировании кода регистрации, возвращаемого Google Cloud Messaging, может нарушиться отправка 322push-уведомлений для восстановленного приложения. Важно запросить у API-интерфейса новый код 323регистрации после установки приложения на новое устройство, что не выполняется в случае резервного копирования 324старого кода регистрации. Чтобы избежать этого, исключите код регистрации из списка файлов 325для резервного копирования. 326 </li> 327</ul> 328