Используйте библиотеку Macrobenchmark для тестирования более сложных сценариев использования вашего приложения, включая запуск приложения и сложные манипуляции с пользовательским интерфейсом, такие как прокрутка RecyclerView
или запуск анимации. Если вы хотите протестировать небольшие фрагменты кода, обратитесь к библиотеке Microbenchmark . На этой странице показано, как настроить библиотеку Macrobenchmark.
Библиотека выводит результаты бенчмаркинга как в консоль Android Studio, так и в JSON-файл с более подробной информацией. Она также предоставляет файлы трассировки, которые можно загрузить и проанализировать в Android Studio.
Используйте библиотеку Macrobenchmark в среде непрерывной интеграции (CI), как описано в разделе Benchmark in Continuous Integration .
Вы можете использовать Macrobenchmark для создания базовых профилей. Сначала настройте библиотеку Macrobenchmark, а затем создайте базовый профиль .
Настройка проекта
Мы рекомендуем использовать Macrobenchmark с последней версией Android Studio для функций IDE, которые интегрируются с Macrobenchmark.
Настройка модуля Macrobenchmark
Для макробенчмарков требуется модуль com.android.test
, отдельный от кода вашего приложения, который отвечает за запуск тестов, измеряющих производительность вашего приложения.
В Android Studio доступен шаблон для упрощения настройки модуля Macrobenchmark. Шаблон модуля бенчмаркинга автоматически создаёт в вашем проекте модуль для измерения производительности приложения, собранного модулем приложения, включая пример теста производительности при запуске.
Чтобы использовать шаблон модуля для создания нового модуля, выполните следующие действия:
Щелкните правой кнопкой мыши свой проект или модуль на панели «Проект» в Android Studio и выберите «Создать» > «Модуль» .
Выберите «Benchmark» на панели «Шаблоны» . Вы можете настроить целевое приложение (то есть приложение, производительность которого будет протестирована), а также имя пакета и модуля для нового модуля Macrobenchmark.
Нажмите кнопку Готово .
Рисунок 1. Шаблон модуля бенчмарка.
Настройте приложение
Для бенчмаркинга приложения (также известного как цель Macrobenchmark) оно должно быть profileable
, что позволяет считывать подробную информацию о трассировке без снижения производительности. Мастер модулей автоматически добавляет тег <profileable>
в файл AndroidManifest.xml
приложения.
Убедитесь, что целевое приложение включает ProfilerInstaller
1.3 или выше, который необходим библиотеке Macrobenchmark для включения захвата и сброса профиля, а также очистки кэша шейдеров.
Настройте бенчмарк-приложение как можно ближе к версии релиза или рабочей версии. Настройте его как неотладочное и, желательно, с включённой минификацией, что повысит производительность. Обычно это делается путём создания копии версии релиза, которая выполняет те же функции, но подписана локально отладочными ключами. В качестве альтернативы, вы можете использовать initWith
, чтобы Gradle сделал это автоматически:
Котлин
buildTypes { getByName("release") { isMinifyEnabled = true isShrinkResources = true proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt")) } create("benchmark") { initWith(getByName("release")) signingConfig = signingConfigs.getByName("debug") } }
Круто
buildTypes { getByName("release") { isMinifyEnabled = true isShrinkResources = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) // In real app, this would use its own release keystore signingConfig = signingConfigs.getByName("debug") } }
Чтобы убедиться, что при запуске теста создается и тестируется правильный вариант вашего приложения, как показано на рисунке 2, выполните следующие действия.
- Выполните синхронизацию Gradle.
- Откройте панель «Варианты сборки» .
- Выберите вариант бенчмарка как приложения, так и модуля Macrobenchmark.
Рисунок 2. Выберите вариант эталонного теста.
(Необязательно) Настройте многомодульное приложение
Если в вашем приложении несколько модулей Gradle, убедитесь, что скрипты сборки знают, какой вариант сборки компилировать. Добавьте свойство matchingFallbacks
в тип сборки benchmark
ваших модулей :macrobenchmark
и :app
. Остальные модули Gradle могут иметь ту же конфигурацию, что и раньше.
Котлин
create("benchmark") { initWith(getByName("release")) signingConfig = signingConfigs.getByName("debug") matchingFallbacks += listOf("release") }
Круто
benchmark { initWith buildTypes.release signingConfig signingConfigs.debug matchingFallbacks = ['release'] }
Без этого недавно добавленный тип сборки benchmark
приведет к сбою сборки и выдаст следующее сообщение об ошибке:
> Could not resolve project :shared.
Required by:
project :app
> No matching variant of project :shared was found.
...
При выборе вариантов сборки в вашем проекте выберите benchmark
для модулей :app
и :macrobenchmark
, а также release
для всех остальных модулей в вашем приложении, как показано на рисунке 3:
Рисунок 3. Варианты бенчмарка для многомодульного проекта с выбранными типами сборки выпуска и бенчмарка.
Для получения дополнительной информации см. раздел Использование управления зависимостями с учетом вариантов .
(Необязательно) Настройте вкусы продукта
Если в вашем приложении установлено несколько разновидностей продукта, настройте модуль :macrobenchmark
, чтобы он знал, какую разновидность продукта вашего приложения следует собрать и протестировать.
Примеры на этой странице используют две версии продукта в модуле :app
: demo
и production
, как показано в следующем фрагменте:
Котлин
flavorDimensions += "environment" productFlavors { create("demo") { dimension = "environment" // ... } create("production") { dimension = "environment" // ... } }
Круто
flavorDimensions 'environment' productFlavors { demo { dimension 'environment' // ... } production { dimension 'environment' // ... } }
Без этой конфигурации вы можете получить ошибку сборки, аналогичную той, что возникает при использовании нескольких модулей Gradle:
Could not determine the dependencies of task ':macrobenchmark:connectedBenchmarkAndroidTest'.
> Could not determine the dependencies of null.
> Could not resolve all task dependencies for configuration ':macrobenchmark:benchmarkTestedApks'.
> Could not resolve project :app.
Required by:
project :macrobenchmark
> The consumer was configured to find a runtime of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'benchmark', attribute 'com.android.build.api.attributes.AgpVersionAttr' with value '7.3.0'. However we cannot choose between the following variants of project :app:
- demoBenchmarkRuntimeElements
- productionBenchmarkRuntimeElements
All of them match the consumer attributes:
...
В двух следующих разделах описываются способы настройки сравнительного анализа с использованием нескольких разновидностей продуктов.
Использовать missingDimensionStrategy
Указание missingDimensionStrategy
в defaultConfig
модуля :macrobenchmark
указывает системе сборки использовать измерение flavor. Укажите, какие измерения использовать, если вы их не найдете в модуле. В следующем примере в качестве измерения по умолчанию используется production
разновидность:
Котлин
defaultConfig { missingDimensionStrategy("environment", "production") }
Круто
defaultConfig { missingDimensionStrategy "environment", "production" }
Таким образом, модуль :macrobenchmark
может собирать и тестировать только указанную разновидность продукта, что полезно, если вы знаете, что только одна разновидность продукта имеет правильную конфигурацию для тестирования.
Определите вкусы продукта в модуле :macrobenchmark
Если вы хотите создать и протестировать другие варианты продукта, определите их в модуле :macrobenchmark
. Укажите его так же, как в модуле :app
, но присвойте параметру productFlavors
только dimension
. Никаких других настроек не требуется:
Котлин
flavorDimensions += "environment" productFlavors { create("demo") { dimension = "environment" } create("production") { dimension = "environment" } }
Круто
flavorDimensions 'environment' productFlavors { demo { dimension 'environment' } production { dimension 'environment' } }
После определения и синхронизации проекта выберите соответствующий вариант сборки на панели «Варианты сборки» , как показано на рисунке 4:
Рисунок 4. Варианты эталонных версий для проекта с вариантами продукта, для которых выбраны «productionBenchmark» и «release».
Дополнительную информацию см. в разделе Устранение ошибок сборки, связанных с сопоставлением вариантов .
Создать класс макробенчмарка
Тестирование производительности осуществляется через API правил MacrobenchmarkRule
JUnit4 в библиотеке Macrobenchmark. Оно содержит метод measureRepeated
, позволяющий задавать различные условия запуска и тестирования целевого приложения.
Вам необходимо как минимум указать packageName
целевого приложения, какие metrics
вы хотите измерить и сколько iterations
должен быть выполнен тест.
Котлин
@LargeTest @RunWith(AndroidJUnit4::class) class SampleStartupBenchmark { @get:Rule val benchmarkRule = MacrobenchmarkRule() @Test fun startup() = benchmarkRule.measureRepeated( packageName = TARGET_PACKAGE, metrics = listOf(StartupTimingMetric()), iterations = DEFAULT_ITERATIONS, setupBlock = { // Press home button before each run to ensure the starting activity isn't visible. pressHome() } ) { // starts default launch activity startActivityAndWait() } }
Ява
@LargeTest @RunWith(AndroidJUnit4.class) public class SampleStartupBenchmark { @Rule public MacrobenchmarkRule benchmarkRule = new MacrobenchmarkRule(); @Test public void startup() { benchmarkRule.measureRepeated( /* packageName */ TARGET_PACKAGE, /* metrics */ Arrays.asList(new StartupTimingMetric()), /* iterations */ 5, /* measureBlock */ scope -> { // starts default launch activity scope.startActivityAndWait(); return Unit.INSTANCE; } ); } }
Подробности всех вариантов настройки бенчмарка см. в разделе Настройка бенчмарков .
Запустить тест
Запустите тест из Android Studio, чтобы измерить производительность вашего приложения на устройстве. Вы можете запустить тесты так же, как и любой другой @Test
, используя действие «Поле» рядом с вашим классом или методом теста, как показано на рисунке 5.
Рисунок 5. Запуск Macrobenchmark с действием желоба рядом с тестовым классом.
Вы также можете запустить все тесты в модуле Gradle из командной строки, выполнив команду connectedCheck
:
./gradlew :macrobenchmark:connectedCheck
Вы можете запустить один тест, выполнив следующее:
./gradlew :macrobenchmark:connectedCheck -P android.testInstrumentationRunnerArguments.class=com.example.macrobenchmark.startup.SampleStartupBenchmark#startup
Информацию о запуске и мониторинге бенчмарков в непрерывной интеграции см. в разделе Тестирование производительности в непрерывной интеграции.
Результаты контрольных тестов
После успешного выполнения бенчмарка метрики отображаются непосредственно в Android Studio и выводятся для использования непрерывной интеграции в JSON-файле . Каждая измеренная итерация регистрирует отдельную трассировку системы. Вы можете открыть эти результаты, нажав на ссылки на панели «Результаты теста» , как показано на рисунке 6:
Рисунок 6. Результаты запуска Macrobenchmark.
После загрузки трассировки Android Studio предлагает выбрать процесс для анализа. В качестве выбранного процесса уже указан целевой процесс приложения, как показано на рисунке 7.
Рисунок 7. Выбор процесса трассировки студии.
После загрузки файла трассировки Studio отображает результаты в инструменте профилирования ЦП :
Рисунок 8. Студийный след.
JSON-отчёты и любые данные профилирования также автоматически копируются с устройства на хост. Они записываются на хост-компьютере в следующем месте:
project_root/module/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/device_id/
Доступ к файлам трассировки вручную
Если вы хотите использовать инструмент Perfetto для анализа файла трассировки, необходимо выполнить дополнительные действия. Perfetto позволяет проверять все процессы, происходящие на устройстве во время трассировки, в то время как профилировщик ЦП в Android Studio ограничивает проверку одним процессом.
При запуске тестов из Android Studio или командной строки Gradle файлы трассировки автоматически копируются с устройства на хост. Они записываются на хост-машине в следующем месте:
project_root/module/build/outputs/connected_android_test_additional_output/debugAndroidTest/connected/device_id/TrivialStartupBenchmark_startup[mode=COLD]_iter002.perfetto-trace
Если файл трассировки находится в хост-системе, его можно открыть в Android Studio, выбрав в меню «Файл» пункт «Открыть» . В этом окне отображается инструмент профилирования, показанный в предыдущем разделе.
Ошибки конфигурации
Если приложение настроено неправильно — отладка или невозможность профилирования — Macrobenchmark возвращает ошибку, а не сообщает о некорректном или неполном измерении. Вы можете подавить эти ошибки с помощью аргумента androidx.benchmark.suppressErrors
.
Macrobenchmark также возвращает ошибки при попытке измерения на эмуляторе или на устройстве с низким зарядом батареи, что может поставить под угрозу доступность ядер и тактовую частоту.
Настройте бенчмарки
Функция measureRepeated
принимает различные параметры, которые влияют на то, какие метрики собирает библиотека, как запускается и компилируется ваше приложение или сколько итераций выполняет тест.
Сбор показателей
Метрики — это основной тип информации, извлекаемой из бенчмарков. Доступны следующие метрики:
Дополнительную информацию о метриках см. в разделе Захват метрик Macrobenchmark .
Улучшите данные трассировки с помощью пользовательских событий
Может быть полезно оснастить ваше приложение пользовательскими событиями трассировки, которые отображаются вместе с остальным отчётом о трассировке и могут помочь выявить проблемы, характерные для вашего приложения. Подробнее о создании пользовательских событий трассировки см. в разделе Определение пользовательских событий .
CompilationMode
Макробенчмарки могут указывать CompilationMode
, который определяет, какая часть приложения должна быть предварительно скомпилирована из байт-кода DEX (формат байт-кода в APK) в машинный код (аналогично предварительно скомпилированному C++).
По умолчанию макробенчмарки запускаются с CompilationMode.DEFAULT
, который устанавливает базовый профиль (если он доступен) на Android 7 (API уровня 24) и более поздних версиях. Если вы используете Android 6 (API уровня 23) или более раннюю версию, режим компиляции полностью компилирует APK, что является системным поведением по умолчанию.
Вы можете установить базовый профиль, если целевое приложение содержит как базовый профиль, так и библиотеку ProfileInstaller
.
В Android 7 и более поздних версиях можно настроить параметр CompilationMode
, чтобы управлять объёмом предварительной компиляции на устройстве, имитируя различные уровни предварительной компиляции (AOT) или JIT-кэширования. См. CompilationMode.Full
, CompilationMode.Partial
, CompilationMode.None
и CompilationMode.Ignore
.
Эта функция основана на командах компиляции ART . Каждый бенчмарк очищает данные профиля перед запуском, чтобы гарантировать отсутствие помех между бенчмарками.
StartupMode
Для запуска активности можно указать предопределенный режим запуска: COLD
), WARM
или HOT
). Этот параметр изменяет способ запуска активности и состояние процесса в начале теста.
Дополнительную информацию о типах запуска см. в разделе Время запуска приложения .
Образцы
Пример проекта доступен в репозитории Macrobenchmark Sample на GitHub.
Оставьте отзыв
Чтобы сообщить о проблемах или отправить запрос на новые функции для Jetpack Macrobenchmark, посетите общедоступную систему отслеживания ошибок .
{% дословно %}Рекомендовано для вас
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Сбор показателей Macrobenchmark
- Создать базовые профили {:#creating-profile-rules}
- Автоматизируйте измерения с помощью библиотеки Macrobenchmark {:#measuring-optimization}