Бенчмарк

Точно измеряйте производительность своего кода в Android Studio.
Последнее обновление Стабильный релиз Предварительная версия для выпуска Бета-версия Альфа-версия
17 декабря 2025 г. 1.4.1 - - 1.5.0-alpha01

Объявление зависимостей

Чтобы добавить зависимость от Benchmark, необходимо добавить репозиторий Google Maven в ваш проект. Для получения дополнительной информации ознакомьтесь с информацией в репозитории Google Maven .

Макробенчмарк

Чтобы использовать Macrobenchmark в своем проекте, добавьте следующие зависимости в файл build.gradle для вашего модуля macrobenchmark :

классный

dependencies {
  androidTestImplementation "androidx.benchmark:benchmark-macro-junit4:1.4.1"
}

Котлин

dependencies {
  androidTestImplementation("androidx.benchmark:benchmark-macro-junit4:1.4.1")
}

Микробенчмарк

Чтобы использовать Microbenchmark в своем проекте, добавьте следующие зависимости в файл build.gradle для вашего модуля microbenchmark :

Groovy

dependencies {
    androidTestImplementation "androidx.benchmark:benchmark-junit4:1.4.1"
}

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner "androidx.benchmark.junit4.AndroidBenchmarkRunner"
    }
}

Kotlin

dependencies {
    androidTestImplementation("androidx.benchmark:benchmark-junit4:1.4.1")
}

android {
    ...
    defaultConfig {
        ...
        testInstrumentationRunner = "androidx.benchmark.junit4.AndroidBenchmarkRunner"
    }
}

The Microbenchmark library also provides a Gradle plugin to use with your microbenchmark module. This plugin sets build configuration defaults for the module, sets up benchmark output copy to the host, and provides the ./gradlew lockClocks task.

To use the plugin, include the following line in the `plugins` block in your top-level build.gradle file:

Groovy

plugins {
  id 'androidx.benchmark' version '1.4.1' apply false
}

Kotlin

plugins {
  id("androidx.benchmark") version "1.4.1" apply false
}

Then apply the plugin to your benchmark module's build.gradle file

Groovy

plugins {
  id 'androidx.benchmark'
}

Kotlin

plugins {
    id("androidx.benchmark")
}

Обратная связь

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

Создать новую задачу

Для получения более подробной информации см. документацию по системе отслеживания ошибок .

Версия 1.5

Версия 1.5.0-alpha01

17 декабря 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.5.0-alpha01 . Версия 1.5.0-alpha01 содержит следующие коммиты .

  • Macrobenchmark 1.5 использует UiAutomator 2.4 для упрощения взаимодействия с измеряемым приложением. Объект MacrobenchmarkScope теперь расширяет UiAutomatorTestScope , что позволяет использовать современные API UiAutomator , такие как onElement { ... }.click() .
  • Для получения дополнительной информации о UiAutomator 2.4 см. документацию .

Новые функции

  • В AGP 9.0 плагин Baseline Profile Gradle больше не требует newDsl=false ( Iaaac7 , b/443311090 ).
  • Расширьте конфигурацию трассировки, включив в нее размер ядра (например, little/big) в трассировки системы/perfetto, полученные в ходе бенчмарка. ( I8e397 , b/457469959 )

Изменения в API

  • (В UiAutomator) Изменено время ожидания startActivity на ожидание нового окна. ( I35da6 , b/440021797 )
  • Стабилизация API BlackHole в androidx.benchmark. ( I2b67e , b/451749438 )
  • Добавлена ​​аннотация @JvmOverloads для удобства конструкторов PerfettoTraceRule . ( I1510a , b/443763207 )

Версия 1.4

Версия 1.4.1

10 сентября 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.1 . Версия 1.4.1 содержит следующие коммиты .

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой perfettoSdkTracing=true (например, при трассировке Compose в микротесте) завершал работу целевого процесса, если он уже был запущен и не был указан StartupMode. ( Ib2c1f )

Версия 1.4.0

30 июля 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0 . Версия 1.4.0 содержит следующие коммиты .

Важные изменения по сравнению с версией 1.3.0

Микробенчмарк

  • Задачи Gradle lockClocks и unlockClocks перемещены в проекты для сравнения производительности, а не на верхний уровень, чтобы обеспечить изоляцию проектов Gradle.
  • Переработан BenchmarkRule , теперь он построен на основе сопрограмм и поддерживает более эффективное поведение yield() . Это должно значительно снизить риск возникновения ошибок ANR во время выполнения бенчмарков, особенно длительных запусков CI. Примечание: бенчмарки пользовательского интерфейса следует запускать с measureRepeatedOnMainThread

Макробенчмарк

  • Добавлено обходное решение для API 34+, поскольку CompilationMode.None() приводило к нестабильной производительности из-за того, что проверка ART теперь частично компилирует приложения после первого запуска.
  • Экспериментальная функция — Startup Insights может выявлять определенные распространенные проблемы в тесте Macrobenchmark при запуске, передавая MacrobenchmarkRule(..., experimentalConfig = ExperimentalConfig(StartupInsightsConfig(isEnabled = true))) .
  • Добавлена ​​функция ArtMetric , которая может использоваться для обнаружения JIT-компиляции и неоптимизированной загрузки классов — обе функции полезны для проверки оптимизаций в рамках базового профиля.

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

  • Теперь BaselineProfileRule собирает профили для многопроцессных приложений.

Другие изменения

  • TraceProcessor был выделен в отдельную библиотеку ( androidx.benchmark:benchmark-traceprocessor ), чтобы его можно было использовать вне метрик Macrobenchmark в других случаях. Его также можно запустить на настольной JVM, определив собственный ServerLifecycleManager .

Версия 1.4.0-rc01

18 июня 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-rc01 . Версия 1.4.0-rc01 содержит следующие коммиты .

Исправлены ошибки

  • Добавлено обходное решение для образов среды выполнения, из-за которого CompilationMode.None() не измеряет производительность в худшем случае после первой итерации. К сожалению, это обходное решение требует задержки в 5 секунд для преднамеренного повреждения образа среды выполнения в начале каждого набора макротестов ( I4a4f1 ).

Версия 1.4.0-beta02

4 июня 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-beta02 . Версия 1.4.0-beta02 содержит следующие коммиты .

Изменения в API

  • Добавлен класс BaselineProfileConfig.Builder , чтобы упростить вызов метода BaselineProfileRule.collectWithResults() для Java-разработчиков. ( I94905 )

Версия 1.4.0-beta01

7 мая 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-beta01 . Версия 1.4.0-beta01 содержит следующие коммиты .

Изменения в API

  • Добавлен вариант конструктора PerfettoTraceRule , который принимает PerfettoConfig ( Ie53ba ).

Исправлены ошибки

  • Обновлен формат ссылки на начальную информацию TraceProcessor для использования правильного плагина и более четкого разделителя ( : короче, чем %3A , и оба варианта поддерживаются) ( IE18ef )
  • Всегда используйте команду force-stop для завершения процессов, даже если у вас есть root-доступ и вы завершаете работу системных приложений. Исправляет исключения вида: Expected no stdout/stderr from killall ... No such process . ( Idca2c )

Внешний вклад

  • Добавлен обработчик исключений прокси для TraceProcessorHttpServer ( I480f5 ).

Версия 1.4.0-alpha11

9 апреля 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-alpha11 . Версия 1.4.0-alpha11 содержит следующие коммиты .

Изменения в API

  • Изменен аргумент timeout: Duration функции TraceProcessor на timeoutMs long для удобства использования в Java-приложениях. ( I9fbb5 )
  • Пометьте конструктор TraceProcessor как внутренний. Вызывающие функции должны использовать TraceProcessor.startServer или TraceProcessor.runServer . ( Ia8c5b )

Исправлены ошибки

  • При завершении работы приложения с помощью MacrobenchmarkScope.killProcess проверьте результаты команды kill, чтобы предотвратить сбой в работе приложения и ошибку тайм-аута. ( I84555 )

Обновления зависимостей

  • Эта библиотека теперь ориентирована на язык Kotlin 2.0 и требует KGP 2.0.0 или более поздней версии. ( Idb6b5 )

Версия 1.4.0-alpha10

26 марта 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-alpha10 . Версия 1.4.0-alpha10 содержит следующие коммиты .

Изменения в API

  • Увеличено время ожидания по умолчанию для загрузки сервера TraceProcessor и выполнения запросов до 120 секунд (ранее было 60/30), и обе функции теперь можно настраивать с помощью одного параметра времени ожидания. ( Ifec87 )

Исправлены ошибки

  • Исправлены некоторые проблемы, возникавшие при тестировании производительности или создании профилей приложений без profileinstaller , и добавлен BroadcastReciever . Это затрагивает только работу на устройствах с root-доступом. ( Ied308 )

Версия 1.4.0-alpha09

12 марта 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-alpha09 . Версия 1.4.0-alpha09 содержит следующие коммиты .

Изменения в API

  • Добавлены API TraceProcessor и Session с закрываемыми дескрипторами для упрощения использования с пользовательскими жизненными циклами. Это также шаг к упрощению использования API сопрограмм и Java. Функции расширения для TraceProcessor.runServer {} теперь помечены как экспериментальные, поскольку в будущем они, вероятно, будут перемещены и станут неэкспериментальными. ( I358b4 )

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой захват бенчмарка и базового профиля не работал с API 36 из-за изменения в тестовом наборе pgrep , который теперь требует -a для вывода полной командной строки. ( Idc991 )
  • Фильтрация конфигурации трассировки по умолчанию для снижения риска потери данных в трассировках на более новых уровнях API. ( I54e8a )
  • Добавлен экспериментальный аргумент инструментария androidx.benchmark.killExistingPerfettoRecordings , который можно установить в значение false , чтобы разрешить продолжение уже существующей записи трассировки Perfetto. По умолчанию уже существующие записи трассировки Perfetto на устройстве прерываются во избежание помех. ( I02a3c )
  • Поле JSON context.osCodenameAbbreviated теперь будет иметь REL для выпущенных версий ОС с API 35 и выше, поскольку нечисловые кодовые имена больше не поддерживаются базовой платформой. ( Ib17fd )
  • Исправлена ​​ошибка, приводящая к сбою в FrameTimingMetric при повторной синхронизации кадров. ( I7c6f4 , b/394610806 )
  • Больше не предполагается, что Choreographer#doFrame является верхним кадром стека в основном потоке для FrameTimingQuery . ( Iee0e0 , b/340206285 )

Версия 1.4.0-alpha08

12 февраля 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-alpha08 . Версия 1.4.0-alpha08 содержит следующие коммиты .

Изменения в API

  • API расширения TraceProcessor.runSession() переведены в экспериментальный режим, поскольку в Android они, вероятно, в конечном итоге станут конкретными конструкторами. ( Ib0528 , b/393640753 )
  • Большая часть реализации Startup Insights теперь находится в открытом доступе/экспериментальной стадии и перенесена в артефакт TraceProcessor См. StartupInsights . ( I0aa00 )
  • Объявить BenchmarkRule.runWithTimingDisabled {} устаревшим и заменить его на BenchmarkRule.runWithMeasurementDisabled {} , который более четко описывает поведение — все метрики приостанавливаются. Кроме того, предоставить доступ к суперклассу MicrobenchmarkScope поскольку повторное объявление функции runWithMeasurementDisabled для открытого доступа невозможно, так как она является встроенной. ( I9e23b , b/389149423 , b/149979716 )
  • Библиотеки для тестирования производительности перешли на Kotlin 2.0. ( I9d1e0 )
  • Удалён аргумент инструментирования androidx.benchmark.startupProfiles.enable . Он больше не нужен, так как им можно управлять с помощью аргумента includeInStartupProfile в BaselineProfileRule.collect() . ( I39eb4 )

Исправлены ошибки

  • Уменьшено количество внутренних функций Microbenchmark, вызываемых во время профилирования, чтобы, например, трассировки методов стали более наглядными ( Ifaed8 ).
  • Предполагаемое исправление ошибок, приводящих к сбоям: «Не удалось остановить [ ProcessPid(processName=perfetto, pid=...) ]». Теперь Benchmark будет выводить сообщение в лог вместо сбоя, если фоновый процесс Perfetto не удается остановить перед запуском теста. ( I37d3e , b/323601788 )
  • Исправлены IllegalStateExceptions с меткой 'Expected pm dump-profiles stdout', вызванные чрезмерно строгой проверкой формата вывода. ( I358dc )

Версия 1.4.0-alpha07

29 января 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-alpha07 . Версия 1.4.0-alpha07 содержит следующие коммиты .

Новые функции

  • BaselineProfileRule теперь добавлен API collectWithResults(...) , который включает список путей к вычисленным профилям. ( I056f8 )
  • Добавлен аргумент инструментария androidx.benchmark.measureRepeatedOnMainThread.throwOnDeadline , который можно установить в значение false, чтобы отключить генерацию исключения при достижении крайнего срока для measureRepeatedOnMainThread при локальном тестировании. В противном случае это не рекомендуется, так как увеличивает вероятность возникновения ошибок ANR во время тестов. ( Idbeec , b/353226476 )

Изменения в API

  • Добавлена ​​аннотация @JvmOverloads в конструктор MicrobenchmarkConfig . ( I13fd3 )
  • Переработан BenchmarkRule , теперь он построен на основе сопрограмм и поддерживает более эффективное поведение yield() . В результате рефакторинга были удалены несколько экспериментальных API BenchmarkState , но при необходимости будут внесены замены. Кроме того, добавлена ​​опция runWithMeasurementDisabled для уточнения поведения (все измерения приостанавливаются). В будущем runWithTimingDisabled будет объявлена ​​устаревшей. ( I19837 , b/389149423 , b/311242861 )
  • Переместите PerfettoTraceProcessor в TraceProcessor в новый артефакт androidx.benchmark:benchmark-traceprocessor и сделайте большую часть его API неэкспериментальной. Любые пользовательские TraceMetric или любые операции чтения из трассировок потребуют обновления до нового импорта TraceProcessor . Новый API TraceProcessor работает точно так же, как и старый, но представляет собой автономную библиотеку интерфейса (в некоторой степени аналогичную слою androidx.sqlite из Room) с специфичной для Android реализацией, встроенной в macrobenchmark. Новый артефакт также можно использовать на JVM, но в настоящее время вам потребуется запустить собственную копию бинарного файла TraceProcessor и указать порт для подключения к нему. ( I3a767 , I62563 , b/381134564 )

Исправлены ошибки

  • Выводить более понятное сообщение об ошибке, когда MacrobenchmarkScope.startActivityAndWait не удается запустить целевой процесс (возможно, из-за сбоя в целевом процессе), вместо более неоднозначного сообщения «Невозможно подтвердить завершение запуска действия» ( I3539b ).
  • Исправлено несколько синтаксических ошибок в примерах Kotlin, а также подсветка синтаксиса в нескольких примерах Java / build.gradle. ( Ib3808 )
  • Уточнена документация по параметрам ArtMetric и CaptureInfo . ( I96e60 )

Версия 1.4.0-alpha06

11 декабря 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-alpha06 . Версия 1.4.0-alpha06 содержит следующие коммиты .

Изменения в API

  • Удалено использование аннотации @Language("sql") в методе PerfettoTraceProcessor.Session.query() , поскольку подсветка синтаксиса/парсинг в Studio не работают. ( Idc2fa , b/377733398 )

Исправлены ошибки

  • В этой библиотеке теперь используются аннотации JSpecify, определяющие наличие нулевого значения , которые относятся к использованию типов. Разработчикам Kotlin следует использовать следующий аргумент компилятора для обеспечения корректного использования: -Xjspecify-annotations=strict (это значение по умолчанию, начиная с версии 2.1.0 компилятора Kotlin). ( I46810 , b/326456246 )
  • Исправлена ​​ошибка ArtMetric теперь он сообщает о загрузке класса (а не об инициализации), а также улучшена документация для уточнения поведения во время выполнения. ( I9915c )
  • В многопользовательском режиме Android команды можно выполнять только от имени root-пользователя на устройствах с root-правами. ( I88b44 )

Версия 1.4.0-alpha05

13 ноября 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-alpha05 . Версия 1.4.0-alpha05 содержит следующие коммиты .

Исправлены ошибки

  • Исправлена ​​ошибка в API 34+, из-за которой CompilationMode.None() демонстрировал непостоянную производительность, не отражающую начальный, наихудший сценарий. Это решает проблему, связанную с изменением платформы, которое позволяет verify состояния компиляции ART частично компилировать приложения (влияя только на загрузку классов) вскоре после первого запуска. ( IE48d0 )
  • Исправлена ​​ошибка, из-за которой могли быть получены (особенно короткие) трассировки, которые не сообщали бы об измерениях из встроенных метрик Macrobenchmark, поскольку имя процесса усекалось в трассировке Perfetto. Теперь Macrobenchmark обходит эту проблему, проверяя усеченное имя пакета во всех встроенных запросах в дополнение к ожидаемому имени пакета. Обратите внимание, что пользовательские реализации TraceMetric или другие прямые вызывающие PerfettoSession.query могут реализовать такое же поведение, изменив process.name LIKE "$packageName" в запросе Perfetto на (process.name LIKE "$packageName" OR process.name LIKE "$(packageName.takeLast(15))") . ( I5bf01 , b/377565760 )

Версия 1.4.0-alpha04

30 октября 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-alpha04 . Версия 1.4.0-alpha04 содержит следующие коммиты .

Новые функции

  • (Экспериментальная функция) Включить генерацию базового профиля и тестирование производительности приложений, установленных для дополнительного пользователя, например, любого приложения на устройствах Android Auto без графического интерфейса. Эта функция была протестирована в нескольких сценариях, но сообщите нам об ошибке, если она у вас не работает. ( I9fcbe , b/356684617 , b/373641155 )

Исправлены ошибки

  • Теперь в сборках для бенчмарков isProfileable всегда переопределяется, а isDebuggable также всегда переопределяется как в сборках для бенчмарков, так и в сборках nonMinified (с захватом базового профиля). ( I487fa , b/369213505 )
  • Исправлено определение компиляции на некоторых физических устройствах до API 28 — затрагивает context.compilationMode json.compilationMode, а также поведение androidx.benchmark.requireAot=true (которое больше не приводит к некорректному исключению) ( Ic3e08 , b/374362482 ).
  • В метриках CpuEventCounter генерируется исключение, если наблюдаются недопустимые измерения (например, инструкции/циклы ЦП == 0) ( I8c503 ).

Версия 1.4.0-alpha03

16 октября 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-alpha03 . Версия 1.4.0-alpha03 содержит следующие коммиты .

Изменения в API

  • Macrobenchmark : Добавляет ArtMetric , который можно использовать для проверки покрытия профилирования или общей производительности среды выполнения Android. Захватывает количество и общую продолжительность JIT-компиляции, инициализации класса (где это возможно) и проверки класса. Кроме того, изменяет CaptureInfo , чтобы включить необязательную версию основной ветки ART в качестве значения по умолчанию. ( I930f7 )
  • Добавьте coefficientOfVariation в JSON-вывод результатов бенчмарка, чтобы показать стабильность в рамках заданного запуска бенчмарка. ( Ib14ea )

Исправлены ошибки

  • Исправлена ​​ошибка CollectBaselineProfileTask возникающая при наличии пробелов в названии устройства AVD. ( Ia0225 , b/371642809 )
  • Предполагаемое исправление ошибок, возникающих из-за исключений StartupMode.COLD : Package <packagename> must not be running prior to cold start! Теперь MacrobenchmarkScope.killProcess() (включая тот, который выполняется перед каждой итерацией и используется для реализации поведения StartupMode.COLD ) будет ждать подтверждения того, что все запущенные процессы приложения остановлены. ( I60aa6 , b/351582215 )
  • Исправлена ​​ошибка UNLOCKED_, из-за которой на некоторых эмуляторах с root-доступом появлялась ошибка. ( Ic5117 )
  • В этой библиотеке теперь используются аннотации JSpecify, определяющие наличие нулевого значения , которые относятся к использованию типов. Разработчикам Kotlin следует использовать следующий аргумент компилятора для обеспечения корректного использования: -Xjspecify-annotations=strict (это значение по умолчанию, начиная с версии 2.1.0 компилятора Kotlin). ( I7104f , b/326456246 )

Версия 1.4.0-alpha02

2 октября 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-alpha02 . Версия 1.4.0-alpha02 содержит следующие коммиты .

Изменения в API

  • Задачи Gradle lockClocks и unlockClocks перемещены в проекты бенчмарков, а не доступны на верхнем уровне. Это изменение было необходимо, поскольку, к сожалению, нет способа зарегистрировать их как действия верхнего уровня без нарушения изоляции проекта. ( I02b8f , b/363325823 )

Исправлены ошибки

  • Теперь BaselineProfileRule собирает профили для многопроцессных приложений, сигнализируя каждому запущенному процессу в конце блока о необходимости сохранения профилей. Если компиляция на основе профилей так и не находит процесс для отправки широковещательного сообщения, компиляция завершится неудачей, поскольку наличие данных профиля внутри процесса является неожиданным. Кроме того, добавлен аргумент инструментирования для управления длительностью ожидания сохранения: androidx.benchmark.saveProfileWaitMillis ( I0f519 , b/366231469 )
  • Начиная с версии Benchmark 1.3.2 : Исправлена ​​ошибка, из-за которой Firebase Test Lab (FTL) не мог получить файлы результатов Baseline Profile или Macrobenchmark из плагина Gradle Baseline Profile. ( I2f678 , b/285187547 )

Для использования FTL примените плагин к модулю базового профиля в блоке плагинов, используя:

  plugins {
      ...
      id("com.google.firebase.testlab")
  }

а затем настройте тестовую лабораторию Firebase следующим образом:

  firebaseTestLab {

      // Credentials for FTL service
      serviceAccountCredentials.set(file("credentials.json"))

      // Creates one or more managed devices to run the tests on.
      managedDevices {
          "ftlDeviceShiba34" {
              device = "shiba"
              apiLevel = 34
          }
      }

      // Ensures the baseline profile is pulled from the device.
      // Note that this will be automated as well later with aosp/3272935.
      testOptions {
          results {
              directoriesToPull.addAll("/storage/emulated/0/Android/media/${android.namespace}")
          }
      }
  }

Кроме того, созданное устройство FTL необходимо добавить в расширение базового профиля:

  baselineProfile {
      managedDevices += "ftlDeviceShiba34"
      useConnectedDevices = false
  }

Версия 1.4.0-alpha01

18 сентября 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.4.0-alpha01 . Версия 1.4.0-alpha01 содержит следующие коммиты .

Новая функция — Аналитика стартапов в сфере мобильных приложений.

  • В Macrobenchmark можно включить начальную версию функции анализа запуска приложения. ( 09fae38 )

Чтобы включить в тесте производительности стартапа:

  @Test
  fun startup {
      macrobenchmarkRule.measureRepeated(
          
          packageName = "com.example.my.application.id"
          metrics = listOf(StartupTimingMetric()),
          iterations = 5,
          startupMode = StartupMode.COLD,
          compilationMode = CompilationMode.None(),
          experimentalConfig = ExperimentalConfig(startupInsightsConfig = StartupInsightsConfig(isEnabled = true))
          ) {
          scope.startActivityAndWait(...)
      }
  }

Затем запуск теста производительности при запуске проанализирует трассировку на предмет распространенных проблем и выведет их в выходные данные теста Studio на вкладке «Тест производительности», например:

StartupBenchmark_startup[startup=COLD,compilationMode=None]
├── Metrics
│   ├──   timeToFullDisplayMs                min  1,147.2,   median  1,208.8,   max  1,307.4
│   └──   timeToInitialDisplayMs             min  1,147.2,   median  1,208.8,   max  1,307.4
├── App Startup Insights
│   ├── App in debuggable mode (expected: false)
│   │   └── seen in iterations: 0(true) 1(true) 2(true) 3(true) 4(true) 5(true) 6(true) 7(true) 8(true) 9(true)
│   ├── Potential CPU contention with another process (expected: < 100000000ns)
│   │   └── seen in iterations: 4(105022546ns)
│   └── Main Thread - Binder transactions blocked (expected: false)
│       └── seen in iterations: 7(true)
└── Traces
    └── Iteration 0 1 2 3 4 5 6 7 8 9

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

Новые функции

  • Добавлено свойство gradle androidx.baselineprofile.suppressWarnings для подавления всех предупреждений базового профиля. ( 314153a )
  • Теперь метрики Microbench отображаются в трассировках Perfetto в виде счетчиков. ( 3214854 )
  • Добавлены экспериментальные скрипты для отключения JIT (требуется root-права/перезапуск среды выполнения) и сброса состояния производительности/тестирования устройства. В настоящее время они не опубликованы как задачи Gradle. ( 7c3732b )
  • Добавлен аргумент benchmark для пропуска тестов при запуске на эмуляторе. Если включен параметр automaticGenerationDuring build, тесты также будут запускать генерацию базового профиля. Это приведет к ошибке, если используются эмуляторы. С помощью нового аргумента skipBenchmarksOnEmulator мы можем вместо этого пропустить тест. ( 0c2ddcd )
  • Изменение логики включения событий производительности для работы на API 23+ ( 2550048 )

Изменения в API

  • Существующий экспериментальный аргумент PerfettoConfig для MacrobenchmarkRule.measureRepeated() перемещен в новый объект ExperimentalConfig .

Исправлены ошибки

  • Увеличьте количество повторных попыток lockClocks.sh ( 99e9dac )
  • Не создавайте nonMinified и тестовые типы сборок, если они уже существуют. Из-за ошибки, даже если nonMinified и тестовые типы сборок существовали, они всё равно создавались заново. ( e75f0a5 )
  • Игнорировать незавершающиеся срезы из результатов TraceSectionMetric . ( a927d20 )
  • Улучшена проверка эмулятора с учетом префикса sdk_ . ( 1587de8 )
  • Неработающие пакеты следует рассматривать как очищенные в FrameTimingGfxInfoMetric . ( 35cc79c )
  • Исправлена ​​ошибка, из-за которой androidx.benchmark.cpuEventCounter выдавал некорректные значения для событий, не связанных с инструкциями. ( 06edd59 )
  • Исправлена ​​ошибка resumeTiming/runWithTimingDisabled , чтобы они учитывали порядок приоритета метрик и значительно уменьшили влияние паузы/возобновления выполнения метрик с более низким приоритетом на результаты метрик с более высоким приоритетом. Например, если используются счетчики производительности ЦП через аргумент инструментария cpuEventCounter.enable , timeNs больше не уменьшается значительно при возникновении паузы/возобновления. ( 5de0968 )

Версия 1.3

Версия 1.3.4

26 марта 2025 г.

Выпущена версия androidx.benchmark:benchmark-*:1.3.4 . Версия 1.3.4 содержит следующие коммиты .

Исправлены ошибки

  • Исправлены несовместимости изоляции проектов Gradle в базовом плагине Gradle для бенчмарка. ( b/404523257 )

Версия 1.3.3

16 октября 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.3.3 . Версия 1.3.3 содержит следующие коммиты .

Исправлены ошибки

  • Исправлена ​​ошибка CollectBaselineProfileTask когда в названии устройства AVD присутствуют пробелы ( Ia0225 , b/371642809 ).

Версия 1.3.2

2 октября 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.3.2 . Версия 1.3.2 содержит следующие коммиты .

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой Firebase Test Lab (FTL) не мог получить файлы результатов Baseline Profile или Macrobenchmark из плагина Gradle Baseline Profile. ( I2f678 , b/285187547 )

Для использования FTL примените плагин к модулю базового профиля в блоке плагинов, используя:

  plugins {
      ...
      id("com.google.firebase.testlab")
  }

а затем настройте тестовую лабораторию Firebase следующим образом:

  firebaseTestLab {

      // Credentials for FTL service
      serviceAccountCredentials.set(file("credentials.json"))

      // Creates one or more managed devices to run the tests on.
      managedDevices {
          "ftlDeviceShiba34" {
              device = "shiba"
              apiLevel = 34
          }
      }

      // Ensures the baseline profile is pulled from the device.
      // Note that this will be automated as well later with aosp/3272935.
      testOptions {
          results {
              directoriesToPull.addAll("/storage/emulated/0/Android/media/${android.namespace}")
          }
      }
  }

Кроме того, созданное устройство FTL необходимо добавить в расширение базового профиля:

  baselineProfile {
      managedDevices += "ftlDeviceShiba34"
      useConnectedDevices = false
  }

Версия 1.3.1

18 сентября 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.3.1 . Версия 1.3.1 содержит следующие коммиты .

Исправлены ошибки

  • Добавлено свойство gradle androidx.baselineprofile.suppressWarnings для подавления всех предупреждений базового профиля ( I7c36e , b/349646646 ).
  • Исправлена ​​ошибка в плагине Gradle для профилирования базовых показателей: теперь он использует уже существующие nonMinified… и benchmark… если они созданы приложением, вместо создания оберток. ( Ia8934 , b/361370179 )
  • Исправлена java.lang.AssertionError: ERRORS (not suppressed): EMULATOR при включенной опции automaticGenerationDuringBuild на эмуляторах. Вместо этого используется новый аргумент для пропуска теста. ( If3f51 , b/355515798 )
  • Минимизация Microbenchmark - сохранение подклассов org.junit.runner.notification.RunListener в библиотеке бенчмарков proguard ( Ic8ed5 , b/354264743 )
  • Исправлена ​​ошибка TraceSectionMetric , из-за которой не завершающиеся срезы считались имеющими длительность -1, например, при суммировании или поиске минимальной длительности. ( If74b7 )
  • Исправлена ​​ошибка в FrameTimingGfxInfoMetric из-за которой запуск метрики приводил к сбою, если процесс еще не был запущен. ( I6e412 )

Версия 1.3.0

21 августа 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.3.0 . Версия 1.3.0 содержит следующие коммиты .

Изменения в микротестах, произошедшие с версии 1.2.0.

  • Трассировка методов включена по умолчанию в микротестах при запуске на большинстве устройств.
    • Трассировка методов выполняется в отдельной фазе, после измерений — это позволяет получать точные результаты измерений и трассировку методов из одного запуска теста.
    • В некоторых версиях Android OS и ART трассировка методов может повлиять на последующие этапы измерения — в этих версиях трассировка методов по умолчанию отключена, и в вывод Studio выводится предупреждение.
  • Тесты производительности основного потока и ANR
    • Добавлена measureRepeatedOnMainThread для тестирования производительности потоков пользовательского интерфейса (например, тех, которые взаимодействуют с интерфейсами Compose/View), чтобы избежать ошибок ANR при длительной работе.
    • Трассировка методов пропускается, если ожидается, что она превысит крайний срок предотвращения ANR. Установите параметр androidx.benchmark.profiling.skipWhenDurationRisksAnr в значение false, чтобы отключить это поведение (не рекомендуется для запусков CI, так как ANR могут вызывать проблемы при длительных запусках CI).
  • Минификация
    • Встроенные правила ProGuard для улучшения микротестирования производительности с включенной функцией минификации.
    • Для минификации/R8 в библиотечном модуле требуется AGP 8.3, и её можно включить с помощью android.buildTypes.release.androidTest.enableMinification в файле build.gradle
    • Добавлен экспериментальный API BlackHole.consume() для предотвращения удаления мертвого кода ( If6812 , b/286091643 )
  • Метрики
    • Экспериментальная функция счетчика событий ЦП (метрики из perf_event_open , для работы которой на большинстве версий платформы требуются права root), доступ через InstrumentationArgument androidx.benchmark.cpuEventCounter.enable (можно установить значение true ), а androidx.benchmark.cpuEventCounter.events можно установить, например, в значение ( Instructions,CpuCycles ). Эта функция должна поддерживаться в некоторых эмуляторах пользовательского отладки, но поддержка не тестировалась на всех доступных эмуляторах.

Изменения в MACRObenchmark с версии 1.2.0

  • Пересмотр механизма трассировки методов для макротестов.
    • Теперь трассировка методов ограничивается длительностью блока measureBlock и может охватывать несколько сессий, если процесс запускается несколько раз.
    • Ранее трассировка методов работала только для тестов StartupMode.COLD и ничего не фиксировала для measureBlocks , которые не перезапускали целевой процесс.
    • Исправлена ​​ошибка в трассировке методов в макротесте, благодаря чему трассировка методов должна быть полностью зафиксирована и корректна даже на более медленных устройствах. ( I6349a , b/329904950 )
  • Корректно сохранять профиль ART во время отдельных итераций warmUp при завершении процесса, чтобы измерения CompilationMode.Partial(warmup=N) были более точными. ( I17923 )
  • Сообщение об ошибке трансляции Drop Shader
    • Добавлены подсказки по отладке для сообщения об ошибке широковещательной передачи шейдера.
    • Добавьте два аргумента инструментирования для переопределения поведения отбрасывания шейдеров, чтобы обойти сбои при тестировании производительности приложений без ProfileInstaller 1.3:
      • androidx.benchmark.dropShaders.enable=true/false : можно использовать для пропуска всех операций удаления шейдеров (включая запуск в StartupMode.Cold ), особенно при тестировании приложений, которые еще не используют profileinstaller 1.3.
      • androidx.benchmark.dropShaders.throwOnFailure=true/false : может использоваться для обеспечения отказоустойчивости при попытке удаления шейдеров, например, при тестировании приложений без profileinstaller 1.3 ( I4f573 ).
  • Добавлен экспериментальный вариант MacrobenchmarkRule#measureRepeated , который принимает пользовательский PerfettoConfig для полностью настраиваемой записи трассировки Perfetto. Обратите внимание, что неправильно настроенные конфигурации могут привести к сбою встроенных классов метрик. ( Idfd3d , b/309841164 , b/304038384 )
  • Чтобы уменьшить помехи, отмените фоновые задания dexopt перед запуском Macrobenchmark. ( I989ed )
  • Теперь Macrobenchmark ожидает 1 секунду, пока целевое приложение завершит запись профиля ART (ранее ожидание составляло 500 мс). ( I85a50 , b/316082056 )
  • Переработка TraceSectionMetric
    • Примечание : Изменения TraceSectionMetric указанные ниже, могут повлиять на выходные данные при использовании CI и могут привести к разрывам или нарушению синтаксического анализа.
    • Теперь по умолчанию используется значение «Сумма», поскольку этот показатель чаще всего применяется к повторяющимся событиям, и в таких случаях данные сначала отбрасываются.
    • Изменено для большей гибкости настройки и расширения доступных режимов.
    • Названия режимов теперь встроены в имя выходных данных метрики (в Studio и JSON).
    • Теперь поддерживаются срезы, созданные с помощью Trace.{begin|end}AsyncSection .
  • Метрики
    • Питание — добавлены PowerMetric.deviceSupportsHighPrecisionTracking , PowerMetric.deviceBatteryHasMinimumCharge() и PowerMetric.deviceSupportsPowerEnergy()
    • Metric.getResult переименован в getMeasurements , чтобы соответствовать типу возвращаемого значения.
    • Добавлены метки log.w / exception ко всем ошибкам обнаружения запуска. Это не меняет текущее поведение (поэтому некоторые ошибки генерируются автоматически, а другие молча не обнаруживают запуск), просто делает его более понятным. Как правило, ошибки, которые вызывают Log.w() и не сообщают метрики запуска, связаны с отсутствием событий, не связанных с кадрами; исключения генерируются при обнаружении запуска, за исключением информации о времени кадра (из фрагментов UI/RT). ( Id240f , b/329145809 )
    • Добавлено измерение frameCount в FrameTimingMetric для облегчения выявления сценариев, в которых измерения изменяются из-за изменения количества созданных кадров (добавлены новые анимации, исправлены проблемы с некорректным отображением). ( I1e5aa )
    • Уточнено, что frameOverrunMs является предпочтительной метрикой для отслеживания, если она доступна в документации, и почему. ( I18749 , b/329478323 )
    • Исправлена ​​ошибка, из-за которой незавершенные кадры в начале и конце трассировки могли объединяться в пары, что приводило к некорректному отображению как одного чрезвычайно длинного кадра. ( I39353 , b/322232828 )
    • Улучшить сообщение об ошибке FrameTimingMetric , возникающее при недоставке кадров, и всегда выводить ссылку на трассировку при сбое анализа метрики для облегчения диагностики проблемы. ( I956b9 )
    • Исправлена ​​ошибка, приводившая к сбою в FrameTimingMetric при разборе идентификатора кадра, особенно на некоторых устройствах OEM. ( Ia24bc , b/303823815 , b/306235276 )
    • В FrameMetrics ослаблена строгость проверок, а сообщения об ошибках стали более подробными. ( Iadede )

Изменения в плагине Gradle для захвата базового профиля с версии 1.2.0

  • Повышена максимальная рекомендуемая версия AGP до 9.0.0-alpha01.
  • Убедитесь, что задачи mergeArtProfile и mergeStartupProfile всегда ожидают завершения генерации базового профиля. ( I623d6 , b/343086054 )
  • Успешное создание базового профиля приведет к выводу сводки изменений ( I824c8 , b/269484510 ).
  • Добавлен DSL для отключения предупреждений ( Ic4deb , b/331237001 )
  • Исправление, гарантирующее использование сгенерированных базовых профилей в тестах производительности при отключенной опции automaticGenerationDuringBuild ( Ic144f , b/333024280 )
  • Исправлены переопределения свойств плагина Gradle BaselineProfile , позволяющие создавать базовые профили и проводить бенчмаркинг при настройке типа сборки nonMinified или с бенчмаркингом. ( Ib8f05 , b/324837887 )
  • Исправлена ​​ошибка, из-за которой базовые профили библиотеки не включались в AAR до версии AGP 8.3.0-alpha15. ( I1d2af , b/313992099 )
  • Исправлен URL-адрес выходных данных базового и начального профилей в конце задачи генерации. ( I802e5 , b/313976958 )

Другие существенные изменения по сравнению с версией 1.2.0

  • Захват трассировки
    • Ошибка EXITCODE 2 при запуске perfetto была уменьшена с ошибки до зарегистрированного предупреждения.
    • Включить трассировку AIDL по умолчанию в бенчмарках (требуется API 28) ( Ia0af2 , b/341852305 )
    • В бенчмарках по умолчанию включена трассировка тегов Портера. Это позволяет, например, захватывать точки трассировки Wakelock. ( Icfe44 , b/286551983 )
    • Увеличено время ожидания начала захвата трассировки во избежание сбоев при запуске трассировки на более медленных устройствах ( I98841 , b/329145808 )
    • Добавлены общедоступные API PerfettoTraceProcessor.Session.queryMetrics с вариантами JSON, textproto и proto binary (undecoded). Они позволяют запрашивать метрики, встроенные в TraceProcessor ( I54d7f , b/304038382 ).
    • Включите блокировку начала записи трассировки Perfetto, чтобы снизить риск потери данных в начале трассировки. Поддерживается только в API 33+. ( IE6E41 , b/310760059 )
  • вывод в формате JSON
    • В JSON-вывод добавлена ​​дополнительная информация в контексте бенчмарка:
      • context.artMainlineVersion — целочисленная версия основного модуля Art (если присутствует на устройстве, в противном случае -1 )
      • context.build.id - Равно android.os.Build.ID
      • context.build.version.codename - Равно android.os.Build.VERSION.CODENAME
      • context.build.version.abbreviatedCodename - соответствует первой букве кодового имени предварительной версии (включая кодовые имена в релизных сборках) ( IE5020 )
    • Добавлен список profilerOutput в JSON-вывод для упрощения работы с трассировками профилирования (например, трассировками Perfetto, Method) ( I05ddd , b/332604449 )
    • Добавлено предупреждение при использовании Android Test Orchestrator в модулях бенчмарка, поскольку это приведет к многократному перезаписыванию выходных JSON-файлов для каждого модуля. ( Ia1af6 , b/286899049 )
    • Выбрасывайте исключение, если имена файлов длиннее 200 символов, чтобы избежать неясных сбоев при записи или постобработке файлов. ( I4a5ab )

Версия 1.3.0-rc01

7 августа 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.3.0-rc01 . Версия 1.3.0-rc01 содержит следующие коммиты .

Исправлены ошибки

  • Исправлена ​​ошибка, из-за которой androidx.benchmark.cpuEventCounter выдавал некорректные значения для событий, не связанных с инструкциями ( I7386a , b/286306579 ).
  • Исправлены resumeTiming / runWithTimingDisabled , чтобы они учитывали порядок приоритета метрик и значительно уменьшили влияние паузы/возобновления выполнения метрик с более низким приоритетом на результаты метрик с более высоким приоритетом. Например, при использовании счетчиков производительности ЦП через аргумент инструментария cpuEventCounter.enable , timeNs больше не уменьшается значительно при возникновении паузы/возобновления. ( I39c2e , b/286306579 , b/307445225 )
  • Снижена вероятность того, что measureRepeatedOnMainThread вызовет срабатывание таймаута основного потока из-за выборки из стека, за счет переноса преобразования выборки из стека за пределы основного потока. ( I487a8 , b/342237318 )
  • Удалено ручное описание доступа к новым API платформы, поскольку это происходит автоматически посредством моделирования API при использовании R8 с AGP 7.3 или более поздней версии (например, R8 версии 3.3) и для всех сборок при использовании AGP 8.1 или более поздней версии (например, D8 версии 8.1). Клиентам, не использующим AGP, рекомендуется обновиться до D8 версии 8.1 или более поздней. Подробнее см. в этой статье . ( I9496c , b/345472586 )
  • Добавлена ​​проверка версии AGP для отправки имени пакета в качестве аргумента инструментария. До версии AGP 8.4.0 имя пакета целевого приложения нельзя было отправить в приложение для инструментирования через аргументы инструментария. ( 0c72a3f )

Версия 1.3.0-beta02

10 июля 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.3.0-beta02 . Версия 1.3.0-beta02 содержит следующие коммиты .

Исправлены ошибки

  • При запуске Perfetto корректно обработайте код завершения EXITCODE 2 , зарегистрируйте предупреждение в журнале, но продолжите работу.

Версия 1.3.0-beta01

12 июня 2024 г.

Выпущена версия androidx.benchmark:benchmark-*:1.3.0-beta01 . Версия 1.3.0-beta01 содержит следующие коммиты .

Изменения в API

  • Для обеспечения единообразия переименована MethodTracing.affectsMeasurementOnThisDevice в AFFECTS_MEASUREMENT_ON_THIS_DEVICE . ( I1bdfa )
  • Добавлен экспериментальный API BlackHole.consume() для предотвращения удаления мертвого кода в микротестах. ( If6812 , b/286091643 )
  • Microbenchmark will now correctly throw to prevent method tracing from interfering with measurements. This occurs on certain devices when method tracing is forced on (via instrumentation args or MicrobenchmarkConfig ), and if a measurement is attempted after a method trace. Affected devices are running API 26-30 or certain ART mainline module versions affected by this interference, and can be detected at runtime via ProfilerConfig.MethodTracing.affectsMeasurementOnThisDevice . ( Iafb92 , b/303660864 )

Исправлены ошибки

  • Bumped max agp version recommended to 9.0.0-alpha01. ( I5bbb0 )
  • Added compilation mode to benchmark context ( If5612 , b/325512900 )
  • Enable AIDL tracing by default (requires API 28) ( Ia0af2 , b/341852305 )
  • Added additional information in benchmark context in JSON output:
    • context.artMainlineVersion - integer version of Art mainline module (if present on device, -1 otherwise)
    • context.build.id - Equals android.os.Build.ID
    • context.build.version.codename - Equals android.os.Build.VERSION.CODENAME
    • context.build.version.abbreviatedCodename - corresponds to first letter of pre-release codename (even on release builds) ( Ie5020 )
  • Fixes StackSampling to respect androidx.benchmark.profiling.sampleDurationSeconds ( Ib1d53 )
  • Change macro->common dependency to be api() , so it's easier to use eg PerfettoTrace and PerfettoConfig . ( Icdae3 , b/341851833 )
  • Ensure mergeArtProfile and mergeStartupProfile tasks always wait for baseline profile generation. ( I623d6 , b/343086054 )
  • Consider variant enable state when deciding whether variant should be enabled. ( I5d19e , b/343249144 )
  • Increased default start timeout for perfetto trace processor. ( I87e8c , b/329145808 )

Version 1.3.0-alpha05

14 мая 2024 г.

androidx.benchmark:benchmark-*:1.3.0-alpha05 is released. Version 1.3.0-alpha05 contains these commits .

Исправлены ошибки

  • Throw clearer exception when macrobench metric returns zero values for all iterations ( Iab58f , b/314931695 )
  • Additional workaround rules added to microbench proguard rules, including support for listener rules and other observed warnings / errors. ( I14d8f , b/329126308 , b/339085669 )
  • Method tracing runs as a separate phase during a Macrobenchmark, and it no longer affects measurements. ( If9a50 , b/285912360 , b/336588271 )
  • Added extra debugging suggestions to drop shader broadcast failure message. ( I5efa6 , b/325502725 )

Version 1.3.0-alpha04

1 мая 2024 г.

androidx.benchmark:benchmark-*:1.3.0-alpha04 is released. Version 1.3.0-alpha04 contains these commits .

Изменения в API

  • Added experimental MacrobenchmarkRule#measureRepeated variant which takes a custom PerfettoConfig for fully customized Perfetto trace recording. Note that incorrectly configured configs may cause built in Metric classes to fail. ( Idfd3d , b/309841164 , b/304038384 )
  • Rename PowerMetric.deviceSupportsPowerEnergy to PowerMetric.deviceSupportsHighPrecisionTracking for clarity ( I5b82f )
  • Added PowerMetric.deviceBatteryHasMinimumCharge() and PowerMetric.deviceSupportsPowerEnergy() to enable changing or skipping benchmarks based on device power measurement capability. ( I6a591 , b/322121218 )

Исправлены ошибки

  • Added comparison with previous baseline profile ( I824c8 , b/269484510 )
  • Added DSL to disable warnings ( Ic4deb , b/331237001 )
  • Changed exception to info log when benchmark variants are disabled ( I8a517 , b/332772491 )
  • Make it simpler to capture method traces for a Macrobenchmark is scoped to the duration of the actual measureBlock() . Previously, it started at target process launch and only supported cold starts ( Iee85a , b/300651094 )
  • Avoid crashing when perfetto trace processor is slow to start ( I98841 , b/329145808 )

Version 1.3.0-alpha03

17 апреля 2024 г.

androidx.benchmark:benchmark-*:1.3.0-alpha03 is released. Version 1.3.0-alpha03 contains these commits .

Новые функции

  • Adds public API PerfettoTraceProcessor.Session.queryMetrics APIs with JSON, textproto, and proto binary (undecoded) variants. These allow you to query metrics built into TraceProcessor ( I54d7f , b/304038382 )
  • Added profilerOutput to JSON output for easier tooling around profiling traces (eg perfetto, method traces). ( I05ddd , b/332604449 )
  • Added power tag to benchmark Perfetto Config. This captures, for example, wakelock tracepoints. ( Icfe44 , b/286551983 )
  • Added inst argument androidx.benchmark.profiling.skipWhenDurationRisksAnr , can be set to false to avoid skipping method traces when expected duration may cause an ANR - strongly recommended to avoid in CI runs.
  • Added experimental inst argument androidx.benchmark.profiling.perfCompare.enable , set this to true to run comparison timing between measurement and profiling phases. Useful in eg evaluating overhead of method tracing. ( I61fb4 , b/329146942 )

Изменения в API

  • Changed TraceSectionMetric.Mode to sealed class to enable future expansion without breaking exhaustive when statements ( I71f7b )
  • Added TraceSectionMetric.Mode.Average and .Count , and reordered args so the more common argument (mode) was earlier in the arg list, reducing need for specifying parameter names. ( Ibf0b0 , b/315830077 , b/322167531 )
  • Renamed Metric.getResult to getMeasurements to match return type ( I42595 )

Исправлены ошибки

  • Fix to ensure benchmarks use generated baseline profiles when automaticGenerationDuringBuild is off ( Ic144f , b/333024280 )
  • Fix BaselineProfile gradle plugin property overrides to enable baseline profile generation and benchmarking when customizing a nonMinified or benchmark build type. ( Ib8f05 , b/324837887 )
  • Fixed method traces flush in macrobenchmark, so that method traces should be fully captured and valid, even on slower devices. ( I6349a , b/329904950 )
  • Enable blocking start on Perfetto trace record to reduce risk of missing data at beginning of trace. Only supported on API 33+. ( Ie6e41 , b/310760059 )
  • Added a warning when Android Test Orchestrator is used in benchmark modules, as this will cause per-module output JSON files to be repeatedly overwritten. ( Ia1af6 , b/286899049 )
  • Force ',' (comma) thousands separators for consistency in Studio output, ignoring device locale ( I3e921 , b/313496656 )
  • TraceSectionMetric now supports slices created using Trace.{begin|end}AsyncSection . ( I91b32 , b/300434906 )
  • Added log.w / exception labels to all startup detection failures. This does not change current behavior (so some errors throw, and others silently fail to detect the startup), just makes it more understandable. Generally the ones that Log.w() and fail to report startup metrics are those where non-frame events are missing, exceptions are thrown when startup is detected except for frame timing information (from UI/RT slices). ( Id240f , b/329145809 )
  • Cancel background dexopt jobs before running a Macrobenchmark to reduce interference. ( I989ed )
  • Added frameCount measurement to FrameTimingMetric to aid in discovery of scenarios where measurements change because the number of frames produced changed (new animations added, invalidation issues fixed). ( I1e5aa )
  • Clarified that frameOverrunMs is the preferred metric for tracking when available in docs, and why. ( I18749 , b/329478323 )

Version 1.3.0-alpha02

20 марта 2024 г.

androidx.benchmark:benchmark-*:1.3.0-alpha02 is released. Version 1.3.0-alpha02 contains these commits .

Новые функции

  • Experimental R8 support in microbench via embedded proguard rules. Note that this support is experimental, and requires AGP 8.3 for minification of library module tests. Use the following to enable R8 minification/optimization in your benchmark module's build.gradle , which should lead to a significant performance increase, depending on workload. ( I738a3 , b/184378053 )

    android {
        buildTypes.release.androidTest.enableMinification = true
    }
    

Исправлены ошибки

  • Fixes method tracing warning to be on separate line from microbench output. ( I0455c , b/328308833 )

Version 1.3.0-alpha01

21 февраля 2024 г.

androidx.benchmark:benchmark-*:1.3.0-alpha01 is released. Version 1.3.0-alpha01 contains these commits.

Изменения в API

  • Renamed MicrobenchmarkConfig boolean parameters to avoid unnecessary word 'should' ( Ia8f00 , b/303387299 )
  • Added BenchmarkRule.measureRepeatedOnMainThread so main thread benchmarks (eg ones touching Views or Compose UIs) can avoid triggering ANRs, especially during large suites in CI. ( I5c86d )
  • Added FrameTimingGfxInfoMetric , an experimental alternate implementation of FrameTimingMetric with measurements coming directly from the platform, rather than extracted from the Perfetto trace. ( I457cb , b/322232828 )
  • Add the ability to dump an ART profile during individual warmUp iterations. ( I17923 )
  • Several changes to TraceSectionMetric API:
    • Add Mode.Min , Mode.Max
    • Add label argument to override section name as metric label
    • Added mode name to output to clarify metric meaning
    • Changed default to sum, as most usage of this metric is for repeated events Be aware of this changes in CI usage, as it may create discontinuities or break parsing. ( Ic1e82 , b/301892382 , b/301955938 )

Исправлены ошибки

  • Improved error message in baseline profile gradle plugin when specified managed device does not exist ( Idea2b , b/313803289 )
  • Fix for including library baseline profiles in AAR prior to AGP 8.3.0-alpha15 ( I1d2af , b/313992099 )
  • Fixed baseline and startup profile output url at the end of generation task ( I802e5 , b/313976958 )
  • Adjusted data source timeouts to attempt to fix java.lang.IllegalStateException: Failed to stop [ProcessPid(processName=perfetto, pid=...)] ( I8dc7d , b/323601788 )
  • Add two instrumentation arguments for overriding shader dropping behavior to workaround crashes when benchmarking apps without ProfileInstaller 1.3:
    • androidx.benchmark.dropShaders.enable=true/false : can be used to skip all shader dropping (including that done in StartupMode.Cold launches), esp when benchmarking apps that don't yet use profileinstaller 1.3
    • androidx.benchmark.dropShaders.throwOnFailure=true/false : can be used to tolerate failures when trying to drop shaders, for example when benchmarking apps without profileinstaller 1.3 ( I4f573 )
  • Skip method tracing on UI thread when expected to take longer than a few seconds, and cleanup method traces when throwing. ( I6e768 )
  • Throw when filenames are longer than 200 chars to avoid unclear crashes when writing or post-processing files. ( I4a5ab )
  • Fixes issue where unterminated frames at the beginning and end of the trace could be paired together, which would incorrectly report as a single extremely long frame. ( I39353 , b/322232828 )
  • Use --skip verification on API 30+ when reinstalling a package on API 30-33 to clear ART profiles on user builds. This helps bypass Play Protect warnings that cause failures on some class of devices. ( Ic9e36 )
  • Use am force-stop to kill apps when not a system app like System UI or Launcher. ( I5e028 )
  • Macrobenchmark now waits for 1 second for the target application to flush an ART profile (previously it waited for 500 ms ). ( I85a50 , b/316082056 )
  • Improve FrameTimingMetric error when frames aren't produced, and always output link to trace when failing metric parsing to assist in diagnosing problem. ( I956b9 )
  • Fixed crash in FrameTimingMetric failing to parse frame id, especially on certain OEM devices. ( Ia24bc , b/303823815 , b/306235276 )
  • Relaxed strictness of checks in FrameMetrics , and added more detail to error messages. ( Iadede )

Версия 1.2

Версия 1.2.4

17 апреля 2024 г.

androidx.benchmark:benchmark-*:1.2.4 is released. Version 1.2.4 contains these commits .

Исправлены ошибки

  • Fixes baseline profile srcset not being set up in benchmark variants. Also fixes automaticGenerationDuringBuild in libraries causing a circular dependency. ( I28ab7 , b/333024280 )
  • Use am force-stop to kill apps when not a system app like System UI or Launcher. This fixes StartupMode.COLD benchmarks crashing from "Package $package must not be running prior to cold start!" due to process kill not fully succeeding. ( I5e028 )

Версия 1.2.3

24 января 2024 г.

androidx.benchmark:benchmark-*:1.2.3 is released. Version 1.2.3 contains these commits.

Исправлены ошибки

  • Removed exception from Baseline Profile Gradle Plugin when AGP version is 8.3.0 or higher.
  • Fix for including library baseline profiles in AAR prior to AGP 8.3.0-alpha15.

Версия 1.2.2

1 декабря 2023 г.

androidx.benchmark:benchmark-*:1.2.2 is released. Version 1.2.2 contains these commits.

Baseline Profiles

Версия 1.2.1

15 ноября 2023 г.

androidx.benchmark:benchmark-*:1.2.1 is released. Version 1.2.1 contains these commits.

Новые функции

Версия 1.2.0

18 октября 2023 г.

androidx.benchmark:benchmark-*:1.2.0 is released. Version 1.2.0 contains these commits.

Important changes since 1.1.0

Baseline Profiles

  • New Baseline Profile Gradle Plugin automates capturing and including baseline profiles in your test and build workflow.
  • BaselineProfileRule.collect now stable, a streamlined and simplified version of the previous experimental BaselineProfileRule.collectBaselineProfile API
    • Just specify packageName , and drive your app
  • For libraries generating baseline profiles, you can now filter the rules generated either in code ( BaselineProfileRule.collect argument), or even more simply in the gradle plugin
  • Исправления

Macrobenchmark

  • Компиляция
    • Macrobenchmark now correctly fully resets compilation state for each compile - this requires reinstalling the APK prior to Android 14, so benchmarking on Android 14+ is strongly recommended if you want to persist state (like user login) in what's being measured.
    • You can also work around this by controlling app compilation separately, and skipping compilation with CompilationMode.Ignore() or instrumentation argument
  • Instrumentation Arguments

    • Support for androidx.benchmark.dryRunMode.enable instrumentation argument, (already available in microbenchmark) for quicker validation runs (eg when creating the benchmark, or in presubmit)
    • Support for androidx.benchmark.profiling.mode=StackSampling and MethodTracing .
    • Added androidx.benchmark.enabledRules to allow runtime filtering baseline profile vs macrobenchmark rule tests
    • Added androidx.benchmark.perfettoSdkTracing.enable argument to enable tracing with tracing-perfetto, eg Compose recomposition tracing. Note that when used with StartupMode.COLD , timing will be significantly affected as the tracing library is loaded and enabled during app startup.
  • Требования

    • Macrobenchmark now requires ProfileInstaller 1.3.0 or greater in the target app, to enable profile capture / reset, and shader cache clearing.
  • New Experimental Metric APIs

  • Исправления

    • Fixed crashes when installing or extracting profiles from an app installed from multiple APKs (eg from app bundle).
    • Fixed FrameTimingMetric ignoring frames with inconsistent frame IDs (generally, frames during ripples on API 31+) ( I747d2 , b/279088460 )
    • Fixed parsing errors on traces > 64MB ( Ief831 , b/269949822 )
    • Clarified errors when device (especially emulator) OS image not correctly configured for tracing, or compilation
    • Skip battery level check for devices without battery (micro and macro)
    • Improved file output, with more clear errors for invalid output directories, and safer defaults
    • Improved stability of StartupMode.COLD by consistently dropping the shader cache (also exposed via MacrobenchmarkScope.dropShaderCache )
    • Fixed leanback fallback for startActivityAndWait .

Microbenchmark

  • Функции
    • Profiling was moved to a separate phase, after other metrics, so one test run can display both accurate timing and profiling results.
  • Experimental APIs
    • Added experimental MicrobenchmarkConfig API for defining custom metrics and configuring tracing and profiling. Can be used to capture method traces, or capture tracepoints (but be aware of tracing overhead).
    • Added experimental APIs for controlling BenchmarkState separately from BenchmarkRule , without JUnit
    • Added experimental PerfettoTrace record to enable capturing Perfetto traces, with custom configuration, separate from benchmark APIs.
  • Исправления
    • Workaround missing leading whitespaces in Android Studio benchmark output.
    • Fix issue where warnings could fail to print in Android Studio benchmark output.
    • Fixed SampledProfiling crash on Android 13 (API 33) and higher.
    • Massively improved performance of dryRunMode by skipping IsolationActivity and Perfetto tracing (Up to 10x faster dry run mode on older OS versions).

Version 1.2.0-rc02

6 октября 2023 г.

androidx.benchmark:benchmark-*:1.2.0-rc02 is released. Version 1.2.0-rc02 contains these commits.

Исправлены ошибки

  • Fix Benchmark file output to no longer break BaselineProfile Plugin file copying. Files were generated and copied off device, but had been renamed such that the gradle plugin wouldn't see them. ( I8dbcc , b/303034735 , b/296453339 )
  • Clarified tracing-perfetto loading error messages when injecting from macrobenchmark module into target application.

Version 1.2.0-rc01

20 сентября 2023 г.

androidx.benchmark:benchmark-*:1.2.0-rc01 is released. Version 1.2.0-rc01 contains these commits.

Исправлены ошибки

  • An exception (with remedy instructions) is now thrown when Perfetto SDK tracing fails to initialize in a Benchmark. ( I6c878 , b/286228781 )
  • Fix OOM crash when converting ART method trace -> perfetto format. ( I106bd , b/296905344 )
  • (Macrobenchmark) Clarified method tracing label when linked in Studio test output, and fixed method tracing filenames to be unique on device/host, so they won't be overwritten when more than one benchmark is run. ( I08e65 , b/285912360 )
  • Ensures that the device is awake when capturing a baseline profile. ( I503fc )

Version 1.2.0-beta05

August 30, 2023

androidx.benchmark:benchmark-*:1.2.0-beta05 is released. Version 1.2.0-beta05 contains these commits.

Новые функции

  • The Baseline Profile Gradle Plugin now supports Android Gradle Plugin 8.3. ( aosp/2715214 )

Version 1.2.0-beta04

23 августа 2023 г.

androidx.benchmark:benchmark-*:1.2.0-beta04 is released. Version 1.2.0-beta04 contains these commits.

Новые функции

  • The Baseline Profiles Gradle plugin now supports Android Gradle Plugin 8.3. ( aosp/2715214 )

Исправлены ошибки

  • Fix failures in writing / moving and pulling files (especially those from parameterized tests) by sanitizing output file names further, avoiding '=' and ':' in output file names. ( I759d8 )

Version 1.2.0-beta03

9 августа 2023 г.

androidx.benchmark:benchmark-*:1.2.0-beta03 is released. Version 1.2.0-beta03 contains these commits.

Изменения в API

  • Added argument to filter TraceSectionMetric to only the target package, on by default ( Ia219b , b/292208786 )

Исправлены ошибки

  • Renamed fullTracing.enable instrumentation argument to perfettoSdkTracing.enable for consistency with artifact name, and other references. fullTracing.enable will continue to work as a fallback. ( I7cc00 )
  • Benchmark library internal tracepoints (including microbenchmark loop/phase tracing) will now show up in Studio system trace viewer, and nest under the correct process in Perfetto. ( I6b2e7 , b/293510459 )
  • Removed macrobenchmark NOT-PROFILEABLE error on API 31+, and skip profileable check on eng/userdebug rooted devices. ( I2abac , b/291722507 )
  • When using Dex Layout Optimizations, startup profile rules are also now considered as baseline profile rules. ( aosp/2684246 , b/293889189 )

Version 1.2.0-beta02

26 июля 2023 г.

androidx.benchmark:benchmark-*:1.2.0-beta02 is released. Version 1.2.0-beta02 contains these commits.

Изменения в API

  • Added experimental APIs for microbench custom metrics and configuration (eg profiler, and tracing). ( I86101 , b/291820856 )

Исправлены ошибки

  • Report error in macrobench when OS is misconfigured for tracing, as was recently fixed in API 26/28 ARM64 emulators. ( I0a328 , b/282191686 )
  • Added detail to compilation reset failure to suggest updating emulator, as some emulators have recently fixed this issue. ( I8c815 , b/282191686 )
  • Make androidx.test.uiautomator:uiautomator:2.2.0 an api instead of an implementation dependency. ( I1981e )

Version 1.2.0-beta01

18 июля 2023 г.

androidx.benchmark:benchmark-*:1.2.0-beta01 is released. Version 1.2.0-beta01 contains these commits.

Исправлены ошибки

  • Fix warnings being sometimes suppressed in Benchmark output in Studio, and workaround leading whitespaces from Benchmark output not showing up in Studio ( Ia61d0 , b/227205461 , b/286306579 , b/285912360 )
  • Fixed comment for FrameTimingMetric . The submetric is named frameDurationCpuMs . ( Ib097f , b/288830934 ).

Version 1.2.0-alpha16

21 июня 2023 г.

androidx.benchmark:benchmark-*:1.2.0-alpha16 is released. Version 1.2.0-alpha16 contains these commits.

Изменения в API

  • BaselineProfileRule.collectBaselineProfile() API has been renamed to BaselineProfileRule.collect() . ( I4b665 )

Исправлены ошибки

  • Macrobenchmark support for androidx.benchmark.profiling.mode = MethodTracing . ( I7ad37 , b/285912360 )
  • Microbenchmark profiling moved to a separate phase, so it occurs in sequence after measurement, instead of replacing it. MethodTracing trace sections are also now included in the captured Perfetto trace, if present. ( I9f657 , b/285014599 )
  • Add count measurement to TraceSectionMetric with Mode.Sum . ( Ic121a , b/264398606 )

Version 1.2.0-alpha15

7 июня 2023 г.

androidx.benchmark:benchmark-*:1.2.0-alpha15 is released. Version 1.2.0-alpha15 contains these commits.

Новые функции

  • Added experimental MemoryUsageMetric for tracking memory usage of a target application. ( I56453 , b/133147125 , b/281749311 )
  • Add support for fully custom Perfetto configs with PerfettoTrace.record ( If9d75 , b/280460183 )
  • Added property to skip baseline profile generation. Usage: ./gradlew assemble -Pandroidx.baselineprofile.skipgeneration . ( I37fda , b/283447020 )

Изменения в API

  • The collectBaselineProfile API always generates stable baseline profiles. The collectStableBaselineProfile API has been removed and collectBaselineProfile should be used instead. ( I17262 , b/281078707 )
  • Changed BaselineProfileRule 's filterPredicate arg to non-null, with a equivalent default value so that the default filter behavior is more clear in docs. ( I3816e )

Исправлены ошибки

  • Disable IsolationActivity and Perfetto tracing in dryRunMode to significantly improve performance, as these were majority of runtime. ( Ie4f7d )
  • Support for call stack sampling in Macrobenchmarks using instrumentation test arguments androidx.benchmark.profiling.mode=StackSampling and androidx.benchmark.profiling.sampleFrequency . ( I1d13b , b/282188489 )
  • Fixes crash when dropping shaders on Android U (API 34), as well as on emulators. ( I031ca , b/274314544 )

Version 1.2.0-alpha14

3 мая 2023 г.

androidx.benchmark:benchmark-*:1.2.0-alpha14 is released. Version 1.2.0-alpha14 contains these commits.

Исправлены ошибки

  • Fix FrameTimingMetric ignoring frames with inconsistent frame IDs. This would cause some animations on recent platform versions (API 31+) to ignore many frames while RenderThread was animating (eg during a ripple). ( I747d2 , b/279088460 )
  • Fixed trace processor parsing for traces larger than 64Mb. ( Ief831 , b/269949822 )
  • Fixed baseline profile generation on Android U failing because of the different output of pm dump-profiles command. ( Id1392 , b/277645214 )
  • Fix GPU clock locking script to compare strings correctly ( I53e54 , b/213935715 )

Version 1.2.0-alpha13

5 апреля 2023 г.

androidx.benchmark:benchmark-*:1.2.0-alpha13 is released. Version 1.2.0-alpha13 contains these commits.

Изменения в API

  • Added profile type parameter when generating baseline profiles to support upcoming startup profile feature ( Ie20d7 , b/275093123 )
  • Added new experimental TraceMetric API for defining fully custom metrics based on content of a Perfetto trace. ( I4ce31 , b/219851406 )
  • Add an experimental metric to determine the number of page faults during a benchmark. ( I48db0 )

Version 1.2.0-alpha12

22 марта 2023 г.

androidx.benchmark:benchmark-*:1.2.0-alpha12 is released. Version 1.2.0-alpha12 contains these commits.

Новые функции

  • The new baseline profile gradle plugin is released in alpha version, making it easier to generate a baseline profile and simplifying the developer workflow.

Изменения в API

  • Removed Perfetto tracing support on API 21 and 22, which includes both Microbenchmarks and the experimental PerfettoTrace APIs. Prior to this version, UiAutomation connections were unreliable on some devices. ( I78e8c )
  • Added public experimental API for PerfettoTraceProcessor to enable parsing trace content. This is a step toward fully custom metrics based on Perfetto trace data. ( I2659e , b/219851406 )

Version 1.2.0-alpha11

8 марта 2023 г.

androidx.benchmark:benchmark-*:1.2.0-alpha11 is released. Version 1.2.0-alpha11 contains these commits.

Исправлены ошибки

  • Fixed crashes in MacrobenchmarkRule and BaselineProfileRule when reinstalling or extracting profiles from an app bundle with multiple APKs. ( I0d8c8 , b/270587281 )

Version 1.2.0-alpha10

22 февраля 2023 г.

androidx.benchmark:benchmark-*:1.2.0-alpha10 is released. Version 1.2.0-alpha10 contains these commits.

Новые функции

  • On Android 14+, Macrobenchmark no longer reinstalls target applications to reset compilation state, thanks to a new platform feature. Previously it was necessary to have a rooted device, or to deal with all application state (eg user login) being removed before each benchmark runs. ( I9b08c , b/249143766 )

Исправлены ошибки

  • Fix DryRunMode to no longer crash with empty profile, due to compilation skipping. Instead, it runs a single iteration and extracts the profile to ensure something is captured. ( I2f05d , b/266403227 )
  • Fix PowerMetric crash when checking for powerstats presence on old API levels. ( 5faaf9 , b/268253898 )

Version 1.2.0-alpha09

11 января 2023 г.

androidx.benchmark:benchmark-*:1.2.0-alpha09 is released. Version 1.2.0-alpha09 contains these commits.

Исправлены ошибки

  • Enabled passing None to androidx.benchmark.enabledRules instrumentation arg to disable all benchmarks / baseline profile generation. ( I3d7fd , b/258671856 )
  • Fix PerfettoTrace capture in app modules (ie non-self-instrumenting test APKs) ( I12cfc )
  • Fixed baseline profile adb pull argument order in Studio output ( I958d1 , b/261781624 )
  • Arm emulator api 33 is now correctly recognized as such when trying to run a macrobenchmark and will correctly print the warning. ( 69133b , b/262209591 )
  • Skip battery level check on devices without battery in Macrobenchmark ( fe4114 , b/232448937 )

Version 1.2.0-alpha08

7 декабря 2022 г.

androidx.benchmark:benchmark-*:1.2.0-alpha08 is released. Version 1.2.0-alpha08 contains these commits.

Изменения в API

  • Added experimental new APIs PerfettoTrace.record {} and PerfettoTraceRule to capture Perfetto traces (also known as System Traces) as part of a test, to inspect test behavior and performance. ( I3ba16 )
  • BaselineProfileRule now accepts a filter predicate instead of a list of package prefixes. This gives the test full control on filtering. ( I93240 )
  • Add an experimental API BaselineProfileRule.collectStableBaselineProfile which waits until a baseline profile is stable for N iterations. ( I923f3 )
  • Add the ability to specify an output file name prefix when generating baseline profiles using BaselineProfileRule . ( I7b59f , b/260318655 )

Исправлены ошибки

  • Improve safety of file output writing, which should prevent output files from silently not being written / appended, especially on API 21/22. ( If8c44 , b/227510293 )
  • Fix simpleperf trace output to create and place the file correctly. This should also more generally fix issues where a file is unsuccessfully pulled by gradle. ( I12a1c , b/259424099 )
  • Improve profileinstaller error message printed when profileinstaller is too old. This now tells you to update profileinstaller version (1.2.1) for measuring baseline profiles on API 31 through 33, instead of saying it's not supported. ( Ia517f , b/253519888 )
  • Fix several shell command failures onerror message Print needed API <=23, including failed perfetto capture binary setup and trace capture failures ( Ib6b87 , b/258863685 )
  • Automatically sort generated profile rules to minimize the number of changes as they change over time (when checking-in profile rules into source control). ( Ie2509 )
  • Fixed crash on unrooted builds below Android 13 (API 33) with message Expected no stderr from echo 3 > /proc/sys/vm/drop_caches ( I6c245 , b/259508183 )

Known Issues - MacrobenchmarkScope.dropShaderCache() may crash due to a missing broadcast registry in profileinstaller manifest, which has not yet been released. ( I5c728 , b/258619948 ) To workaround the issue in profileinstaller:1.3.0-alpha02 , add the following to your application's (not your benchmark's) AndroidManifest.xml:

  <!-- workaround bug in profileinstaller 1.3.0-alpha02, remove when updating to alpha03+ -->
  <receiver
    android:name="androidx.profileinstaller.ProfileInstallReceiver"
    android:permission="android.permission.DUMP"
    android:exported="true">
    <intent-filter>
        <action android:name="androidx.profileinstaller.action.BENCHMARK_OPERATION" />
    </intent-filter>
  </receiver>

Version 1.2.0-alpha07

9 ноября 2022 г.

androidx.benchmark:benchmark-*:1.2.0-alpha07 is released. Version 1.2.0-alpha07 contains these commits.

Изменения в API

  • Adds PowerMetric API for measuring energy and power in Macrobenchmarks. ( Ife601 , b/220183779 )
  • Fixed MacrobenchmarkScope.dropShaderCache() to actually drop the shader cache. This removes roughly 20ms of noise from StartupMode.COLD benchmarks, as shaders are now consistently cleared each iteration. Previously, Partial compilation using warmup iterations would report incorrectly fast numbers, as shader caching was more likely to happen during warmup. This fix requires either a rooted device, or using profileinstaller:1.3.0-alpha02 in the target app. For ProfileInstaller library's API changes, please refer to ProfileInstaller 1.30-alpha02 page. ( Ia5171 , b/231455742 )
  • Added TraceSectionMode("label", Mode.Sum) , allowing measurement of total time spent on multiple trace sections with the same label. For instance, TraceSectionMetric("inflate", Mode.Sum) will report a metric inflateMs for the total time in a macrobenchmark spent on inflation. Also removed API 29 requirement, as TraceSectionMetric works together with androidx.tracing.Trace back to lower API levels, with the use of forceEnableAppTracing within the target app. ( Id7b68 , b/231455742 )

Исправлены ошибки

  • Improved safety of all internal shell commands by validating all output/errors. ( I5984d , b/255402908 , b/253094958 )
  • Specify device in baseline profile adb pull command, so the pull command can be simply copied if multiple devices are connected (up to one emulator) ( I6ac6c , b/223359380 )
  • Add error if macrobenchmark test apk isn't set up as self-instrumenting. This error prevents macrobenchmarking from within the target app's process. In process, macrobench wouldn't be able to compile/kill/cold start the app, or control its own permissions ( I4279b )
  • Fixed an issue in measureRepeated() where StartupMode.COLD wouldn't kill the target process after setupBlock . Now setupBlock interacting with the app will not leave the app process running, and an invalid cold start measurement. ( I8ebb7 )

Version 1.2.0-alpha06

24 октября 2022 г.

androidx.benchmark:benchmark-*:1.2.0-alpha06 is released. Version 1.2.0-alpha06 contains these commits.

Изменения в API

  • BaselineProfileRule no longer requires root on Android 13 (API 33), and is no longer experimental. ( Ie0a7d , b/250083467 , b/253094958 )
    • This change also fixes how profiles from an app are flushed to disk on unrooted devices, but requires updating the target app's profileinstaller dependency.
    • To use BaselineProfileRule or CompilationMode.Partial(warmupIterations) on an unrooted device, you must also update your target app to use androidx.profileinstaller.profileinstaller:1.3.0-alpha01 . This enables flushing the profile to disk correctly, so that it can be compiled/extracted.

Исправлены ошибки

Version 1.2.0-alpha05

5 октября 2022 г.

androidx.benchmark:benchmark-*:1.2.0-alpha05 is released. Version 1.2.0-alpha05 contains these commits.

Исправлены ошибки

  • Fix frame breakdown in Studio system trace viewer for benchmark captured traces ( I3f3ae , b/239677443 )
  • Correct FrameTimingMetric to list FrameOverrun as requiring API 31 instead of 29 ( I716dd , b/220702554 )
  • Set iteration in BaselineProfileRule , and throw clearly if target package not installed (was already done for MacrobenchmarkRule). ( Ic09a3 , b/227991471 )

Version 1.2.0-alpha04

21 сентября 2022 г.

androidx.benchmark:benchmark-*:1.2.0-alpha04 is released. Version 1.2.0-alpha04 contains these commits.

Новые функции

  • Add support for dryRunMode.enable instrumentation argument to macrobenchmark (already available in micro) for faster local development, and validating app automation (eg in presubmit). This overrides iterations to 1, skips compilation, suppresses all configuration errors , and disables measurement .json file output. ( Ib51b4 , b/175149857 )

    On Gradle command line:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.dryRunMode.enable=true
    

    In build.gradle:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.dryRunMode.enable', 'true'
        }
    }
    

Исправлены ошибки

  • Fixed StartupTimingMetric to no longer require measured Activities to be launched through MacrobenchmarkScope.startActivityAndWait() . This means the metric can pick up launches from eg notifications, Context.startActivity() , in-app Activity based navigation, or shell commands. ( Ia2de6 , b/245414235 )
  • Fix bug where startActivityAndWait would timeout trying to wait for launch completion on emulators by reducing strictness of frame detection. ( Ibe2c6 , b/244594339 , b/228946895 )

Version 1.2.0-alpha03

7 сентября 2022 г.

androidx.benchmark:benchmark-*:1.2.0-alpha03 is released. Version 1.2.0-alpha03 contains these commits.

Новые функции

  • Added experimental APIs for using BenchmarkState independently, separate from BenchmarkRule / JUnit4 . ( Id478f , b/228489614 )

Исправлены ошибки

Version 1.2.0-alpha02

24 августа 2022 г.

androidx.benchmark:benchmark-*:1.2.0-alpha02 is released. Version 1.2.0-alpha02 contains these commits.

Изменения в API

  • Default to am force stop for MacrobenchmarkScope.killProcess() , even when rooted, except during Baseline Profile generation. This can be overridden with an optional boolean argument. ( 02cce9 , b/241214097 )

Исправлены ошибки

Version 1.2.0-alpha01

27 июля 2022 г.

androidx.benchmark:benchmark-*:1.2.0-alpha01 is released. Version 1.2.0-alpha01 contains these commits.

Новые функции

  • New tracing-perfetto-common component allowing tooling to enable Perfetto SDK tracing in an app that exposes it ( I2cc7f )
  • Added androidx.benchmark.enabledRules instrumentation argument to enable filtering macrobenchmark runs to just benchmarks, or just baseline profile generation. Pass in 'Macrobenchmark', or 'BaselineProfile' to just run one type of test, eg when just generating BaselineProfiles on an emulator. Comma-separated list also Supported. ( I756b7 , b/230371561 )

    Eg in Your macrobenchmark's build.gradle:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.enabledRules', 'BaselineProfile'
        }
    }
    

    Or from the Gradle command line:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
    

Изменения в API

  • Added new PowerMetric for measuring energy and power tasks in benchmarks. ( I9f39b , b/220183779 )
  • Added a new compilation mode CompilationMode.Ignore to skip profile reset and compilation. ( Ibbcf8 , b/230453509 )
  • Added a new parameter to BaselineProfileRule#collectBaselineProfile to filter output file by package names ( If7338 , b/220146561 )
  • Enables developer to discharge device to measure power drain. ( I6a6cb )
  • Added the ability to clear shader cache in MacrobenchmarkScope . ( I32122 )
  • Enables developer to configure display of metric type and detail desired subsystem categories. ( I810c9 )
  • Previously an UnsupportedOperationException was thrown in the benchmark if run on an unsupported device. Now UOE only occurs if the metric is used on the unsupported device (ie: PowerMetric.configure ). ( I5cf20 , b/227229375 )
  • Added TotalPowerMetric and TotalEnergyMetric for measuring total power and energy in each system category in macrobenchmarks. ( I3b26b , b/224557371 )

Исправлены ошибки

  • Fixed an issue where compiled methods were not correctly being reset between each macrobenchmark on unrooted builds. This unfortunately requires reinstalling the apk each iteration, which will clear application data for each macrobenchmark. ( I31c74 , b/230665435 )
  • Fix trace recording crash on API 21/22 ( If7fd6 , b/227509388 , b/227510293 , b/227512788 )
  • Overhaul activity launch completion detection to fix 'Unable to read any metrics' exception in startup macrobenchmarks. ( Ia517c )

Версия 1.1.1

Версия 1.1.1

9 ноября 2022 г.

androidx.benchmark:benchmark-*:1.1.1 is released. Version 1.1.1 contains these commits.

Исправлены ошибки

  • Fixes android.system.ErrnoException: open failed: EACCES which would occur on some Android11 (API 30)+ devices. This is a cherry-pick of a fix from 1.2.0-alpha01 . ( aosp/2072249 )

Версия 1.1.0

Версия 1.1.0

15 июня 2022 г.

androidx.benchmark:benchmark-*:1.1.0 is released. Version 1.1.0 contains these commits.

  • This version is identical to androidx.benchmark:benchmark-*:1.1.0-rc03 .

Important changes since 1.0.0

Version 1.1.0-rc03

1 июня 2022 г.

androidx.benchmark:benchmark-*:1.1.0-rc03 is released. Version 1.1.0-rc03 contains these commits.

Исправлены ошибки

Version 1.1.0-rc02

11 мая 2022 г.

androidx.benchmark:benchmark-*:1.1.0-rc02 is released. Version 1.1.0-rc02 contains these commits.

  • Note that this release includes a behavior change, as apps are now fully reinstalled in between each benchmark to ensure accurate measurements.

Bug Fixes/Behavior Changes

  • Fixed an issue where app compilation was not correctly reset between macrobenchmarks, and not reset at all on unrooted builds. This fixes many cases where running multiple tests would result in CompilationMode having little to no effect on measurements. To workaround this problem, the target app is now fully reinstalling each test method, which will clear application data between each macrobenchmark. ( I31c74 , b/230665435 )

  • As this prevents apps from setting up state before tests, it is now possible to skip compilation / reinstallation to enable working around this. You can for example fully compile the target with a shell command cmd package compile -f -m speed <package> , and then bypass macrobenchmark's compilation step.

    Eg in Your macrobenchmark's build.gradle:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.compilation.enabled, 'false'
        }
    }
    

    Or from the Gradle command line:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.compilation.enabled=false
    
  • Made it possible to share a module between macrobenchmarks and baseline profile generating tests by adding androidx.benchmark.enabledRules instrumentation argument. Pass in 'Macrobenchmark', or 'BaselineProfile' to just run one type of test, eg when generating BaselineProfiles on an emulator. ( I756b7 , b/230371561 )

    Eg in Your macrobenchmark's build.gradle:

    android {
        defaultConfig {
            testInstrumentationRunnerArgument 'androidx.benchmark.enabledRules', 'BaselineProfile'
        }
    }
    

    Or from the Gradle command line:

    ./gradlew macrobenchmark:cC -P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
    

Version 1.1.0-rc01

20 апреля 2022 г.

androidx.benchmark:benchmark-*:1.1.0-rc01 is released. Version 1.1.0-rc01 contains these commits.

Исправлены ошибки

  • Baseline profile output links in Android Studio now use a unique file name. This way the output always reflects the latest results of using a BaselineProfileRule . ( aosp/2057008 , b/228203086 )

Version 1.1.0-beta06

April 6, 2022

androidx.benchmark:benchmark-*:1.1.0-beta06 is released. Version 1.1.0-beta06 contains these commits.

Исправлены ошибки

  • Fix trace recording crash on API 21/22 ( If7fd6 , b/227509388 )
  • Overhaul activity launch completion detection to fix 'Unable to read any metrics' exception in startup macrobenchmarks. ( Ia517c )
  • Fix startup metrics for Macrobenchmarks when CompilationMode.None() is used. Before this change, CompilationMode.Partial() would appear to be slower than Compilation.None() . ( 611ac9 ).

Version 1.1.0-beta05

23 марта 2022 г.

androidx.benchmark:benchmark-*:1.1.0-beta05 is released. Version 1.1.0-beta05 contains these commits.

Исправлены ошибки

Version 1.1.0-beta04

23 февраля 2022 г.

androidx.benchmark:benchmark-*:1.1.0-beta04 is released. Version 1.1.0-beta04 contains these commits.

Исправлены ошибки

  • Fix missing metrics on Android 10, and NoSuchElementException caused by process names not being captured correctly in traces. ( Ib4c17 , b/218668335 )

  • Use PowerManager for thermal throttling detection on Q (API 29) and higher. This significantly reduces frequency of false positives in thermal throttling detection (benchmark retry after 90 second cooldown), and speeds up benchmarks significantly on user builds. It also provides throttle detection even when clocks are locked (if they're locked too high for the device's physical environment). ( I9c027 , b/217497678 , b/131755853 )

  • Filter simpleperf sampled profiling to measureRepeated thread only to simplify inspection ( Ic3e12 , b/217501939 )

  • Support metrics from named UI subprocesses in multi-process apps ( Ice6c0 , b/215988434 )

  • Filter Baseline Profile rules to target Android 9 (SDK 28). aosp/1980331 b/216508418

  • Skip Profile Installation when using Compilation.None() . Additionally, report warnings when the app is using an older version of androidx.profileinstaller and Android Gradle Plugin. aosp/1977029

Version 1.1.0-beta03

9 февраля 2022 г.

androidx.benchmark:benchmark-*:1.1.0-beta03 is released. Version 1.1.0-beta03 contains these commits.

Изменения в API

  • Added AudioUnderrunMetric into macrobenchmark library under experimental flag to allow detection of audio underruns ( Ib5972 )
  • BaselineProfileRule no longer accepts a setup block as this functioned the same as the profileBlock . ( Ic7dfe , b/215536447 )

    For eg

    @Test
    fun collectBaselineProfile() {
        baselineRule.collectBaselineProfile(
            packageName = PACKAGE_NAME,
            setupBlock = {
                startActivityAndWait()
            },
            profileBlock = {
                // ...
            }
        )
    }
    
    @Test
    fun collectBaselineProfile() {
        baselineRule.collectBaselineProfile(
            packageName = PACKAGE_NAME,
            profileBlock = {
                startActivityAndWait()
                // ...
            }
        )
    }
    

Исправлены ошибки

  • Fixed issue where microbench profiler traces would fail to be updated in subsequent runs when linked in Studio output ( I5ae4d , b/214917025 )
  • Prevent compilation shell commands on API 23 ( Ice380 )
  • Renamed FrameCpuTime -> FrameDurationCpu , FrameUiTime -> FrameDurationUi to clarify these are durations, not timestamps, and to match prefixes. ( I0eba3 , b/216337830 )

Version 1.1.0-beta02

26 января 2022 г.

androidx.benchmark:benchmark-*:1.1.0-beta02 is released. Version 1.1.0-beta02 contains these commits.

Исправлены ошибки

  • Microbenchmark Stack Sampling / Method Tracing Profile results are now linked in Studio output, similar to other profiling outputs, and do not suppress the allocation metric. ( Idcb65 , b/214440748 , b/214253245 )
  • BaselineProfileRule now prints the adb pull command in logcat and Studio output for pulling generated BaselineProfile text file. ( f08811 )

Version 1.1.0-beta01

12 января 2022 г.

androidx.benchmark:benchmark-*:1.1.0-beta01 is released. Version 1.1.0-beta01 contains these commits.

Исправлены ошибки

  • Fixes profiler argument enable being ignored. ( I37373 , b/210619998 )
  • Removed deprecated CompliationModes ( I98186 , b/213467659 )
  • Switched baseline profile arg of CompilationMode.Partial to enum for clarity. ( Id67ea )

Version 1.1.0-alpha13

15 декабря 2021 г.

androidx.benchmark:benchmark-*:1.1.0-alpha13 is released. Version 1.1.0-alpha13 contains these commits.

Изменения в API

  • Add low-overhead System Tracing to microbench output on Android Q (API 29+). Note that this does not currently capture custom tracing (via android.os.Trace or androidx.tracing Jetpack APIs) to avoid affecting results. This tracing should be useful in diagnosing instability, especially from sources outside the benchmark. ( I298be , b/205636583 , b/145598917 )
  • Clarify CompilationModes into three classes - Full, None, Partial. Previously they were inconsistently named after compilation arguments (which we now treat as implementation details) and features. This makes the tradeoffs, potential combinations, and behavior across platform versions more clear. ( I3d7bf , b/207132597 )
  • Setup and measure are now always in pairs, in order. You can now query the package name and iteration (though the iteration may be null in certain warmup scenarios). ( Id3b68 , b/208357448 , b/208369635 )

Исправлены ошибки

  • Fixed CompilationMode.Speed incorrectly treated as None ( I01137 )

Version 1.1.0-alpha12

17 ноября 2021 г.

androidx.benchmark:benchmark-*:1.1.0-alpha12 is released. Version 1.1.0-alpha12 contains these commits.

Новые функции

  • Add experimental TraceSectionMetric for custom trace-based timing measurements. ( I99db1 , b/204572664 )

Исправлены ошибки

  • Wake device each iteration, to ensure UI can be tested - requires lockscreen is disabled. ( Ibfa28 , b/180963442 )
  • Fixes multiple crashes in StackSampling profiling mode on emulators and non-rooted devices ( Icdbda , b/202719335 )
  • Removed 0.5 second sleep at the end of each iteration - if you see missing metrics with this change, please file a bug. ( Iff6aa )
  • Reduce chances of dropped data, and lower memory overhead from tracing ( Id2544 , b/199324831 , b/204448861 )
  • Reduce trace size by ~40% by switching to compact sched storage format. ( Id5fb6 , b/199324831 )
  • Updated implementations of startup metrics to always end at end of renderthread. This will be more contistent across platform versions, and more closely map to in-app measurements. ( Ic6b55 )

Version 1.1.0-alpha11

3 ноября 2021 г.

androidx.benchmark:benchmark-*:1.1.0-alpha11 is released. Version 1.1.0-alpha11 contains these commits.

Изменения в API

  • Macrobenchmark now has a minSdkVersion of 23 . ( If2655 )
  • Adds a new experimental BaselineProfileRule which is capable of generating baseline profiles for app's critical user journey. Detailed documentation to follow. ( Ibbefa , b/203692160 )
  • Removes measureRepeated interface variant, which was added for java callers, as it caused ambiguity in completing/resolving the method. Java callers will again need to return Unit.Instance from measureRepeated. If this is an inconvenience, please file a bug, we can revisit this in a future version. ( Ifb23e , b/204331495 )

Version 1.1.0-alpha10

27 октября 2021 г.

androidx.benchmark:benchmark-*:1.1.0-alpha10 is released. Version 1.1.0-alpha10 contains these commits.

Изменения в API

  • Backport StartupTimingMetric to work back to API 23. This new implementation also better handles reportFullyDrawn() to wait until corresponding content has been rendered. ( If3ac9 , b/183129298 )
  • Added JvmOverloads to multiple MacrobenchmarkScope methods for Java callers. ( I644fe , b/184546459 )
  • Provide alternative MacrobenchmarkRule.measureRepeated function that uses a Consumer<MacrobenchmarkScope> for idiomatic usage in Java language. ( If74ab , b/184546459 )

Исправлены ошибки

  • Fix for traces not starting early enough, and missing metric data. This is expected to fix "Unable to read any metrics during benchmark" exceptions that were caused by the library itself. ( I6dfcb , b/193827052 , b/200302931 )
  • FrameNegativeSlack has been renamed to FrameOverrun to clarify its meaning - how much the frame went over its time budget. ( I6c2aa , b/203008701 )

Version 1.1.0-alpha09

13 октября 2021 г.

androidx.benchmark:benchmark-*:1.1.0-alpha09 is released. Version 1.1.0-alpha09 contains these commits.

Исправлены ошибки

Version 1.1.0-alpha08

29 сентября 2021 г.

androidx.benchmark:benchmark-*:1.1.0-alpha08 is released. Version 1.1.0-alpha08 contains these commits.

Изменения в API

  • Enable scrolling macrobenchmarks to run back to API 23 ( If39c2 , b/183129298 )
  • Add new type of sampled metric to UI and JSON output, focused on percentiles of multiple samples per iteration. ( I56247 , b/199940612 )
  • Switch to floating point metrics throughout the benchmark libraries (truncated in the Studio UI). ( I69249 , b/197008210 )

Version 1.1.0-alpha07

1 сентября 2021 г.

androidx.benchmark:benchmark-*:1.1.0-alpha07 is released. Version 1.1.0-alpha07 contains these commits.

Изменения в API

  • Raised min API to 21 to reflect the intended lowest API level to be supported in the future. Current min API supported continues to be conveyed via RequiredApi(), and is currently 29 ( I440d6 , b/183129298 )

Исправлены ошибки

  • Fixes ProfileInstaller to make it easier for apps using baseline profiles to run MacroBenchmarks using CompilationMode.BaselineProfile . ( I42657 , b/196074999 ) NOTE: requires also updating to androidx.profileinstaller:profileinstaller:1.1.0-alpha04 or greater.
  • StartupMode.COLD + CompilationMode.None benchmarks are now more stable. ( I770cd , b/196074999 )

Version 1.1.0-alpha06

18 августа 2021 г.

androidx.benchmark:benchmark-*:1.1.0-alpha06 is released. Version 1.1.0-alpha06 contains these commits.

Изменения в API

  • Added androidx.benchmark.iterations instrumentation argument to allow manual overriding of iteration count when testing/profiling locally. ( 6188be , b/194137879 )

Исправлены ошибки

  • Switched to Simpleperf as default sampling profiler on API 29+. ( Ic4b34 , b/158303822 )

Известные проблемы

  • CompilationMode.BaselineProfile is a work in progress. Avoid using it to determine how good a profile is for now.

Version 1.1.0-alpha05

4 августа 2021 г.

androidx.benchmark:benchmark-*:1.1.0-alpha05 is released. Version 1.1.0-alpha05 contains these commits.

1.1.0-alpha04 was cancelled before release due to a sporatic crash. b/193827052

Изменения в API

  • Switched startActivityAndWait to invoke launch via am start , which reduces the time of each measurement iteration by approximately 5 seconds, at the cost of no longer supporting intent parcelables. ( I5a6f5 , b/192009149

Исправлены ошибки

  • Reduce aggressiveness of thermal throttle detection, and recompute baseline if throttles are detected frequently. ( I7327b )
  • Fixes FrameTimingMetric to work on Android S beta ( Ib60cc , b/193260119 )
  • Use an EmptyActivity to bring the target app out of a force-stopped state to better support CompilationMode.BaselineProfile . ( Id7cac , b/192084204 )
  • Changed trace file extension to .perfetto-trace to match platform standard. ( I4c236 , b/174663039 )
  • StartupTimingMetric now outputs the "fullyDrawnMs" metric to measure time until your application has completed rendering. To define this metric for your app, call Activity.reportFullyDrawn when your initial content is ready, such as when your initial list items are loaded from DB or network. (reportFullyDrawn method available without build version checks on ComponentActivity). Note that your test must run long enough to capture the metric (startActivityAndWait doesn't wait for reportFullyDrawn). ( If1141 , b/179176560 )
  • Reduce cost of appending Ui metadata to traces by 50+ ms ( Ic8390 , b/193923003 )
  • Drastically increased polling frequency when stopping tracing, which can reduce eg startup benchmark runtime by 30+% ( Idfbc1 , b/193723768 )

Version 1.1.0-alpha03

16 июня 2021 г.

androidx.benchmark:benchmark-*:1.1.0-alpha03 is released. Version 1.1.0-alpha03 contains these commits.

Новые функции

Исправлены ошибки

  • The sample Gradle code for suppressing benchmark errors has been updated to use a non-deprecated API with a syntax that also supports .gradle.kts users.

    Например,

    testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "EMULATOR,LOW-BATTERY"
    

Version 1.1.0-alpha02

May 18, 2021

Benchmark version 1.1.0-alpha02 brings a big component to benchmarking - Macrobenchmark. In addition to benchmark allowing you to measure CPU loops, macrobenchmark allows you to measure whole-app interactions like startup and scrolling, and capture traces. For more information see the library documentation .

androidx.benchmark:benchmark-*:1.1.0-alpha02 is released. Version 1.1.0-alpha02 contains these commits.

Новые функции

Macrobenchmark artifacts added ( androidx.benchmark:benchmark-macro-junit4 and androidx.benchmark:benchmark-macro )

  • Capture startup, scrolling/animation performance metrics from your app, locally or in CI
  • Capture and inspect traces from within Android Studio

Исправлены ошибки

  • Workaround shell permissions issue with output directory on Android 12 (Note - may require updating Android Gradle Plugin to 7.0.0 canary and Android Studio to Arctic Fox (2020.3.1), to continue capturing output files on affected devices). ( Icb039 )
  • Support configuration caching in BenchmarkPlugin ( 6be1c1 , b/159804788 )
  • Simplified file output - on by default, in a directory that doesn't require requestLegacyExternalStorage=true ( 8b5a4d , b/172376362 )
  • Fixes library printing logcat warnings about not finding JIT thread on platform versions where it is not present. ( I9cc63 , b/161847393 )
  • Fix for reading device max frequency. ( I55c7a )

Version 1.1.0-alpha01

10 июня 2020 г.

androidx.benchmark:benchmark-common:1.1.0-alpha01 , androidx.benchmark:benchmark-gradle-plugin:1.1.0-alpha01 , and androidx.benchmark:benchmark-junit4:1.1.0-alpha01 are released. Version 1.1.0-alpha01 contains these commits.

New Features of 1.1

  • Allocation Metric - Benchmarks now run an additional phase after warmup and timing, capturing allocation counts. Allocations can cause performance problems on older versions of the platform (140ns in O became 8ns in M - measured on Nexus5X, with locked clocks). This metric is displayed in Android Studio console output, as well as in the
  • Profiling support - You can now capture profiling data for a benchmark run, to inspect why your code may be running slowly. Benchmark supports capturing either method tracing, or method sampling from ART. These files can be inspected with the Profiler inside Android Studio using File > Open .
  • The Benchmark Gradle plugin now provides defaults for simpler setup:
    • testBuildType is set to release by default, to avoid using dependencies with code coverage built-in. The release buildType is also configured as the default buildType, which allows Android Studio to automatically select the correct build variant when opening a project for the first time. ( b/138808399 )
    • signingConfig.debug is used as the default signing config ( b/153583269 )

** Bug Fixes **

  • Significantly reduced the warmup transition overhead, where the first measurement for each benchmark was artificially higher than others. This issue was more pronounced in very small benchmarks (1 microsecond or less). ( b/142058671 )
  • Fixed InstrumentationResultParser error printed for each benchmark when running from command line. ( I64988 , b/154248456 )

Известные проблемы

  • Command line, gradle invocations of Benchmark do not print out results directly. You can work around this by either running through Studio, or parsing the JSON output file for results.
  • Benchmark reporting fails to pull the report from devices that have an app installed with an applicationId ending with either “android” or “download” (case insensitive). Users hitting this issue should upgrade the Android Gradle Plugin to 4.2-alpha01 or later.

Версия 1.0.0

Benchmark Version 1.0.0

20 ноября 2019 г.

androidx.benchmark:benchmark-common:1.0.0 , androidx.benchmark:benchmark-gradle-plugin:1.0.0 , and androidx.benchmark:benchmark-junit4:1.0.0 are released with no changes from 1.0.0-rc01. Version 1.0.0 contains these commits .

Major features of 1.0.0

The Benchmark library allows you to write performance benchmarks of app code and get results quickly.

It prevents build and runtime configuration issues and stabilizes device performance to ensure that measurements are accurate and consistent. Run the benchmarks directly in Android Studio , or in Continuous Integration to observe code performance over time, and to prevent regressions.

Major features include:

  • Clock stabilization
  • Automatic thread prioritization
  • Support for UI performance testing, such as in the RecyclerView Sample
  • JIT-aware warmup and looping
  • JSON benchmark output for post-processing

Version 1.0.0-rc01

23 октября 2019 г.

androidx.benchmark:benchmark-common:1.0.0-rc01 , androidx.benchmark:benchmark-gradle-plugin:1.0.0-rc01 , and androidx.benchmark:benchmark-junit4:1.0.0-rc01 are released. Version 1.0.0-rc01 contains these commits .

Новые функции

  • Added systrace tracing to benchmarks

Исправлены ошибки

  • Fixed metric instability issue where JIT wouldn't finish before warm up due to deprioritization ( b/140773023 )
  • Unified JSON output directory across Android Gradle Plugin 3.5 and 3.6

Version 1.0.0-beta01

9 октября 2019 г.

androidx.benchmark:benchmark-common:1.0.0-beta01 , androidx.benchmark:benchmark-gradle-plugin:1.0.0-beta01 , and androidx.benchmark:benchmark-junit4:1.0.0-beta01 are released. Version 1.0.0-beta01 contains these commits .

Новые функции

  • Run garbage collection before each warmup to reduce memory pressure from one benchmark to leak to the next ( b/140895105 )

Исправлены ошибки

  • Added androidx.annotation:android-experimental-lint dependency, so that Java code will correctly produce lint errors when experimental API is not used, similar to what is provided by the Kotlin experimental annotation for Kotlin callers.
  • Now correctly detects usage of additionalTestOutputDir instrumentation argument for output in Android Gradle Plugin 3.6, to know when AGP will handle data copy.
  • Fix undetected clock frequency in JSON to correctly print -1 ( b/141945670 ).

Version 1.0.0-alpha06

18 сентября 2019 г.

androidx.benchmark:benchmark-common:1.0.0-alpha06 , androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha06 , and androidx.benchmark:benchmark-junit4:1.0.0-alpha06 are released. Version 1.0.0-alpha06 contains these commits .

Новые функции

  • Added a check for incorrectly using the old package for the test runner, which now provides a more-helpful error message

API changes

  • The experimental annotation ExperimentalAnnotationReport is now correctly public. Usage of the experimental BenchmarkState#report API now requires this annotation

Version 1.0.0-alpha05

5 сентября 2019 г.

androidx.benchmark:benchmark-common:1.0.0-alpha05 , androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha05 , and androidx.benchmark:benchmark-junit4:1.0.0-alpha05 are released. The commits included in this version can be found here .

API changes

  • BenchmarkState.reportData API is now marked experimental

Исправлены ошибки

  • Fix for the clock-locking script, which would fail on devices that were either missing the cut or expr shell utilities.
  • Fixed an issue with ./gradlew lockClocks task that would hang on devices that were rooted with an older version of the su utility, which did not support the -c flag.

Version 1.0.0-alpha04

7 августа 2019 г.

androidx.benchmark:benchmark-common:1.0.0-alpha04 , androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha04 , and androidx.benchmark:benchmark-junit4:1.0.0-alpha04 are released. The commits included in this version can be found here .

New documentation has also been added for how to use the Benchmark library without Gradle, both for usage with different build systems (such as Bazel or Buck), and when running in CI. For more information, see Build benchmarks without Gradle and Run benchmarks in Continuous Integration .

Новые функции

  • Gradle plugin
    • Now automatically disables test coverage, and sets the AndroidBenchmarkRunner by default ( b/138374050 )
    • Added support for new AGP-based data copy, when running benchmarks and when using AGP 3.6+
  • JSON format additions
    • Output total benchmark test run time ( b/133147694 )
    • @Parameterized benchmarks that use a name string (for example @Parameters(name = "size={0},depth={1}") ) now output parameter names and values per benchmark in the JSON output ( b/132578772 )
  • Dry Run mode ( b/138785848 )
    • Added a "dry run" mode for running each benchmark loop only once, to check for errors/crashes without capturing measurements. This can be useful eg for, for example, quickly running benchmarks in presubmit to check that they're not broken.

API changes

  • Module structure has changed, splitting the library ( b/138451391 )
    • benchmark:benchmark-junit4 contains classes with JUnit dependency: AndroidBenchmarkRunner , and BenchmarkRule , both of which have moved into the androidx.benchmark.junit4 package
    • benchmark:benchmark-common contains the rest of the logic, including the BenchmarkState API
    • This split will allow the library to support benchmarking without JUnit4 APIs in the future
  • Configuration warnings are now treated as errors, and will crash the test ( b/137653596 )
    • This is done to further encourage accurate measurements, especially in CI
    • These errors can be reduced back to warnings with an instrumentation argument. For example: -e androidx.benchmark.suppressErrors "DEBUGGABLE,LOW_BATTERY"

Исправлены ошибки

  • Errors when writing to external storage on Q devices provide more-descriptive messages, with suggestions of how to resolve the issue
  • Screens are automatically turned on during benchmark runs, instead of failing when the screen is off

External contributions

  • Thanks to Sergey Zakharov for contributing JSON output improvements and the fix for screen off issues!

Версия 1.0.0-alpha03

2 июля 2019 г.

androidx.benchmark:benchmark:1.0.0-alpha03 and androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha03 are released. The commits included in this version can be found here .

Новые функции

  • Expose sleep duration due to thermal throttling per benchmark in the full JSON report

Исправлены ошибки

  • The Gradle plugin should no longer be required to be applied after Android plugins and the Android block
  • Adds support for benchmark reports on Android 10 devices using scoped storage

Версия 1.0.0-alpha02

6 июня 2019 г.

androidx.benchmark:1.0.0-alpha02 and androidx.benchmark:benchmark-gradle-plugin:1.0.0-alpha02 are released. The commits included in this version can be found here .

Note that we are treating the JSON schema as an API. We plan to follow the same stability constraints as other APIs: stable (with very rare exceptions) once in beta, and fixed in final release, with only additions in minor releases and changes/removals in major releases.

API changes

  • Overhauled JSON schema. Further changes to the JSON schema are likely to be limited to additions:

    • Reorganized the result object structure to support additional metric groups in the future ( b/132713021 )
    • Added test run context information, such as device and build info and whether clocks are locked, to the top-level object ( b/132711920 )
    • Time metric names now have 'ns' in their name ( b/132714527 )
    • Additional stats added per reported metric (maximum, median, minimum), and removed simplified 'nanos' summary stat ( b/132713851 )
  • Removed XML output ( b/132714414 )

  • Thermal throttle detection removed from BenchmarkState.reportData API ( b/132887006 )

Исправлены ошибки

  • Fixed ./gradlew lockClocks not sticking on some recent OS devices ( b/133424037 )
  • Throttling detection disabled for emulator ( b/132880807 )

Версия 1.0.0-alpha01

7 мая 2019 г.

androidx.benchmark:benchmark:1.0.0-alpha01 is released. The commits included in this version are available here .