Система резервного копирования в Android 6.0

В октябре состоялся релиз мобильной операционной системы Android 6.0 Marshmallow, после чего в технологических изданиях появились её многочисленные обзоры. Среди множества новых возможностей системы разной степени важности в данной статье мы обратим особенное внимание на функцию автоматического резервного копирования данных приложений. Функция должна сохранять данные приложений в облаке, а при сбросе настроек до заводских или покупке нового аппарата приложения восстанавливают своё состояние - настройки, логины, пароли.

Так задумано в теории, а что на практике? Проверить это решили журналисты портала Arstechnica. Первое, что они установили - система работает не так, как в предварительных версиях, где копировалось всё подряд. В финальном варианте выбран более избирательный подход.

Что было доступно раньше?

В Android всегда был «облачный» компонент, который производил резервное копирование некоторого количества данных. Сначала была только инфраструктура Google Sync, доступная в настройках в разделе Учётные записи. Фреймворк синхронизации сохраняет Google-данные в аккаунт Google. Речь идёт о таких базовых приложениях, как Gmail, Контакты, Google Talk/Hangouts, события календаря, документы Drive. Как показывает название, эта же система отвечает за синхронизацию данных между смартфоном и облаком. Поддерживаются только основные данные из этих приложений. Обычно к ним не относятся настройки и уведомления, так что решение неполное.

На Android часто пользуются виджетами и иконками на домашнем экране. Только после появления загрузчика Google Now в Google начали производить резервное копирование расположения элементов домашнего экрана. Теперь при восстановлении устройства с загрузчиком Google Now пользователь получает обратно свои иконки, папки и виджеты. Приложения, которые на новом устройстве скачаны не были, обозначены на домашнем экране иконками серого цвета.

Ещё одна вещь, которую Google сделала в последних версиях системы - переустановка связанных с аккаунтом приложений. Если стереть данные с устройства и войти в аккаунт, магазин Google Play скачает и установит все приложения, о которых у него есть записи с данного устройства. Ранние версии этого сервиса были довольно нестабильными. Пользователи не знали, какие приложения будут восстановлены; они просто входили в свой аккаунт и надеялись, что приложения начнут скачиваться. В Android Lollipop Google переработала сервис и он стал значительно надёжнее. При первоначальной настройке системы пользователи видели список сохранённых профилей устройств и могли выбрать один из них. Также показывался список приложений, которые будут восстановлены, и из него пользователи могли выбрать, какие приложения нужны, а какие нет.

Хотя приложения скачивались заново, связанные с ними данные не сохранялись. Все переустановленные приложения переходили в состояние «новый пользователь». Дальше пользователю приходилось самостоятельно настраивать заново каждое приложение.

В играх ситуация была получше. В Google Play Games есть функция под названием Сохранённые игры, которую могли использовать сторонние приложения для сохранения данных. Достигнув в игре 60-го уровня, можно сохранить его в облаке, и после сброса настроек устройств зайти в Play Games и продолжить с 60-го уровня. Также это простой способ сохранять прогресс в игре при переходе между смартфоном и планшетом - сохранения синхронизируются между устройствами.

С версии Android 2.2 старая системы синхронизации приложений доступна и сторонним разработчикам, однако её сложность многих отпугнула. Приходилось писать собственный агент резервного копирования, иметь дело с конфликтами на разных устройствах, и сервис был рекомендован к работе менее чем с мегабайтом данных. На смену ей теперь приходит новая система резервного копирования.

Работает как задумано

Новая система получила название Автоматическое резервное копирование для приложений (Auto Backup for Apps). Всё содержимое по адресу data/data/[имя приложения] она копирует в облачное хранилище Google Drive (не считая кеша и временных файлов). Копируется практически всё - данные, настройки, логины в сторонних сервисах. Документация функции говорит, что на устройствах под управлением Android 6.0 (API уровень 23) или выше система по умолчанию резервирует почти все создаваемые приложениями данные. При переустановке пользователям не будут показываться руководства по работе с приложениями и будет настроено отображение уведомлений, как было задано до переустановки.

У разработчиков есть контроль над новой системой. Они могут выбирать, что именно будет копироваться, или совсем отказаться от использования системы (как и пользователи). Восстановление работает с приложениями не только из магазина Google Play Store, но и сторонних магазинов и форумов.

Пользовательский интерфейс функции частично располагается в приложении Google Drive. Отправляйтесь в настройки и там увидите опции в секции под названием Резервирование данных (в разных устройствах может называться по разному; на английском Auto Backup for Apps). Страница Управление резервными копиями (Manage Backups) показывает список приложений, данные которых сохранены, и сколько места они занимают, однако сейчас нет возможности в буквальном смысле «управлять» этими резервными копиями. Этот список показывает всё, что было скопировано, будь то в старой системе резервного копирования или в новой. Однако нельзя посмотреть, что конкретно было скопировано, то есть отдельные файлы, только лишь то, к каким приложениям эти копии относятся. По крайней мере, пользователь будет спокоен, зная, что данные приложений сохранены.

Приложения с новой системой копирования стараются сохранять данные каждые 24 часа, однако есть несколько требований для автоматической активации копирования. Новая система использует API JobScheduler, представленный в версии Lollipop, и активирует систему копирования только при подключении к розетке, сети Wi-Fi и если устройство не трогали минимум час. Потом данные шифруются и загружаются в Google Drive. Каждое приложение получает пространство на 25 Мб, при этом этот объём не отнимается от дискового пространства пользователя для хранения персональных файлов в Google Drive, доступного по его тарифу.

Из операционной системы новая система резервного копирования перенесена в сервисы Google Play, что позволит легче обновлять её. Однако это же значит, что система будет работать только на Android 6.0 и будущих версиях, а в прежних её поддержка не появится.

Важное требование: API 23

Чтобы приложение работало с новой системой резервного копирования, оно должно поддерживать API уровня 23. Это может прозвучать как привычная для разработчиков тарабарщина, однако понять это требование не так сложно. Версии Android показывают прогресс в разработке системы, однако у разработчиков нумерация идёт по-другому, так называемыми API level (или версия SDK). Это номер внутреннего интерфейса прикладного программирования, который используют приложения - новый номер означает новый API с новыми функциями. В отличие от десятичной нумерации версий Android, уровни API всегда обозначаются целым числом, всегда увеличиваясь на 1. Уровни API привязаны к выпуску новых версий Android, так что в Android 1.0 был API 1, в Android 1.1 был API 2, в Android 1.5 - API 3, а в Android 6.0 - API 23.

Привязка к последнему уровню API - это сигнал со стороны разработчиков, что они опробовали свои приложения с новой версией Android и подтвердили совместимость с новыми функциями. Это также требование использовать новые функции последней версии. Привязка к последнему уровню API не связана с тем, на какой версии Android запускается приложение. В приложениях есть два уровня API: targetSDKversion и minSDKversion. Это как диапазон поддерживаемых версий - minSDKversion - представляет собой самую раннюю поддерживаемую версию, targetSDKversion - самую современную. Приложение не может быть запущено на версии ниже minSDKversion, зато targetSDKversion не является ограничением - старые приложения работают с новыми версиями операционной системы, но не имеют доступа к её новым возможностям.

Кроме привязки к API 23 есть ещё требование для работы новой системы резервного копирования - в настройках приложению нужно разрешить использовать её. Казалось бы, разработчики не должны отказываться от неё, однако на самом деле это довольно часто происходит в случае с API 23. Команда "android:allowBackup="false"" в файле Manifest запрещает приложению задействовать систему копирования.

Какие разработчики отказываются от новой системы? Для начала, сама Google. Почти все её приложения используют систему синхронизации аккаунтов. Это значит, что при их первом запуске пользователь каждый раз будет сталкиваться с окнами приветствий, руководствами и лицензионными соглашениями, прежде чем доберётся до основного окна приложения. Одним из найденных исключений стало приложение Часы, которое использует новую систему.

Google планирует оставаться на системе синхронизации аккаунтов, но обновлять приложения, чтобы давать им возможность помнить, что пользователь уже видел приветствия и принял лицензионное соглашение, чтобы не показывать их снова. К релизу Android 6.0 не спешили реализовать эту задумку, поскольку приложения можно обновлять в любой момент через магазин. Когда приложения будут обновлены, они станут сохранять все данные, после чего переустановка приложения на новом устройстве восстановит его состояние без лишних шагов.

Сколько приложений используют API 23?

Чтобы узнать это, было проведено исследование. Из магазина Play Store было скачано 200 приложений, произведена декомпиляция и рассмотрена версия API. Можно сказать, что API 23 пока используется нечасто.

Для анализа выбирались бесплатные приложения сторонних разработчиков, не с верхних позиций рейтинга и не игры. Также рассматривались приложения из ТОП-200. Там хотелось бы взглянуть и на платные приложения, однако среди популярных их недостаточно много, чаще разработчики зарабатывают на покупках внутри приложений.

Результаты на 10 октября: из 200 сторонних приложений 190 используют API 22 или ниже, поэтому не смогут работать с новой системой резервного копирования. Из оставшихся 10 в 6 стоит флаг "android:allowBackup="false"". Из остальных 4 одно сразу же закрывается при попытке запуска на Android 6.0.

Итого из 200 приложений только Instagram, Dubsmash, и Zedge Ringtones & Wallpapers научились копировать свои данные по-новому. API 23 поддерживают 5% программ, а по-настоящему при этом работают 1,5%.

Хотя Android 6.0 пока успели получить только аппараты Nexus, API 23 доступен разработчикам с середины августа и его применение не является сложной для разработчиков задачей. Это всего лишь раскрывающееся меню в программе разработке Android Studio и небольшой объём тестирования новых функций.

Придётся подождать, пока миллионы разработчиков обновят свои программы для API 23. Для сравнения можно посмотреть на темпы распространения API 22, выпущенного с Android 5.1 в марте 2015. Из приложений ТОП-200 интерфейс поддерживается в 46% случаев. При этом операционная система Android 5.1 установлена только на 7,9% устройств. С Android 5.0 около года назад появился API 21, теперь он в 78% приложений. Можно предположить, что через год новая система копирования будет поддерживаться большинством приложений. Возможно, всё случится быстрее, поскольку API 23 является одним из редких случаев, когда переход на него востребован пользователями.

Почему не навязать автоматические обновления силой?

Почему же Google не возьмёт инициативу на себя и не станет поддерживать резервное копирование во всех приложениях, без всяких флагов? Google уже пыталась. В версии Android M Developer Preview все приложения сохраняли данные в Google Drive, вне зависимости от поддерживаемого API. Для большинства приложений это работало, но были и проблемы. Если приложение шифровало свои данные, зашифрованные данные попадали в облако. Без ключа дешифрования (остававшегося на устройстве, где он стирался при сбросе настроек системы) эти данные нельзя было расшифровать. Этот «мусор» отправлялся в переустановленное приложение, после чего о его работоспособности можно было забыть. Пользователи при этом не знали причины падений.

Другая проблема была с приложениями с уникальными идентификаторами устройства. Если они копировались в Google Drive и потом обратно, иногда также возникали проблемы с работоспособностью. Сервис уведомлений Google Cloud Messaging (GCM) был подвержен этой проблеме. В старых версиях Google Play Services, если система резервного копирования копировала GCM Instance ID из одного приложения в другое, система уведомлений переставала работать. Новые версии Google Play Services обновят Instance ID после первой активации приложения, и если разработчик использует последний API, обновление случится при восстановлении и уведомления продолжат работать как положено.

Google не навязывает резервное копирование, как обычно осторожно внося изменения в экосистему. В компании предпочитают убедиться, что всё работает как положено, и только потом дать разработчикам возможность использовать систему, а не навязать её силой и заставить разработчиков разгребать технические проблемы.

Проблемная настройка

Instagram сейчас является лучшим примером работы новой системы резервного копирования. Сброс настроек или переход на новый телефон восстанавливает приложение в том виде, как его оставил пользователь в последний раз. Запуская его, пользователь сразу попадает в свой аккаунт, не нужно заново вводить логин и пароль.

Что касается приложений Google, даже Часы не сохраняют заданные настройки будильника, не сохраняются настройки устройств Bluetooth, учётные записи Exchange, голосовые команды в OK Google, отключенные приложения и заданные разрешения на доступ. Можно сказать, что разработчикам Google предстоит проделать работу над ними, а сторонним разработчикам предстоит обновляться до API 23.