QA Android
Никита Зимин
главный за перформанс
Руслан Назаров
Скорость работы мобильных приложений
Скорость работы приложения напрямую влияет на аудиторию — от неё зависит, вернётся ли пользователь в приложение после первого использования. Сосредоточились на том, чтобы запуск был быстрее, а обращение к карте плавнее, и подтянули производительность на Android и на iOS.
За последние пару лет мы сделали очень много глобальных изменений в наших приложениях: полностью переработали главный экран, выдачу и карточки. А в апреле 2022 года был мощнейший релиз 6.0, главной фичей которого стал так называемый Гибрид — возможность работать с приложением без скачивания баз. Релиз этого функционала принёс много радости не только пользователям, но и нам. Показалось, что можно немного расслабиться и наслаждаться результатами своей работы, но на очереди был очередной челлендж. Наше приложение начало ставить новые рекорды, покорять горы и достигать новых вершин. А если быть точным — антирекорды.
Удручающий график с временем запуска приложения (синяя кривая) и ретеншна 1-го месяца Android-приложения (зелёная). Чем медленнее запускается приложение, тем меньше людей в него возвращается
Ситуацию начали замечать и пользователи. С весны у нас было немало отзывов о том, что приложение начало работать хуже (спойлер: потом отзывы стали лучше).
Как только на «радарах» появились проблемы, мы взялись фокусно исправлять эту ситуацию и корректировать наши процессы так, чтобы не допустить повторения.
Сценарии и цифры
Для исследования скорости мы выделили основные пользовательские сценарии, выбрали устройства для замеров и сравнили себя с конкурентом.
На iOS ситуация выглядела достаточно оптимистично, а вот приложению для Android явно было куда расти.

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

Первым шагом в решении этой непростой задачи было исследование того, как анализировать текущие проблемы с перфомансом (от англ. performance — производительность). Для этого создали тестовый стенд, который не зависел от случайностей поведения смартфонов и мог параллельно запускать две разные версии 2ГИС и отдавать статистику в человекочитаемом виде.

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

Вторая причина тоже не приводила к тормозам сама по себе — это кеширование данных, т. е. их сохранение для быстрого обращения. Это было нужно для онлайн-режима работы.

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

И так мы нашли проблему.
Это была одна строчка кода

Directories::logDiskUsage(options);
Этим методом мы собирали статистику о файлах приложения и считали их размер. И это сильно замедляло работу приложения. Метод больше не вызываем — скорости прибавилось.
Всего одна строчка кода и сотня тысяч довольных пользователей.

На видео слева — запуск 2ГИС на Xiaomi Mi 10 весной 2022-го, а справа — старт на актуальных версиях приложения.
После серьёзной победы над скоростью запуска, мы обратили свой взор на другие ключевые возможности приложения — поиск и появление поисковой выдачи. Весь процесс по оптимизации этих аспектов строился так: анализ узких мест, формирование гипотез, реализация оптимизаций, расширение возможностей бенчмарка (чтобы научиться автоматически замерять скорость отображения в других сценариях), проверка гипотез, внедрение оптимизаций.

Отдельное внимание уделили карточке — это основной элемент интерфейса приложения, который предоставляет пользователям всю необходимую информацию о местечке, здании, организации. А для людей открытие карточки — основная механика, если не считать карту. Скорость открытия карточки и отображении информации в ней очень важны. Поэтому, очень много времени потратили на оптимизацию, и вовсе не зря.
Три примера
Лучше слов всё скажут скринкасты, которые мы записали на трёх устройствах разных классов — Samsung Galaxy A51, Google Pixel (самый первый) и Redmi Note 8 Pro.

На каждом мы запустили три разных версии 2ГИС — 6.12 (назовём её медленной), 6.15 (это самая свежая, на ней ситуация уже сильно лучше) и ещё одной, которая сейчас в разработке (условно назвали её 6.15+). В каждой версии мы выполнили простое действие — открыли карточку компании.

Монтировать нам было лень, поэтому выкладываем видео as is. Файлы небольшие, но лучше дождаться полной загрузки, чтобы посмотреть демонстрацию.

Сравните, как изменилась скорость и очередность появления элементов карточки.
Samsung Galaxy A51
6.12
6.15
6.15+
Google Pixel
6.12
6.15
6.15+
Redmi Note 8 Pro
6.12
6.15
6.15+
А что сделали для iOS
iOS изначально был в лучшем состоянии, но это не значит, что мы им не занимались. Тут сосредоточились на глобальных проблемах: боролись с падением приложения в Москве на слабых устройствах (до iPhone 6+ включительно) и решали проблему со сбором статистики о скорости запуска.

Победили это и даже больше — ускорили время запуска приложения. Например, на iPhone 7 получилось сделать запуск быстрее на 15%.
И для обеих платформ сразу
Несколько улучшений сделали и для iOS, и для Android — большая их часть касается работы с картами. Стали быстрее применять стили, ускорили загрузку и отображение, в том числе на тяжёлых и плотно застроенных участках, например, в Москве. Ещё из хорошего — ускорение скорости показа дашборда (панели на главном экране) и подсказок, которые выдаются при поиске.

Для обеих платформ оптимизировали работу с хранилищами. Это данные, которые локально хранятся на устройстве и нужны для правильной работы приложения. Если обращения к хранилищу отнимает много ресурсов, то устройству начинает не хватать оперативной памяти. В итоге мы перевели некоторые хранилища из формата read-write в формат read-only и оптимизировали способ чтения хранилищ приложением. Это дало существенную экономию в потребляемой оперативной памяти и, например, позволило iOS-приложению больше не падать на Москве в гибридном режиме.
А люди заметили?
Да. Мы подобрали отзывы из Google Play от тех же пользователей, которые сначала писали о 2ГИС негатив, а потом изменили оценку. Листайте галерею:
Что дальше
Продолжим ускорять старт приложения, ещё больше ускорим отображение дашборда и поисковой выдачи. И будем дальше оптимизировать хранилища так, чтобы их можно было ещё быстрее читать. Заодно поищем, как можно оптимизировать сетевой кэш.

Улучшениями занимаемся и для iOS. Они увидят свет тогда, когда iOS-приложение вернётся в App Store.
Нажимая кнопку «Комментировать», вы принимаете условия Лицензионного соглашения и даёте ООО «ДубльГИС» согласие на обработку персональных данных на условиях и в целях, определённых « Политикой конфиденциальности ».