Мы рекомендуем использовать Jetpack Macrobenchmark для тестирования производительности приложения с включёнными базовыми профилями, а затем сравнить эти результаты с результатами теста без базовых профилей. Этот подход позволяет измерить время запуска приложения (как до первоначального, так и до полного отображения) или производительность рендеринга во время выполнения, чтобы определить, могут ли создаваемые кадры вызывать подтормаживания.
Макробенчмарки позволяют контролировать компиляцию перед измерением с помощью API CompilationMode
. Используйте различные значения CompilationMode
для сравнения производительности при разных состояниях компиляции. Следующий фрагмент кода показывает, как использовать параметр CompilationMode
для оценки преимуществ базовых профилей:
@RunWith(AndroidJUnit4ClassRunner::class) class ColdStartupBenchmark { @get:Rule val benchmarkRule = MacrobenchmarkRule() // No ahead-of-time (AOT) compilation at all. Represents performance of a // fresh install on a user's device if you don't enable Baseline Profiles— // generally the worst case performance. @Test fun startupNoCompilation() = startup(CompilationMode.None()) // Partial pre-compilation with Baseline Profiles. Represents performance of // a fresh install on a user's device. @Test fun startupPartialWithBaselineProfiles() = startup(CompilationMode.Partial(baselineProfileMode = BaselineProfileMode.Require)) // Partial pre-compilation with some just-in-time (JIT) compilation. // Represents performance after some app usage. @Test fun startupPartialCompilation() = startup( CompilationMode.Partial( baselineProfileMode = BaselineProfileMode.Disable, warmupIteration = 3 ) ) // Full pre-compilation. Generally not representative of real user // experience, but can yield more stable performance metrics by removing // noise from JIT compilation within benchmark runs. @Test fun startupFullCompilation() = startup(CompilationMode.Full()) private fun startup(compilationMode: CompilationMode) = benchmarkRule.measureRepeated( packageName = "com.example.macrobenchmark.target", metrics = listOf(StartupTimingMetric()), compilationMode = compilationMode, iterations = 10, startupMode = StartupMode.COLD, setupBlock = { pressHome() } ) { // Waits for the first rendered frame, which represents time to initial display. startActivityAndWait() // Waits for content to be visible, which represents time to fully drawn. device.wait(Until.hasObject(By.res("my-content")), 5_000) } }
На следующем снимке экрана вы можете увидеть результаты непосредственно в Android Studio для примера приложения Now in Android, запущенного на Google Pixel 7. Результаты показывают, что запуск приложения происходит быстрее всего при использовании базовых профилей ( 229,0 мс ) по сравнению с отсутствием компиляции ( 324,8 мс ).

ColdStartupBenchmark
, показывающие время до начального отображения без компиляции (324 мс), полной компиляции (315 мс), частичной компиляции (312 мс) и базовых профилей (229 мс). Хотя в предыдущем примере показаны результаты запуска приложения, полученные с помощью StartupTimingMetric
, есть и другие важные метрики, заслуживающие внимания, например, FrameTimingMetric
. Подробнее обо всех типах метрик см. в разделе Получение метрик Macrobenchmark .
Время до полного отображения
В предыдущем примере измеряется время до первоначального отображения (TTID), то есть время, необходимое приложению для создания первого кадра. Однако это не обязательно отражает время, необходимое пользователю для начала взаимодействия с приложением. Метрика времени до полного отображения (TTFD) более полезна для измерения и оптимизации путей кода, необходимых для достижения полностью работоспособного состояния приложения.
Мы рекомендуем оптимизировать как TTID, так и TTFD, поскольку оба значения важны. Низкое значение TTID помогает пользователю понять, что приложение действительно запускается. Важно, чтобы значение TTFD было коротким, чтобы пользователь мог быстро взаимодействовать с приложением.
Стратегии определения момента полной отрисовки пользовательского интерфейса приложения см. в разделе Повышение точности определения времени запуска .
{% дословно %}Рекомендовано для вас
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- [Написать макробенчмарк][11]
- [Сбор показателей Macrobenchmark][12]
- [Анализ и оптимизация запуска приложения {:#app-startup-analysis-optimization}][13]