Напишите макробенчмарк

Используйте библиотеку 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. Шаблон модуля бенчмаркинга автоматически создаёт в вашем проекте модуль для измерения производительности приложения, собранного модулем приложения, включая пример теста производительности при запуске.

Чтобы использовать шаблон модуля для создания нового модуля, выполните следующие действия:

  1. Щелкните правой кнопкой мыши свой проект или модуль на панели «Проект» в Android Studio и выберите «Создать» > «Модуль» .

  2. Выберите «Benchmark» на панели «Шаблоны» . Вы можете настроить целевое приложение (то есть приложение, производительность которого будет протестирована), а также имя пакета и модуля для нового модуля Macrobenchmark.

  3. Нажмите кнопку Готово .

Модуль бенчмарка шаблон

Рисунок 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, выполните следующие действия.

  1. Выполните синхронизацию Gradle.
  2. Откройте панель «Варианты сборки» .
  3. Выберите вариант бенчмарка как приложения, так и модуля 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.

Запустить макробенчмарк с действием gutter рядом с тестовым классом

Рисунок 5. Запуск Macrobenchmark с действием желоба рядом с тестовым классом.

Вы также можете запустить все тесты в модуле Gradle из командной строки, выполнив команду connectedCheck :

./gradlew :macrobenchmark:connectedCheck

Вы можете запустить один тест, выполнив следующее:

./gradlew :macrobenchmark:connectedCheck -P android.testInstrumentationRunnerArguments.class=com.example.macrobenchmark.startup.SampleStartupBenchmark#startup

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

Результаты контрольных тестов

После успешного выполнения бенчмарка метрики отображаются непосредственно в Android Studio и выводятся для использования непрерывной интеграции в JSON-файле . Каждая измеренная итерация регистрирует отдельную трассировку системы. Вы можете открыть эти результаты, нажав на ссылки на панели «Результаты теста» , как показано на рисунке 6:

Результаты запуска Macrobenchmark

Рисунок 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, посетите общедоступную систему отслеживания ошибок .

{% дословно %} {% endverbatim %} {% дословно %} {% endverbatim %}