您是否尝试测试您的应用程序加载多少时间?如果不是,本文可以成为第一步的指南。可能您已经检查了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
好吧,现在我们找到了两种方法来获取应用程序花费开始的时间。现在,我们可以讨论如何使我们的结果更加进展。所有建议波纹管均适用于两种类型的测量。
- 冷启动和清除应用数据
adb shell pm clear com.example
每次在测量之前运行此命令。
-
进行几次测量并计算平均值。
-
在相同的设备/仿真器上并在短时间内运行测量。我的意思是,结果仅与在短时间内完成的测量相关,因为您不能保证在一段时间后,设备/仿真器上的条件将相同。
-
锁定时钟(在扎根设备/仿真器上),documentation
中的更多详细信息
-
在设备上运行测量。在大多数情况下,如果您在同一笔记本电脑上使用相同的仿真器来测量两个APK文件之间的差异,则甚至在模拟器上也可以看到正确的结果。但是,某些优化仅在真实设备上起作用,例如adding a baseline file仅在实际设备上运行测量时显示结果。
我们完成了测量的第一步。现在,我们可以比较不同的APK(例如不同的版本)。作为下一步,我们可以运行测量n次,然后以这种方式计算平均结果。
我在Github
上创建了一些bash脚本的示例如果您有疑问,请在评论中询问。