1. Обзор
В этом практическом занятии вы узнаете, как отслеживать производительность вашего приложения во время развертывания новых функций. Наше тестовое приложение будет обладать базовой функциональностью и настроено на отображение различных фоновых изображений в зависимости от флага Firebase Remote Config. Мы рассмотрим инструментирование трассировки для мониторинга производительности приложения, развертывание изменений конфигурации приложения, мониторинг эффекта и способы повышения производительности.
Что вы узнаете
- Как добавить Firebase Performance Monitoring в мобильное приложение, чтобы получать готовые метрики (например, время запуска приложения и медленные или зависшие кадры).
- Как добавить пользовательские трассировки для анализа критически важных участков кода в пользовательских сценариях
- Как использовать панель мониторинга производительности для анализа показателей и отслеживания важных изменений, таких как внедрение новой функции.
- Как настроить оповещения о производительности для мониторинга ключевых показателей.
- Как развернуть изменение в Firebase Remote Config
Предварительные требования
- Android Studio 4.0 или выше
- Эмулятор Android с уровнем API 16 или выше.
- Версия Java 8 или выше
- Базовое понимание Firebase Remote Config
2. Настройте тестовый проект.
Скачать код
Выполните следующую команду, чтобы клонировать пример кода для этого практического занятия. В результате на вашем компьютере будет создана папка с именем codelab-perf-rc-android :
$ git clone https://github.com/FirebaseExtended/codelab-feature-rollout-performance.git
Если у вас нет Git на компьютере, вы также можете загрузить код напрямую с GitHub.
Импортируйте проект из папки firebase-perf-rc-android-start в Android Studio. Возможно, вы увидите некоторые исключения во время выполнения или предупреждение об отсутствии файла google-services.json . Мы исправим это в следующем разделе.
В этом практическом занятии вы воспользуетесь плагином Firebase Assistant , чтобы зарегистрировать ваше Android-приложение в проекте Firebase и добавить необходимые конфигурационные файлы Firebase, плагины и зависимости в ваш Android-проект — и все это прямо из Android Studio !
Подключите ваше приложение к Firebase.
- Перейдите в Android Studio / Справка > Проверить наличие обновлений , чтобы убедиться, что вы используете последние версии Android Studio и Firebase Assistant.
- Чтобы открыть панель «Помощник» , выберите «Инструменты» > «Firebase» .

- Выберите пункт «Мониторинг производительности» , который хотите добавить в свое приложение, затем нажмите « Начать работу с мониторингом производительности» .
- Нажмите «Подключиться к Firebase» , чтобы связать ваш Android-проект с Firebase. (Это откроет консоль Firebase в вашем браузере.)
- Нажмите кнопку, чтобы создать новый проект, а затем введите название проекта (например,
Feature Rollout Performance Codelab). - Нажмите «Продолжить» .
- Если появится запрос, ознакомьтесь с условиями использования Firebase и примите их, после чего нажмите «Продолжить» .
- (Необязательно) Включите помощь ИИ в консоли Firebase (в Firebase она называется "Gemini").
- Для этого практического занятия вам не понадобится Google Analytics, поэтому отключите эту опцию.
При желании вы можете включить Google Analytics, поскольку это расширит возможности таргетинга в Remote Config. Однако в этом практическом задании используется вариант таргетинга, который не требует Google Analytics. - Далее вы увидите диалоговое окно для подключения вашего нового приложения Firebase к проекту Android Studio.

- Нажмите «Подключиться» .
- Откройте Android Studio. В панели «Ассистент» вы увидите подтверждение того, что ваше приложение подключено к Firebase.

Добавьте мониторинг производительности в ваше приложение.
В панели «Ассистент» в Android Studio нажмите «Добавить мониторинг производительности в ваше приложение» .
Вы должны увидеть диалоговое окно с предложением «Принять изменения» , после чего Android Studio синхронизирует ваше приложение, чтобы убедиться, что все необходимые зависимости добавлены.

В итоге в панели помощника в Android Studio вы должны увидеть сообщение об успешном выполнении, подтверждающее, что все зависимости настроены правильно.

В качестве дополнительного шага включите отладочное логирование , следуя инструкциям в шаге "(Необязательно) Включить отладочное логирование". Эти же инструкции также доступны в общедоступной документации .
3. Запустите приложение
Теперь в каталоге модуля (уровня приложения) вашего приложения должен отображаться файл google-services.json , и ваше приложение должно скомпилироваться. В Android Studio нажмите «Запуск » > «Запустить приложение», чтобы собрать и запустить приложение на эмуляторе Android.
После запуска приложения вы сначала увидите заставку, похожую на эту:

Затем, через несколько секунд, отобразится главная страница с изображением по умолчанию:

Что происходит под капотом?
Заставка реализована в SplashScreenActivity и выполняет следующие действия:
- В
onCreate()мы инициализируем настройки Firebase Remote Config и получаем значения конфигурации, которые вы установите на панели мониторинга Remote Config позже в этом практическом занятии. - В
executeTasksBasedOnRC()мы считываем значение параметраseasonal_image_urlиз конфигурации. Если в значении параметра указан URL-адрес, мы синхронно загружаем изображение. - После завершения загрузки приложение переходит в MainActivity и вызывает
finish()для завершенияSplashScreenActivity.
В MainActivity , если seasonal_image_url определен через Remote Config, эта функция будет включена, и загруженное изображение будет отображаться в качестве фона главной страницы. В противном случае будет отображаться изображение по умолчанию (показанное выше).
4. Настройка удаленной конфигурации
Теперь, когда ваше приложение запущено, вы можете установить новый флаг функции.
- В левой панели консоли Firebase найдите раздел Engage , затем нажмите Remote Config .
- Нажмите кнопку «Создать конфигурацию» , чтобы открыть форму конфигурации, и добавьте параметр
seasonal_image_url. - Нажмите «Добавить описание» , затем введите следующее описание:
Shows a seasonal image (replaces default) in the main page when the restaurant list is empty. - Нажмите «Добавить новое» -> «Условное значение» -> «Создать новое условие» .
- В поле «Название условия» введите
Seasonal image rollout. - В разделе
Applies if...выберитеUser in random percentile <= 0%. (Эту функцию следует оставить отключенной до тех пор, пока вы не будете готовы внедрить ее на более позднем этапе.) - Нажмите «Создать условие» . Это условие пригодится вам позже для внедрения новой функции для пользователей.

- Откройте форму «Создайте свой первый параметр» и найдите поле «Значение для развертывания сезонного изображения» . Введите URL-адрес, куда будет загружено сезонное изображение:
https://images.unsplash.com/photo-1552691021-7043334e0b51 - Оставьте значение по умолчанию пустой строкой. Это означает, что будет отображаться изображение, используемое по умолчанию в коде, а не изображение, загруженное по URL-адресу.
- Нажмите « Сохранить ».

Как видите, новая конфигурация создана как черновик.
- Чтобы обновить приложение, нажмите кнопку «Опубликовать изменения» и подтвердите изменения вверху страницы.

5. Добавить мониторинг времени загрузки данных.
Ваше приложение предварительно загружает некоторые данные перед отображением MainActivity и показывает заставку, чтобы скрыть этот процесс. Вы не хотите, чтобы ваши пользователи слишком долго ждали на этом экране, поэтому обычно полезно отслеживать, как долго отображается заставка.
Система мониторинга производительности Firebase предоставляет именно такой способ. Вы можете настроить трассировку пользовательского кода для мониторинга производительности конкретного кода в вашем приложении — например, времени загрузки данных и времени обработки вашей новой функции.
Чтобы отслеживать продолжительность отображения заставки, необходимо добавить пользовательский трассировочный код в SplashScreenActivity , которая является Activity , реализующей заставку.
- Инициализируйте, создайте и запустите пользовательскую трассировку кода с именем
splash_screen_trace:
SplashScreenActivity.java
// ...
import com.google.firebase.perf.FirebasePerformance;
import com.google.firebase.perf.metrics.Trace;
// ...
public class SplashScreenActivity extends AppCompatActivity {
private static final String TAG = "SplashScreenActivity";
private static final String SEASONAL_IMAGE_URL_RC_FLAG = "seasonal_image_url";
// TODO: Initialize splash_screen_trace
private final Trace splashScreenTrace = FirebasePerformance.startTrace("splash_screen_trace");
// ...
}
- Завершите трассировку в методе
onDestroy()классаSplashScreenActivity:
SplashScreenActivity.java
@Override
protected void onDestroy() {
super.onDestroy();
// TODO: Stop the splash_screen_trace here
splashScreenTrace.stop();
}
Поскольку ваша новая функция загружает и обрабатывает изображение, вам потребуется добавить второй пользовательский трассировочный код, который будет отслеживать дополнительное время, добавленное вашей функцией к SplashScreenActivity .
- Инициализируйте, создайте и запустите пользовательскую трассировку кода с именем
splash_seasonal_image_processing:
SplashScreenActivity.java
private void executeTasksBasedOnRC(FirebaseRemoteConfig rcConfig) {
String seasonalImageUrl = rcConfig.getString(SEASONAL_IMAGE_URL_RC_FLAG);
Log.d(TAG, SEASONAL_IMAGE_URL_RC_FLAG + ": " + seasonalImageUrl);
if (!seasonalImageUrl.isEmpty()) {
// TODO: Start the splash_seasonal_image_processing here
final Trace seasonalImageProcessingTrace = FirebasePerformance
.startTrace("splash_seasonal_image_processing");
// ...
}
}
- Завершите трассировку в методах
onLoadFailed()иonResourceReady()объектаRequestListener:
SplashScreenActivity.java
Glide.with(SplashScreenActivity.this.getApplicationContext())
.asBitmap()
.load(seasonalImageUrl)
.signature(new ObjectKey(Utils.getCacheUUID()))
.listener(new RequestListener<Bitmap>() {
@Override
public boolean onLoadFailed(
@Nullable GlideException e,
Object model, Target<Bitmap> target,
boolean isFirstResource) {
// TODO: Stop the splash_seasonal_image_processing here
seasonalImageProcessingTrace.stop();
launchMainActivity();
return true;
}
@Override
public boolean onResourceReady(Bitmap resource, Object model,
Target<Bitmap> target, DataSource dataSource,
boolean isFirstResource) {
// TODO: Stop the splash_seasonal_image_processing here
seasonalImageProcessingTrace.stop();
launchMainActivity();
return true;
}
})
.preload();
Теперь, когда вы добавили пользовательские трассировки кода для отслеживания длительности заставки ( splash_screen_trace) и времени обработки новой функции ( splash_seasonal_image_processing ), снова запустите приложение в Android Studio. Вы должны увидеть сообщение в журнале, содержащее Logging trace metric: splash_screen_trace , за которой следует длительность трассировки. Вы не увидите сообщения в журнале для splash_seasonal_image_processing , потому что вы еще не включили эту новую функцию.
6. Добавьте пользовательский атрибут к трассировке.
Для трассировки пользовательского кода мониторинг производительности автоматически регистрирует атрибуты по умолчанию (распространенные метаданные, такие как версия приложения, страна, устройство и т. д.), чтобы вы могли фильтровать данные для трассировки в консоли Firebase . Вы также можете добавлять и отслеживать пользовательские атрибуты .
В вашем приложении вы добавили два пользовательских трассировщика кода для отслеживания продолжительности отображения заставки и времени обработки новой функции. Фактором, который может повлиять на эти показатели, является то, является ли отображаемое изображение изображением по умолчанию или его необходимо загрузить по URL-адресу. И кто знает – в конечном итоге у вас могут быть разные URL-адреса для загрузки изображений.
Итак, давайте добавим к этим пользовательским трассировкам кода пользовательский атрибут, представляющий URL-адрес сезонного изображения. Таким образом, позже вы сможете фильтровать данные о продолжительности по этим значениям.
- Добавьте пользовательский атрибут (
seasonal_image_url_attribute) дляsplash_screen_traceв начало методаexecuteTasksBasedOnRC:
SplashScreenActivity.java
private void executeTasksBasedOnRC(FirebaseRemoteConfig rcConfig) {
String seasonalImageUrl = rcConfig.getString(SEASONAL_IMAGE_URL_RC_FLAG);
Log.d(TAG, SEASONAL_IMAGE_URL_RC_FLAG + ": " + seasonalImageUrl);
// TODO: Add a custom attribute "seasonal_image_url_attribute" to splash_screen_trace
if (seasonalImageUrl.isEmpty()) {
splashScreenTrace.putAttribute("seasonal_image_url_attribute", "unset");
} else {
splashScreenTrace.putAttribute("seasonal_image_url_attribute", seasonalImageUrl);
}
// ...
}
- Добавьте тот же пользовательский атрибут для
splash_seasonal_image_processingсразу после вызоваstartTrace("splash_seasonal_image_processing"):
SplashScreenActivity.java
if (!seasonalImageUrl.isEmpty()) {
// TODO: Start the splash_seasonal_image_processing here
final Trace seasonalImageProcessingTrace = FirebasePerformance
.startTrace("splash_seasonal_image_processing");
// TODO: Add a custom attribute "seasonal_image_url_attribute" to splash_seasonal_image_processing
seasonalImageProcessingTrace
.putAttribute("seasonal_image_url_attribute", seasonalImageUrl);
// ...
}
Теперь, когда вы добавили пользовательский атрибут ( seasonal_image_url_attribute ) для обеих ваших пользовательских трассировок ( splash_screen_trace и splash_seasonal_image_processing ), снова запустите приложение в Android Studio. Вы должны увидеть сообщение в логе, содержащее Setting attribute 'seasonal_image_url_attribute' to 'unset' on trace 'splash_screen_trace'. Вы еще не включили параметр удаленной конфигурации seasonalImageUrl , поэтому значение атрибута unset ».
SDK для мониторинга производительности будет собирать данные трассировки и отправлять их в Firebase. Вы можете просмотреть данные на панели мониторинга производительности в консоли Firebase, о чем мы подробно расскажем на следующем шаге практического занятия.
7. Настройте панель мониторинга производительности.
Настройте панель мониторинга для отслеживания вашей функции.
В консоли Firebase выберите проект, в котором находится ваше приложение Friendly Eats.
В левой панели найдите раздел «Выпуск и мониторинг» , затем нажмите «Производительность» .
Вы должны увидеть свою панель мониторинга производительности с первыми точками данных на панели метрик! SDK мониторинга производительности собирает данные о производительности вашего приложения и отображает их в течение нескольких минут после сбора.

На этой панели метрик вы можете отслеживать ключевые показатели вашего приложения. По умолчанию отображается продолжительность трассировки времени запуска приложения, но вы можете добавить метрики, которые вас больше всего интересуют. Поскольку вы отслеживаете добавленную вами новую функцию, вы можете настроить панель мониторинга для отображения продолжительности пользовательской трассировки кода splash_screen_trace .
- Щелкните по одному из пустых полей «Выберите метрическую систему» .
- В диалоговом окне выберите тип трассировки «Пользовательские трассировки» и имя трассировки
splash_screen_trace.

- Нажмите «Выбрать метрику» , и вы увидите, что продолжительность
splash_screen_traceдобавлена на вашу панель мониторинга!
Эти же шаги можно использовать для добавления других важных для вас метрик, чтобы быстро отслеживать изменения их производительности с течением времени и даже при разных релизах.

Панель метрик — это мощный инструмент для отслеживания эффективности ключевых показателей, воспринимаемых пользователями. В этом практическом задании у вас есть небольшой набор данных за узкий временной промежуток, поэтому вы будете использовать другие представления панели мониторинга, которые помогут вам понять эффективность внедрения новой функции.
8. Внедрите свою функцию.
Теперь, когда вы настроили мониторинг, вы готовы применить изменение Firebase Remote Config ( seasonal_image_url) , которое вы установили ранее.
Чтобы применить изменения, вернитесь на страницу «Удалённая конфигурация» в консоли Firebase и увеличьте процент пользователей, соответствующих условию таргетинга. Обычно новые функции внедряются для небольшой части пользователей, и их количество увеличивается только тогда, когда вы уверены в отсутствии проблем. Однако в этом практическом задании вы являетесь единственными пользователями приложения, поэтому можете изменить процент пользователей до 100%.
- Нажмите на вкладку «Условия» в верхней части страницы.
- Щелкните по условию
Seasonal image rollout, которое вы добавили ранее. - Измените процентиль на 100%.
- Нажмите «Сохранить условие» .
- Нажмите «Опубликовать изменения» и подтвердите изменения.

Вернитесь в Android Studio и перезапустите приложение в эмуляторе, чтобы увидеть новую функцию. После заставки вы должны увидеть новый пустой главный экран!

9. Проверьте изменения производительности.
Теперь давайте проверим производительность загрузки заставки с помощью панели мониторинга «Производительность» в консоли Firebase. На этом этапе практического занятия вы будете использовать различные разделы панели мониторинга для просмотра данных о производительности.
- На главной вкладке «Панель управления» прокрутите вниз до таблицы трассировок, затем щелкните вкладку «Пользовательские трассировки» . В этой таблице вы увидите пользовательские трассировки кода, которые вы добавили ранее, а также некоторые стандартные трассировки .
- Теперь, когда вы включили новую функцию, найдите запись трассировки пользовательского кода
splash_seasonal_image_processing, которая измеряет время, затраченное на загрузку и обработку изображения. Из значения параметра Duration в этой трассировке видно, что загрузка и обработка занимают значительное количество времени.

- Поскольку у вас есть данные для
splash_seasonal_image_processing, вы можете добавить продолжительность этой трассировки на свою панель метрик в верхней части вкладки «Панель управления» .
Как и раньше, щелкните по одному из пустых полей «Выберите метрику» . В диалоговом окне выберите тип трассировки «Пользовательские трассировки» и имя трассировки splash_seasonal_image_processing . Наконец, нажмите «Выбрать метрику» , чтобы добавить эту метрику на доску метрик.

- Чтобы дополнительно подтвердить различия, вы можете внимательнее изучить данные по показателю
splash_screen_trace. Щелкните по карточкеsplash_screen_traceна панели метрик, затем нажмите « Просмотреть подробные сведения о метрике» .

- На странице с подробной информацией в левом нижнем углу вы увидите список атрибутов, включая созданный вами ранее пользовательский атрибут. Щелкните пользовательский атрибут
seasonal_image_url_attribute, чтобы просмотреть продолжительность заставки для каждого URL-адреса сезонного изображения справа:

- Значения продолжительности заставки, вероятно, будут немного отличаться от показанных на скриншоте выше, но продолжительность должна быть больше при загрузке изображения по URL-адресу по сравнению с использованием изображения по умолчанию (обозначенного как "unset").
В этом практическом задании причина увеличения продолжительности может быть очевидной, но в реальном приложении она может быть не столь очевидной. Собранные данные о продолжительности будут поступать с разных устройств, работающих с приложением в различных условиях сетевого подключения, и эти условия могут быть хуже, чем вы ожидаете. Давайте посмотрим, как бы вы исследовали эту проблему в реальной ситуации.
- Чтобы вернуться на главную вкладку «Панель управления» , нажмите кнопку «Производительность» в верхней части страницы:

- В таблице трассировок внизу страницы перейдите на вкладку «Сетевые запросы» . В этой таблице вы увидите все сетевые запросы от вашего приложения, сгруппированные в шаблоны URL , включая шаблон URL
images.unsplash.com/**. Если сравнить значение этого времени ответа с общим временем, необходимым для загрузки и обработки изображения (т.е., продолжительностью трассировкиsplash_seasonal_image_processing), вы увидите, что большая часть времени тратится на загрузку изображения.

Результаты оценки эффективности
С помощью Firebase Performance Monitoring вы наблюдали следующее влияние на конечных пользователей при включении новой функции:
- Время, затраченное на использование
SplashScreenActivity, увеличилось. - Продолжительность обработки изображений в
splash_seasonal_image_processingбыла очень большой. - Задержка была вызвана временем отклика при загрузке изображения и соответствующим временем обработки изображения.
На следующем этапе вы смягчите влияние на производительность, отменив исправление и определив, как можно улучшить реализацию этой функции.
10. Откатить функцию
Увеличение времени ожидания пользователей во время заставки нежелательно. Одним из ключевых преимуществ удаленной настройки является возможность приостанавливать и отменять развертывание без необходимости выпуска новой версии для пользователей. Это позволяет быстро реагировать на проблемы (например, на проблемы с производительностью, обнаруженные на предыдущем шаге) и минимизировать количество недовольных пользователей.
В качестве быстрой меры вы сбросите процент развертывания до 0 , чтобы все ваши пользователи снова видели изображение по умолчанию:
- Вернитесь на страницу «Удалённая конфигурация» в консоли Firebase.
- Нажмите на кнопку «Условия» в верхней части страницы.
- Щелкните по условию
Seasonal image rolloutкоторое вы добавили ранее. - Измените процентиль на 0%.
- Нажмите «Сохранить условие» .
- Нажмите «Опубликовать изменения» и подтвердите изменения.

Перезапустите приложение в Android Studio, и вы должны увидеть исходный пустой главный экран:

11. Устранить проблемы с производительностью.
В ходе лабораторной работы вы обнаружили, что загрузка изображения для заставки замедляет работу вашего приложения. Присмотревшись к загруженному изображению, вы видите, что используете исходное разрешение , размер которого превышает 2 МБ! Быстрое решение проблемы с производительностью — уменьшить качество до более подходящего разрешения, чтобы загрузка изображения занимала меньше времени.
Снова отмените изменение значения параметра «Удалённая конфигурация».
- Вернитесь на страницу «Удалённая конфигурация» в консоли Firebase.
- Для параметра
seasonal_image_urlнажмите значок «Редактировать» . - Обновите значение для сезонного изображения, указав
https://images.unsplash.com/photo-1552691021-7043334e0b51?w=640, затем нажмите « Сохранить» .

- Нажмите на вкладку «Условия» в верхней части страницы.
- Нажмите на вкладку «Сезонные изображения» , затем установите значение в процентилях обратно на 100%.
- Нажмите «Сохранить условие» .

- Нажмите кнопку «Опубликовать изменения» .
12. Проверьте исправление и настройте оповещения.
Запустите приложение локально
Установив новое значение в настройках, указывающее на использование другого URL-адреса изображения для загрузки, запустите приложение снова. На этот раз вы заметите, что время, проведенное на заставке, сократилось по сравнению с предыдущим разом.

Просмотрите результаты внедрения изменений.
Вернитесь на панель мониторинга «Производительность» в консоли Firebase, чтобы посмотреть, как выглядят показатели.
- На этот раз вы воспользуетесь таблицей трассировок, чтобы перейти на страницу с подробной информацией. В таблице трассировок, на вкладке «Пользовательские трассировки» , щелкните пользовательскую трассировку
splash_seasonal_image_processingчтобы снова увидеть более подробное представление ее метрики продолжительности.

- Нажмите на пользовательский атрибут
seasonal_image_url_attributeчтобы снова увидеть разбивку пользовательских атрибутов. Если вы наведете курсор на URL-адреса, вы увидите значение, соответствующее новому URL-адресу изображения уменьшенного размера:https://images.unsplash.com/photo-1552691021-7043334e0b51?w=640(с?w=640в конце). Значение длительности, связанное с этим изображением, значительно короче, чем значение для предыдущего изображения, и более приемлемо для ваших пользователей!

- Теперь, когда вы улучшили производительность заставки, вы можете настроить оповещения, которые будут уведомлять вас, когда трассировка превысит установленный вами порог. Откройте панель мониторинга «Производительность» , щелкните значок меню (три точки) для splash_screen_trace и выберите «Настройки оповещений» .

- Нажмите на переключатель, чтобы включить оповещение о продолжительности . Установите пороговое значение немного выше наблюдаемого вами значения, чтобы, если значение splash_screen_trace превысит пороговое значение, вы получили электронное письмо.
- Нажмите «Сохранить» , чтобы создать оповещение. Прокрутите вниз до таблицы трассировок , затем перейдите на вкладку «Пользовательские трассировки» , чтобы убедиться, что ваше оповещение включено!

13. Поздравляем!
Поздравляем! Вы активировали SDK Firebase Performance Monitoring и собрали трассировки для измерения производительности новой функции! Вы отслеживали ключевые показатели производительности при внедрении новой функции и оперативно реагировали на обнаруженные проблемы с производительностью. Все это стало возможным благодаря возможности вносить изменения в конфигурацию с помощью Remote Config и отслеживать проблемы с производительностью в режиме реального времени.
Что мы рассмотрели
- Добавление SDK Firebase Performance Monitoring в ваше приложение
- Добавление пользовательской трассировки кода для измерения производительности конкретной функции.
- Настройка параметра удаленной конфигурации и условного значения для управления/внедрения новой функции.
- Понимание того, как использовать панель мониторинга производительности для выявления проблем во время развертывания.
- Настройка оповещений о производительности, которые будут уведомлять вас, когда производительность вашего приложения превысит установленный вами порог.