Как команда Android Calendar улучшила запуск и блокировку приложений с помощью базовых профилей

Базовые профили повышают скорость выполнения кода до 30 % за счет исключения этапов интерпретатора и JIT-компиляции для обычных действий пользователя. Базовые профили позволяют вам выбирать пути пользователя, которые вы хотите оптимизировать, и могут помочь улучшить запуск приложений, уменьшить количество задержек и многое другое, что, в свою очередь, приводит к улучшению бизнес-показателей, таких как удержание пользователей и рейтинги. Узнайте больше о базовых профилях .

Команда Android Calendar внедрила базовые профили и заметила сокращение времени запуска приложений примерно на 20 % и уменьшение количества медленных или зависающих кадров примерно на 50 %. Вот что они сделали для достижения этих успехов в производительности: от того, почему они решили использовать базовые профили, до того, как они измеряли влияние.

Облачные профили и базовые профили

Команда Android Calendar уже использовала Cloud Profiles , которые представляют собой еще один метод оптимизации по профилям (PGO), основанный на реальном взаимодействии пользователей с приложением. Вот как сравниваются облачные профили и базовые профили:

Тип профиля Настраивать Включены поездки пользователя Лучше всего работает, когда пользовательская база Влияние реализовано Поддерживаемые версии Android

Облачные профили

Включено по умолчанию

Выбирается автоматически на основе реальных пользовательских данных.

Большой

В течение пары дней

Android 9 (уровень API 28) и выше

Базовые профили

Настроено вами

Выбранный вами

Все размеры

Немедленный

Android 7 (уровень API 24) и выше

Одна из ключевых причин, по которой команда Android Calendar решила добавить базовые профили в свою кодовую базу, заключалась в том, что они переходили к более быстрому еженедельному циклу выпуска. Хотя облачные профили обеспечивают значительный прирост производительности, им требуется 1–2 дня после запуска приложения, чтобы достичь максимальной эффективности, поскольку они полагаются на агрегирование реальных пользовательских данных. Дополнение облачных профилей базовыми профилями дает пользователям больше времени для достижения максимального повышения производительности до выхода следующей версии приложения.

Кроме того, для команды Android Calendar было важно иметь возможность выбирать, какие критические действия пользователя (CUJ) конкретно включены в профиль, что вы можете сделать с помощью базовых профилей.

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

Включены поездки пользователя

Команда Android Calendar решила включить в свои базовые профили два CUJ:

  • Открытие приложения в режиме расписания: изначально это представление по умолчанию, поэтому его важно оптимизировать для пользователей, впервые использующих приложение или не меняющих настройки по умолчанию.
  • Открытие приложения в виде месяца: вид, выбранный многими пользователями на основе пользовательских данных. Чтобы отслеживать, как пользователи используют ваше приложение, вы можете использовать такие инструменты, как Firebase .

Как правило, вам следует добавить те CUJ, которые выгодны для бизнеса (если применимо), и наиболее распространенные CUJ. Дополнительные сведения о том, как выбирать CUJ для оптимизации, см. в разделе Что включать .

Выполнение

Команда Android Calendar использует внутреннюю оболочку библиотеки Jetpack Macrobenchmark для создания базовых профилей для упрощения интеграции с внутренними инструментами и общей масштабируемости.

Вот конфигурация теста Macrobenchmark для открытия приложения в режиме расписания:

@Test
fun generateProfile() =
    baselineProfileRule.collect(PACKAGE_NAME, includeInStartupProfile = true) {
        startActivityAndWait()
        // Verify pre-existing recurring events and tasks are shown.
        device.waitAndFindObject(By.text("Recurring event"), 20_000)
        device.waitAndFindObject(By.text("Recurring task"), 20_000)

        // Open drawer and verify selected view.
        device.findObject(By.desc("Show Calendar List and Settings drawer")).click()
        device.waitAndFindObject(By.desc("Schedule view, Selected"), 1_000)
    }

Измерьте воздействие с помощью контролируемых выпусков

Поскольку базовые профили тесно связаны с APK-файлом, с которым они поставляются, и включаются до запуска вашего приложения, невозможно провести стандартный эксперимент A/B, чтобы понять их влияние. Однако команде Android Calendar удалось получить точную оценку воздействия с помощью контролируемых выпусков , когда вы, по сути, выпускаете новую версию приложения только для подмножества пользователей и сравниваете их с пользователями, использующими версию, аналогичную предыдущей версии.

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

  • Медианная задержка при запуске интерактивного приложения (наиболее распространенный сценарий) снизилась с 775 мс до 644 мс (17%).
  • Медианная задержка при холодном запуске снизилась с 1058 мс до 901 мс (15%).
  • Медианная задержка теплого старта снизилась с 453 мс до 378 мс (17%).
  • Средняя частота кадров в режиме «дерганий» снизилась на 42–60 % при просмотре расписания и месяца.

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

Чтобы узнать больше об инструментах и ​​функциях, посетите следующие ресурсы: