请参考这篇文章
https://bbs.perfdog.qq.com/article-detail.html?id=6
该文章主要是讲解PerfDog卡顿Jank定义、原理、Stutter(卡顿率)及影响等。内容将分为六部分:FrameTime、FPS、流畅度、Jank(卡顿次数)、Stutter(卡顿率)、影响。从深层次分析在性能测试工作中这六部分起到的重要意义。
SoloPi源码分析
以计算帧率为例
RecordPattern pattern = new RecordPattern("帧率", "帧", "FPS");
pattern.setStartTime(startTime);
pattern.setEndTime(endTime);
result.put(pattern, fpsCurrent);
fpsCurrent代表该值,在record()函数里面dataWrapper.fps,dataWrapper由currentData赋值
FpsUtil.FpsDataWrapper dataWrapper = currentData.get(displayIdx);
if (dataWrapper.fps > 0) {
String topActivity = dataWrapper.activity;
fpsCurrent.add(new RecordPattern.RecordItem(System.currentTimeMillis(),
(float)dataWrapper.fps, topActivity));
currentData通过receiveFps获得,receiveFps通过Observer模式订阅消息,
@Subscriber(@Param(FpsUtil.FPS_DATA_EVENT))
public void receiveFps(List<FpsUtil.FpsDataWrapper> dataWrappers)
在FpsUtil.java文件中,通过执行adb shell dumpsys gfxinfo < PACKAGE_NAME > 获得应用界面的帧信息
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
// 如果topActivity存在,查找Activity对应的Profile Data
result = CmdTools.execAdbCmd("dumpsys gfxinfo " + processName + " | grep '" + activity + "' -A129 | grep Draw -B1 -A128", 1000);
} else {
// 如果topActivity存在,并且版本在5.0及以上,可以通过visibility进行过滤,查找Activity对应的Profile Data
result = CmdTools.execAdbCmd("dumpsys gfxinfo " + processName + " | grep '" + activity + ".*visibility=0' -A129 | grep Draw -B1 -A128", 1000);
}
LogUtil.w(TAG, "Fps get gfxinfo cost: " + (System.currentTimeMillis() - startTime) + "ms");
具体换算过程,有兴趣的可以继续研究