如何衡量Android应用启动时间?
#android #性能 #gradle #benchmark

您是否尝试测试您的应用程序加载多少时间?如果不是,本文可以成为第一步的指南。可能您已经检查了Google Play或Firebase性能指标中的Android Vitals指标“加载”。但是,我认为您想在发布之前知道结果。

目标是检查发行版之间的启动时间差异。最有用的可能是启动时间变化的百分比,而不是一个值,因为用户具有不同的设备,并且在每个设备上,该值都不同,但是百分比更改可能是在大多数情况下。

想象下一个情况,如果您在项目中添加新库,如何检查该新库不会使您的应用程序较慢?我希望在阅读本文后,您将拥有一个乐器。

从我的角度来看,它是每个发行版的重要指标,但是以正确的方式进行测量并不容易。

让我们尝试创建在测量此指标期间将遵循的规则。

  • 网络不应产生影响
  • 内容不应该有影响
  • 我们需要从“启动”测量,直到用户可以看到第一帧-TTID。

TTID-度量标准测量了应用程序制作第一帧所需的时间,包括过程初始化(如果是冷启动),活动创造(如果冷/温暖)和显示第一帧。

不是很多规则。我们可以避免在应用程序中调用任何网络请求或长时间操作。 (也许您知道这不仅是关于测量的,而且还是Android应用程序开发的强制性规则)

但是,至少有几件事可能会对测量产生影响:

  • 设备CPU电流频率
  • 设备内存速度
  • CPU loading

让我们从可以用于测量的变体开始,然后找出如何改善结果。

ActivityManager和LogCat

首先,我们有日志猫,我们可以从ActivityManager中找到有关开始活动的时间:

03-19 13:05:20.146   523   550 I ActivityTaskManager: Displayed com.example/.MainActivity: +343ms
03-19 13:05:23.920   523   550 I ActivityTaskManager: Displayed com.example/.SplashActivity: +1s845ms
03-19 13:05:25.728   523   550 I ActivityTaskManager: Displayed com.example/.ui.SignupActivity: +381ms

每个活动都有日志,我们需要过滤仅与第一个应用活动相关的日志。然后,我们可以启动几次应用程序并计算平均时间。

对于使用此方法,我们不需要任何特殊的东西,只执行ADB命令并检查LogCat日志:

清除logcat日志:

adb logcat -c

启动应用程序:

adb shell am start-activity -n com.example/.SplashActivity

然后,您将在logcat中看到日志,如上所示。有关此变体的更多详细信息,您可以在documentation

中找到

您可以在Github

上检查我的完整bash脚本和示例

Android基准插件

基准插件使我们能够以更方便的方式测量应用程序启动时间,在启动后,我们可以在命令行中看到一些类型的结果:

Starting: Intent { cmp=com.example.MainActivity }
Status: ok
LaunchState: COLD
Activity: com.example.MainActivity
TotalTime: 2303
WaitTime: 2305
Complete

但是在这种情况下,您需要在项目中添加一个插件。
app/build.gradle.kts

plugins {
   ....
    id 'androidx.benchmark'
}

/build.gradle.kts

buildscript {
    ....

    dependencies {
        classpath("androidx.benchmark:benchmark-gradle-plugin:1.1.1")
    }
}

然后您可以运行命令:

adb shell am start-activity -W -n com.example/.MainActivity

好吧,现在我们找到了两种方法来获取应用程序花费开始的时间。现在,我们可以讨论如何使我们的结果更加进展。所有建议波纹管均适用于两种类型的测量。

  1. 冷启动和清除应用数据

adb shell pm clear com.example每次在测量之前运行此命令。

  1. 进行几次测量并计算平均值。

  2. 在相同的设备/仿真器上并在短时间内运行测量。我的意思是,结果仅与在短时间内完成的测量相关,因为您不能保证在一段时间后,设备/仿真器上的条件将相同。

  3. 锁定时钟(在扎根设备/仿真器上),documentation

  4. 中的更多详细信息
  5. 在设备上运行测量。在大多数情况下,如果您在同一笔记本电脑上使用相同的仿真器来测量两个APK文件之间的差异,则甚至在模拟器上也可以看到正确的结果。但是,某些优化仅在真实设备上起作用,例如adding a baseline file仅在实际设备上运行测量时显示结果。

我们完成了测量的第一步。现在,我们可以比较不同的APK(例如不同的版本)。作为下一步,我们可以运行测量n次,然后以这种方式计算平均结果。

我在Github

上创建了一些bash脚本的示例

如果您有疑问,请在评论中询问。