Дистрибуция Android-приложения

В первом онлайн-митапе от Команды ВКонтакте VK Tech Talks | Android, который прошёл 30 апреля, разработчик Команды мобильной инфраструктуры Ведана Воронина рассказала о ключевых моментах дистрибуции Android-приложения, зачем нужен CI/CD в проекте и почему необходимо бета-тестирование продукта.

Приводим расшифровку этого доклада.

Веда Воронина, фото со страницы VK
Веда Воронина, фото со страницы VK

О чём пойдёт речь в докладе?

  • Об устройстве дистрибуции Android-приложения «ВКонтакте».
  • Что такое CI/CD и зачем они необходимы.
  • Для чего нужно бета-тестирование.

В чём смысл дистрибуции?

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

Когда этого становится недостаточно?

Когда появляется желание тестировать свои сборки с не до конца разработанными возможностями внутри компании.

Для реализации идеи был использован HockeyApp — один из сервисов дистрибуции, который занимается распространением особых сборок выбранной группой пользователей в обход Google Play.

Чтобы настроить HockeyApp в приложении VK, были пройдены следующие шаги:

  1. Регистрация продукта в HockeyApp.
  2. Встраивание HockeyApp SDK в приложение.
  3. Раздача доступов для коллег в продукте.

Теперь группа пользователей может устанавливать бета-сборки.

Какие здесь могут быть минусы?

По началу процесс был совершенно не автоматизирован. Для распространения новых сборок приходилось искать свободного разработчика и просить его локально собрать проект, а потом загрузить в HockeyApp.

На смену ручному методу пришёл метод CI/CD.

Дистрибуция Android-приложения, image #2

Что это такое?

Continuous Integration (CI) — это идея разработки программного обеспечения, которая заключается в частых «сливаниях» рабочих копий проекта в одну общую ветку разработки. На этих «сливаниях» происходят автоматизированные сборки проекта и проверки его работоспособности.

Часто задачи непрерывной интеграции сопряжены с задачами непрерывной доставки. В случае VK это была задача доставки собранных dev-сборок до HockeyApp. Таким образом CI/CD помог избавиться от ручного и однообразного труда разработчиков.

Какие сервисы помогают реализовать метод CI/CD в продукте?

Дистрибуция Android-приложения, image #3

Для работы был выбран TeamCity.

Команда ВКонтакте получила возможность:

  • регулярно собирать проект и проверять, что он хотя бы компилируется;
  • после каждого влития кода прогонять Unit- (при необходимости — UI-) тесты;
  • находить и исправлять какие-либо ошибки интеграции и предотвращать их, запуская тесты на каждом merge request'e;
  • автоматически собирать и отправлять сборки в HockeyApp.

В процессе дистрибуции Android-приложения подвёргся изменению релизный цикл.

Почему релизный цикл — это так важно?

Если в проекте не настроен релизный цикл, то совершенно непонятно, что делает в нём дистрибуция. Вам просто нечего отдавать пользователям.

Как выглядел релизный цикл VK ранее?

  • Релиз сборки делался под определённые фичи.
  • Если задерживалась разработка фичи, то задерживался выпуск всего релиза.
  • Если задерживался релиз, то не было точных сроков выпуска текущего релиза и последующих.

Все эти минусы заставили задуматься о новых подходах к решению накопившихся проблем. Так на смену старому циклу пришёл новый регулярный релиз — Release Train.

В чём суть Release Train?

  • Каждый релиз проекта — это «поезд», который отходит по расписанию. «Поезд» отправляется строго по графику — раз в две недели.
  • Все задачи, которые не попали в «поезд» остаются ждать на перроне следующего «поезда».
  • Срочные и важные задачи, успевают попасть в текущий релиз, а остальные успевают подождать следующего релиза.
  • Имеется интересная особенность — Code Freeze. За три дня до начала раскатки релиза от основной ветки разработки отводится релизная ветка. Следующие три рабочих дня производится отведение ветки в ночь с пятницы на субботу. С понедельника до среды отдел тестирования проверяет оставшиеся задачи. Если находятся какие-то проблемы, то создаются с высшим приоритетом задачи для разработчиков. Они исправляют ошибки и загружают правки в релизную ветку. После этого каждый день релизная ветка загружается в develop. По прошествии трёх дней релизная ветка готова к раскатке на пользователей.
Release Train
Release Train

Как происходит раскатка релиза?

Раскатка происходит с 10 % до 100 % аудитории за несколько дней. Сделано это для возможности исправления неожиданных проблем, которые не были выявлены до полной раскатки релиза. На самом деле метод Release Train похож на процесс бета-тестирования.

Почему бета-тестирование — это круто?

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

Как ранее был устроен весь процесс VK Testers?

  • Участники проходили регистрацию в проекте.
  • Регистрировались в HockeyApp.
  • Получали доступ к сборкам.
  • Скачивали каждый раз обновления.
  • Тестировали и репортили различные найденные ошибки, прикрепляя дополнительную информацию.

Всё это время бета-тестировщики ходили между двумя сервисами (HockeyApp и багтрекер). Это, конечно, составляет определённый дискомфорт. Было принято решение совместить сервис для составления отчётов с сервисом дистрибуции. Решение уменьшает число внешних зависимостей продукта, упрощает процесс, экономит время для разработчиков и для тестировщиков.

Для реализации решения часть работы выполняется на бэкенде, а часть на «клиенте».

Клиентская часть реализации

Для менее болезненного перехода для всех участников потребовалось реализовать всю функциональность, которая была до этого.

Необходимая функциональность Bugtracker SDK

  1. Авторизация и доступ

Для реализации этого этапа SDK активируется при запуске приложения. Как вариант, используется ActivityLifecycleCallbacks для проверки авторизации пользователя на старте и в дальнейшем использовании приложения.

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

Если пользователь авторизовался, то проверяется его доступ к сборке.

2. Отображение списка последних доступных обновлений

На старте приложения проверяется наличие новых сборок и при их наличии появляется предложение обновиться. Из этого диалога можно также открыть весь список версий, в котором будет информация о каждой из них. Уведомление или диалог показывается не чаще чем раз в день.

3. Установка сборок

  • Скачивается APK-файл. Для этого можно использовать Download Manager. Тогда получается красивое уведомление с прогрессом загрузки.
  • Когда приложение скачано и сохранено в памяти, запускается установщик. Если версия Android меньше версии 9.0, можно отправить Intent в систему, иначе придётся воспользоваться Package Installer.
  • После установки приложения удаляется APK, чтобы не засорять память устройства — возможно, отложенно.

4. Сохранение авторизованности при downgrade приложения

Чтобы позволить пользователю устанавливать сборки с даунгрейдом версии без потери авторизации, нужно научиться хранить данные снаружи. Простой выход из такой ситуации — самостоятельно генерировать зашифрованные ключи и хранить их на диске.

SDK для собственного сервиса готов!

Выводы:

  • Настроить CI/CD в своём проекте — отличное решение для экономии сил и времени.
  • По возможности следует рассмотреть бета-тестирование для увеличения стабильности каждого релиза.
  • Не останавливайтесь на достигнутом, ищите проблемы и решайте их. Ищите возможности, и ваши старания обязательно окупятся.
Дистрибуция Android-приложения, image #5

У Google есть технология — App Bundle. Компания берёт на себя подписывание приложений. «ВКонтакте» использует технологию или не доверяет компании?

Мы сейчас как раз начали работать над App Bundle. Если коротко, то доверяем. Об этом долго думали, но решили, что это полезная фича.

Ты говорила про постепенную раскатку на пользователей. Первый вопрос: как долго раскатывается до 100%? Второй: как вы следите за стабильностью, то есть какие инструменты используете?

Всё зависит от плавности релиза: если всё хорошо, то к вечеру пятницы всё будет готово. Если добавляются какие-то исправления, то релиз может задержаться на несколько дней. Основной инструмент для отслеживания стабильности — FireBase.

Как реализуете тестирование App Bundle, есть возможность выложить и подписать приложения в багтрекере?

Багтрекер не создан для того, чтобы проверять App Bundle. Его проверяют через Google Beta. Но он используется для тестирования внутри компании, например, для App Bundle.

«ВКонтакте» есть VK Bot API, который можно связать с TeamCity и просто пушить бета-сборки в чат. Кажется, что писать свой клиент для тестирования — это жёстко.

Клиент позволяет управлять доступом к приложению. Если вы готовы отдавать свои бета-сборки со спокойной душой, но потом они могут оказаться в руках кого угодно, то можно так поступить. Но мы шли по другому пути.

Ещё один вопрос про App Bundle. Пытались ли автоматизировать выкладку в Google Play?

Пока не автоматизировали.

Bugtracker SDK создавался исключительно для клиентов VK или для всех продуктов, которые участвуют в тестировании через Bugtracker?

Он создавался не только клиента VK, но скорее для клиента Группы (Mail.ru Group. — Прим. БР). Возможность управления доступами происходит на бэкенде. Мы просто делаем проверки и получаем ответы. Если какое-то приложение встраивает у себя наш SDK — оно имеет возможность обращаться, например, с просьбой показать список версий, просьбой разавторизовать пользователей из сервисов дистрибуции.

Ты говорила, что вы настроили у себя release train. Вы как-то автоматизировали процесс или он делается вручную?

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

Полная версия выступления:

Дистрибуция Android-приложения, image #6

The Brown Room — независимое интернет-издание про социальные сети и современные технологии.

Автор: Артём Грачок
Корректор: Арсений Метелев

829 views·6 shares