Android官方文档翻译

原文地址:https://developer.android.com/training/testing/performance
参考:https://www.jianshu.com/p/7477e381a7ea

用户界面(UI)性能测试不仅可以确保app满足其功能要求,而且能够保证用户与app之间的交互是相当平滑的——以每秒60帧的速度运行(为什么是60fps?),没有任何丢弃或延迟的帧(或者我们喜欢称之为jank)。本文档介绍了可用于衡量UI性能的工具,并提供了将UI性能测量集成到测试实践中的方法。

为了提高性能,我们首先需要能够衡量系统的性能,然后诊断并识别可能从管道的各个部分到达的问题。

dumpsys是一款运行在设备上的Android工具,可以输出有关系统服务状态的信息。将 gfxinfo命令传递给dumpsys可在logcat中提供输出,其中记录了各阶段期间发生的动画以及帧相关的性能信息。

adb shell dumpsys gfxinfo < PACKAGE_NAME >

该命令可以输出多种不同的帧耗时信息。运行该命令后,可到如下结果

C:\Users\Administrator>adb shell dumpsys gfxinfo com.zhihu.android
Applications Graphics Acceleration Info:
Uptime: Realtime: ** Graphics info for pid [com.zhihu.android] ** Stats since: 2104750516354290ns
Total frames rendered:
Janky frames: (9.72%)
50th percentile: 9ms
90th percentile: 16ms
95th percentile: 26ms
99th percentile: 117ms
Number Missed Vsync:
Number High input latency:
Number Slow UI thread:
Number Slow bitmap uploads:
Number Slow issue draw commands:
HISTOGRAM: 5ms= 6ms= 7ms= 8ms= 9ms= 10ms= 11ms= 12ms= 13ms=
ms= 15ms= 16ms= 17ms= 18ms= 19ms= 20ms= 21ms= 22ms= 23ms= 24ms= 25ms=
26ms= 27ms= 28ms= 29ms= 30ms= 31ms= 32ms= 34ms= 36ms= 38ms= 40ms=
2ms= 44ms= 46ms= 48ms= 53ms= 57ms= 61ms= 65ms= 69ms= 73ms= 77ms= 81ms
= 85ms= 89ms= 93ms= 97ms= 101ms= 105ms= 109ms= 113ms= 117ms= 121ms=
25ms= 129ms= 133ms= 150ms= 200ms= 250ms= 300ms= 350ms= 400ms= 450ms=
00ms= 550ms= 600ms= 650ms= 700ms= 750ms= 800ms= 850ms= 900ms= 950ms=
000ms= 1050ms= 1100ms= 1150ms= 1200ms= 1250ms= 1300ms= 1350ms= 1400ms=
1450ms= 1500ms= 1550ms= 1600ms= 1650ms= 1700ms= 1750ms= 1800ms= 1850ms=
1900ms= 1950ms= 2000ms= 2050ms= 2100ms= 2150ms= 2200ms= 2250ms= 2300ms=
2350ms= 2400ms= 2450ms= 2500ms= 2550ms= 2600ms= 2650ms= 2700ms= 2750ms
= 2800ms= 2850ms= 2900ms= 2950ms= 3000ms= 3050ms= 3100ms= 3150ms= 3200m
s= 3250ms= 3300ms= 3350ms= 3400ms= 3450ms= 3500ms= 3550ms= 3600ms=
ms= 3700ms= 3750ms= 3800ms= 3850ms= 3900ms= 3950ms= 4000ms= 4050ms=
0ms= 4150ms= 4200ms= 4250ms= 4300ms= 4350ms= 4400ms= 4450ms= 4500ms=
50ms= 4600ms= 4650ms= 4700ms= 4750ms= 4800ms= 4850ms= 4900ms= 4950ms= Caches:
Current memory usage / total memory usage (bytes):
TextureCache /
Layers total (numLayers = )
RenderBufferCache /
GradientCache /
PathCache /
TessellationCache /
TextDropShadowCache /
PatchCache /
FontRenderer A8 /
A8 texture /
FontRenderer RGBA /
FontRenderer total /
Other:
FboCache /
Total memory usage:
bytes, 6.50 MB Pipeline=FrameBuilder
Profile data in ms: com.zhihu.android/com.zhihu.android.app.ui.activity.MainActivity/android
.view.ViewRootImpl@42bf37 (visibility=)
View hierarchy: com.zhihu.android/com.zhihu.android.app.ui.activity.MainActivity/android.view.
ViewRootImpl@42bf37
views, 247.25 kB of display lists Total ViewRootImpl:
Total Views:
Total DisplayList: 247.25 kB

adb shell dumpsys gfxinfo com.zhihu.android 输出结果

一 聚合帧统计信息

使用Android 6.0(API级别23),该命令将打印帧的聚合分析数据到logcat,并在整个过程生命周期内收集。下面介绍一些关键输出信息:

  • Graphics info for pid 23231 [com.zhihu.android] - 表明当前dump的为知乎应用界面的帧信息,pid为23231
  • Total frames rendered: 360 - 本次dump搜集了360帧的信息
  • Janky frames: 35 (9.72%) - 360帧中有35帧的耗时超过了16ms,卡顿概率为9.72%
  • 50th percentile: 9ms
  • 90th percentile: 16ms
  • 95th percentile: 26ms
  • 99th percentile: 117ms
  • Number Missed Vsync: 14 - 垂直同步失败的帧
  • Number High input latency: 0 - 处理input时间超时的帧数
  • Number Slow UI thread: 20 - 因UI线程上的工作导致超时的帧数
  • Number Slow bitmap uploads: 1 - 因bitmap的加载耗时的帧数
  • Number Slow issue draw commands: 16 - 因绘制导致耗时的帧数
  • HISTOGRAM: 5ms=16 6ms=13 ... - 直方图数据,表面耗时为0-5ms的帧数为16,耗时为5-6ms的帧数为13,同理类推。

这些高级统计数据在很高的层次上向我们传达了app的渲染性能,以及它在许多帧中的稳定性。

二 精确帧耗时信息

Android 6.0版本为gfxinfo提供了一个新的命令——framestats,其作用是可以从最近的帧中获取非常详细的帧耗时信息,因此我们可以更准确地跟踪和调试问题。

adb shell dumpsys gfxinfo < PACKAGE_NAME > framestats

此命令会打印出来app最后生成的120帧的帧耗时信息(使用纳秒时间戳)。运行该命令后,可到如下结果

C:\Users\Administrator>adb shell dumpsys gfxinfo com.zhihu.android framestats > E:\log\zhihu.csv

将结果输出到CSV文件中

Applications Graphics Acceleration Info:
Uptime: Realtime: ** Graphics info for pid [com.zhihu.android] ** Stats since: 2129424813068755ns
Total frames rendered:
Janky frames: (35.72%)
50th percentile: 14ms
90th percentile: 28ms
95th percentile: 32ms
99th percentile: 61ms
Number Missed Vsync:
Number High input latency:
Number Slow UI thread:
Number Slow bitmap uploads:
Number Slow issue draw commands:
HISTOGRAM: 5ms= 6ms= 7ms= 8ms= 9ms= 10ms= 11ms= 12ms= 13ms= 14ms= 15ms= 16ms= 17ms= 18ms= 19ms= 20ms= 21ms= 22ms= 23ms= 24ms= 25ms= 26ms= 27ms= 28ms= 29ms= 30ms= 31ms= 32ms= 34ms= 36ms= 38ms= 40ms= 42ms= 44ms= 46ms= 48ms= 53ms= 57ms= 61ms= 65ms= 69ms= 73ms= 77ms= 81ms= 85ms= 89ms= 93ms= 97ms= 101ms= 105ms= 109ms= 113ms= 117ms= 121ms= 125ms= 129ms= 133ms= 150ms= 200ms= 250ms= 300ms= 350ms= 400ms= 450ms= 500ms= 550ms= 600ms= 650ms= 700ms= 750ms= 800ms= 850ms= 900ms= 950ms= 1000ms= 1050ms= 1100ms= 1150ms= 1200ms= 1250ms= 1300ms= 1350ms= 1400ms= 1450ms= 1500ms= 1550ms= 1600ms= 1650ms= 1700ms= 1750ms= 1800ms= 1850ms= 1900ms= 1950ms= 2000ms= 2050ms= 2100ms= 2150ms= 2200ms= 2250ms= 2300ms= 2350ms= 2400ms= 2450ms= 2500ms= 2550ms= 2600ms= 2650ms= 2700ms= 2750ms= 2800ms= 2850ms= 2900ms= 2950ms= 3000ms= 3050ms= 3100ms= 3150ms= 3200ms= 3250ms= 3300ms= 3350ms= 3400ms= 3450ms= 3500ms= 3550ms= 3600ms= 3650ms= 3700ms= 3750ms= 3800ms= 3850ms= 3900ms= 3950ms= 4000ms= 4050ms= 4100ms= 4150ms= 4200ms= 4250ms= 4300ms= 4350ms= 4400ms= 4450ms= 4500ms= 4550ms= 4600ms= 4650ms= 4700ms= 4750ms= 4800ms= 4850ms= 4900ms= 4950ms= Caches:
Current memory usage / total memory usage (bytes):
TextureCache /
Layers total (numLayers = )
RenderBufferCache /
GradientCache /
PathCache /
TessellationCache /
TextDropShadowCache /
PatchCache /
FontRenderer A8 /
A8 texture /
A8 texture /
A8 texture /
A8 texture /
FontRenderer RGBA /
FontRenderer total /
Other:
FboCache /
Total memory usage:
bytes, 53.28 MB Pipeline=FrameBuilder
Profile data in ms: com.zhihu.android/com.zhihu.android.app.ui.activity.MainActivity/android.view.ViewRootImpl@10b457e (visibility=)
Window: com.zhihu.android/com.zhihu.android.app.ui.activity.MainActivity
Stats since: 2129424813129171ns
Total frames rendered:
Janky frames: (19.08%)
50th percentile: 10ms
90th percentile: 23ms
95th percentile: 28ms
99th percentile: 150ms
Number Missed Vsync:
Number High input latency:
Number Slow UI thread:
Number Slow bitmap uploads:
Number Slow issue draw commands:
HISTOGRAM: 5ms= 6ms= 7ms= 8ms= 9ms= 10ms= 11ms= 12ms= 13ms= 14ms= 15ms= 16ms= 17ms= 18ms= 19ms= 20ms= 21ms= 22ms= 23ms= 24ms= 25ms= 26ms= 27ms= 28ms= 29ms= 30ms= 31ms= 32ms= 34ms= 36ms= 38ms= 40ms= 42ms= 44ms= 46ms= 48ms= 53ms= 57ms= 61ms= 65ms= 69ms= 73ms= 77ms= 81ms= 85ms= 89ms= 93ms= 97ms= 101ms= 105ms= 109ms= 113ms= 117ms= 121ms= 125ms= 129ms= 133ms= 150ms= 200ms= 250ms= 300ms= 350ms= 400ms= 450ms= 500ms= 550ms= 600ms= 650ms= 700ms= 750ms= 800ms= 850ms= 900ms= 950ms= 1000ms= 1050ms= 1100ms= 1150ms= 1200ms= 1250ms= 1300ms= 1350ms= 1400ms= 1450ms= 1500ms= 1550ms= 1600ms= 1650ms= 1700ms= 1750ms= 1800ms= 1850ms= 1900ms= 1950ms= 2000ms= 2050ms= 2100ms= 2150ms= 2200ms= 2250ms= 2300ms= 2350ms= 2400ms= 2450ms= 2500ms= 2550ms= 2600ms= 2650ms= 2700ms= 2750ms= 2800ms= 2850ms= 2900ms= 2950ms= 3000ms= 3050ms= 3100ms= 3150ms= 3200ms= 3250ms= 3300ms= 3350ms= 3400ms= 3450ms= 3500ms= 3550ms= 3600ms= 3650ms= 3700ms= 3750ms= 3800ms= 3850ms= 3900ms= 3950ms= 4000ms= 4050ms= 4100ms= 4150ms= 4200ms= 4250ms= 4300ms= 4350ms= 4400ms= 4450ms= 4500ms= 4550ms= 4600ms= 4650ms= 4700ms= 4750ms= 4800ms= 4850ms= 4900ms= 4950ms= ---PROFILEDATA---
Flags,IntendedVsync,Vsync,OldestInputEvent,NewestInputEvent,HandleInputStart,AnimationStart,PerformTraversalsStart,DrawStart,SyncQueued,SyncStart,IssueDrawCommandsStart,SwapBuffers,FrameCompleted,DequeueBufferDuration,QueueBufferDuration,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
---PROFILEDATA--- com.zhihu.android/com.zhihu.android.app.ui.activity.QAHostActivity/android.view.ViewRootImpl@e6d2adf (visibility=)
Window: com.zhihu.android/com.zhihu.android.app.ui.activity.QAHostActivity
Stats since: 2129438951107815ns
Total frames rendered:
Janky frames: (44.24%)
50th percentile: 16ms
90th percentile: 29ms
95th percentile: 34ms
99th percentile: 48ms
Number Missed Vsync:
Number High input latency:
Number Slow UI thread:
Number Slow bitmap uploads:
Number Slow issue draw commands:
HISTOGRAM: 5ms= 6ms= 7ms= 8ms= 9ms= 10ms= 11ms= 12ms= 13ms= 14ms= 15ms= 16ms= 17ms= 18ms= 19ms= 20ms= 21ms= 22ms= 23ms= 24ms= 25ms= 26ms= 27ms= 28ms= 29ms= 30ms= 31ms= 32ms= 34ms= 36ms= 38ms= 40ms= 42ms= 44ms= 46ms= 48ms= 53ms= 57ms= 61ms= 65ms= 69ms= 73ms= 77ms= 81ms= 85ms= 89ms= 93ms= 97ms= 101ms= 105ms= 109ms= 113ms= 117ms= 121ms= 125ms= 129ms= 133ms= 150ms= 200ms= 250ms= 300ms= 350ms= 400ms= 450ms= 500ms= 550ms= 600ms= 650ms= 700ms= 750ms= 800ms= 850ms= 900ms= 950ms= 1000ms= 1050ms= 1100ms= 1150ms= 1200ms= 1250ms= 1300ms= 1350ms= 1400ms= 1450ms= 1500ms= 1550ms= 1600ms= 1650ms= 1700ms= 1750ms= 1800ms= 1850ms= 1900ms= 1950ms= 2000ms= 2050ms= 2100ms= 2150ms= 2200ms= 2250ms= 2300ms= 2350ms= 2400ms= 2450ms= 2500ms= 2550ms= 2600ms= 2650ms= 2700ms= 2750ms= 2800ms= 2850ms= 2900ms= 2950ms= 3000ms= 3050ms= 3100ms= 3150ms= 3200ms= 3250ms= 3300ms= 3350ms= 3400ms= 3450ms= 3500ms= 3550ms= 3600ms= 3650ms= 3700ms= 3750ms= 3800ms= 3850ms= 3900ms= 3950ms= 4000ms= 4050ms= 4100ms= 4150ms= 4200ms= 4250ms= 4300ms= 4350ms= 4400ms= 4450ms= 4500ms= 4550ms= 4600ms= 4650ms= 4700ms= 4750ms= 4800ms= 4850ms= 4900ms= 4950ms= ---PROFILEDATA---
Flags,IntendedVsync,Vsync,OldestInputEvent,NewestInputEvent,HandleInputStart,AnimationStart,PerformTraversalsStart,DrawStart,SyncQueued,SyncStart,IssueDrawCommandsStart,SwapBuffers,FrameCompleted,DequeueBufferDuration,QueueBufferDuration,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
---PROFILEDATA--- View hierarchy: com.zhihu.android/com.zhihu.android.app.ui.activity.MainActivity/android.view.ViewRootImpl@10b457e
views, 195.69 kB of display lists com.zhihu.android/com.zhihu.android.app.ui.activity.QAHostActivity/android.view.ViewRootImpl@e6d2adf
views, 147.95 kB of display lists Total ViewRootImpl:
Total Views:
Total DisplayList: 343.63 kB

zhihu.txt

以下是该命令的一些关键输出信息

Flags,IntendedVsync,Vsync,OldestInputEvent,NewestInputEvent,HandleInputStart,AnimationStart,PerformTraversalsStart,DrawStart,SyncQueued,SyncStart,IssueDrawCommandsStart,SwapBuffers,FrameCompleted,DequeueBufferDuration,QueueBufferDuration,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,

此输出的每一行代表app生成的一帧。每一行的列数都相同(16列),描述在生成帧的管道的每个阶段所花费的时间。下一节将详细介绍此格式,包括每列所代表的内容。

Framestats数据格式

由于数据块以CSV格式输出,因此将其粘贴到我们选择的电子表格工具,或者使用脚本进行收集和解析非常简单。下面说明了输出数据列的格式。所有时间戳都以纳秒为单位(1纳秒=1e-6毫秒)。

1.FLAGS

如果flags为0,则此帧的总耗时时间 = FRAME_COMPLETED(第14列,帧的结束时间) - INTENDED_VSYNC(第2列,帧的预期开始时间)。
如果flags不为0,则忽略该行,因为该帧的布局和绘制时间超过16ms,为异常帧。以下是可能发生的一些原因:
(1)窗口布局发生变化(例如app的第一帧或旋转后);
(2)帧被跳过也是有可能的,在这种情况下,某些值将具有垃圾时间戳。例如,如果帧超出60fps,或者屏幕上没有任何内容变脏,则可能跳过一个帧,这不一定是app中出现问题的迹象。

2.INTENDED_VSYNC

帧的预期开始时间。如果此值与VSYNC不同,则UI线程上发生了阻止其及时响应vsync信号的工作。

3.VSYNC

花费在vsync监听器和帧绘制的时间(Choreographer frame回调,动画,View.getDrawingTime()等)。
要了解VSYNC的更多信息及其对app的影响,请查看Understanding VSYNC 视频。

4.OLDEST_INPUT_EVENT

输入队列中最早输入事件的时间戳。如果此帧没有输入事件,则为Long.MAX_VALUE。
此值主要用于平台工作,对app开发人员的用处不大。

5.NEWEST_INPUT_EVENT

输入队列中最后输入事件的时间戳,如果此帧没有输入事件,则为0。
此值主要用于平台工作,对app开发人员的用处不大。
但是,通过计算FRAME_COMPLETED - NEWEST_INPUT_EVENT的值,可以大致了解app添加的延迟时间。

6.HANDLE_INPUT_START

将输入事件分派给app的时间戳。
通过计算ANIMATION_START - HANDLE_INPUT_START的值,可以测量app处理输入事件所花费的时间。
如果它们的时间差很高(> 2ms),则表示app花费了非常长的时间处理输入事件,例如View.onTouchEvent(),这可能表示此工作需要优化,或者分发到其他线程。但是请注意,在某些情况下,例如发起新活动或类似活动的点击事件时,预计可接受的时间差是很大的。

7.ANIMATION_START

运行Choreographer注册动画的时间戳。
通过计算PERFORM_TRANVERSALS_START - ANIMATION_START的值,可以得到评估正在运行的所有动画器(ObjectAnimator,ViewPropertyAnimator和常用转换器)所花费的时间。
如果它们的时间差很高(> 2ms),请检查您的app是否已编写了自定义动画或者设置了ObjectAnimators动画的字段,并确保它们适用于动画。
要了解Choreographer的更多信息,请查看 For Butter or Worse 视频。

8.PERFORM_TRAVERSALS_START

计算DRAW_START - PERFORM_TRAVERSALS_START的值,可以得到完成布局和度量阶段所需的时间。(注意,在滚动或动画期间,你会希望它应该接近于零)
要了解有关渲染管道的度量和布局阶段的更多信息,请查看 Invalidations, Layouts and Performance 视频。

9.DRAW_START

performTraversals的绘制阶段开始的时间戳。这是录制任何无效视图的显示列表的起点。
此时间与SYNC_START之间的时间是在树中所有无效视图上调用View.draw()所需的时间。
有关绘图模型的更多信息,请查看 Hardware Acceleration 或者 Invalidations, Layouts and Performance 视频。

10.SYNC_QUEUED

将同步请求发送到RenderThread的时间。
这标志着开始同步阶段的消息被发送到RenderThread的时刻。如果此时间与SYNC_START之间的时间差很长(> 0.1ms左右),则表示RenderThread正忙于处理不同的帧。在内部,这用于区分执行太多工作以至于超过16ms预算的帧和由于前一帧超过16ms预算而导致被停止的帧。

11.SYNC_START

绘图同步阶段开始的时间。
如果此时间与ISSUE_DRAW_COMMANDS_START之间的时间很长(> 0.4ms左右),则通常表示已绘制了许多必须上传到GPU的新位图。
要了解有关同步阶段的更多信息,请查看 Profile GPU Rendering 视频。

12.ISSUE_DRAW_COMMANDS_START

硬件渲染器开始向GPU发出绘图命令的时间。
计算FRAME_COMPLETED - ISSUE_DRAW_COMMANDS_START的值,可以大致了解app生成多少GPU工作。这里会出现很多过度绘制或低效的渲染效果等问题。

13.SWAP_BUFFERS

调用eglSwapBuffers的时间,在平台工作之外相对无用。

14.FRAME_COMPLETED

帧的结束时间戳。可以通过执行FRAME_COMPLETED - INTENDED_VSYNC来计算在此帧上工作的总时间。

15.DequeueBufferDuration和QueueBufferDuration

我测试的是Android 8.0版本,除了以上14列数据外,还有2列数据——DequeueBufferDuration和QueueBufferDuration,这2列数据在官方文档中没有提及,估计是后来新加的。

你可以用不同的方式使用这些数据。例如下面的直方图,显示不同帧时间的分布(FRAME_COMPLETED - INTENDED_VSYNC)。
这个图表一目了然地告诉我们,大多数帧都非常好——大多数的帧耗时都远低于16ms(用红色表示),但几帧明显超过了16ms。随着时间的推移,我们可以查看此直方图中的变化,以查看批量变化或新创建的异常值。您还可以根据数据中的许多时间戳来绘制出输入延迟,布局花费的时间或其他类似的感兴趣度量。

三 帧耗时数据的获取

如果在开发人员选项中将配置文件Profile GPU rendering为In adb shell dumpsys gfxinfo,该命令将打印出最近120帧耗时信息,并将其分成几个不同的类别,可以直观地显示各部分的快慢。
与上面的framestats类似,将它粘贴到我们选择的电子表格工具,或者使用脚本进行收集和解析非常简单。下图显示了app生成的许多帧耗时的细分。


此结果可以通过运行gfxinfo,复制输出,将其粘贴到电子表格工具中,并将数据绘制为直方图获取。
每个垂直条代表一帧动画,它的高度表示计算动画帧所用的毫秒数。条形图的每个彩色部分代表渲染管道的不同阶段,因此您可以看到app的哪些部分可能会产生瓶颈。有关了解渲染管道以及如何对其进行优化的详细信息,请查看 Invalidations Layouts and Performance 视频。

四 控制统计信息的收集

framestats和简单的帧耗时信息都是在非常短的时间内收集数据——大约2s收集一次(一次120帧,一帧16ms,耗时约2s)。为了精确控制此时间窗口,例如,将数据限制为特定的动画,您可以重置所有计数器,并重新聚合统计信息。

adb shell dumpsys gfxinfo <PACKAGE_NAME> reset

这也可以与dumps命令一起使用,以常规节奏进行收集和重置,连续获得少于2s的帧数据。

五 如何诊断性能问题

dumpsys能发现问题或者判断问题的严重性,但无法定位真正的原因。如果要定位原因并找到解决它们的适当方法,强烈建议使用systrace工具。

六 其他资源

有关Android渲染管道如何工作的更多信息,您可以在以下找到常见的问题以及如何解决这些问题,下面某些资源可能对您有用:

七 自动化UI性能测试

UI性能测试的其中一种方法是简单地让人类测试员在目标app上执行一组用户操作,并且可视地查找问题,或者使用工具驱动的方法花费大量时间来查找问题。但是这种手动方法充满了危险——人类感知帧速率变化的能力差别很大,而且这也是耗时,乏味且容易出错的。
更有效的方法是从自动化UI测试中记录和分析关键性能指标。Android 6.0包含新的日志记录功能,可以轻松确定app动画中jank的数量和严重程度,并可用于构建严格的流程来确定当前的性能并跟踪未来的性能目标。
要了解有关Android性能测试的更多信息,请查看  Automated Performance Testing Codelab 。您将学习如何编写和执行自动化测试并查看结果,以了解如何提高app性能。

补充

以上是我对官方文档的一些理解翻译,下面是另外的补充(摘自http://www.importnew.com/3784.html )。

Gfxinfo工具是Android4.1引入的,可以在开发者工具中看到新添加的一项“Profile GPU rendering”(GPU渲染分析)。如果在Android 4.2 及以上设备上看不见开发者选项,可以在“关于手机”的界面底部,单击“版本号”7次。

勾选Profile GPU rendering选项后,即可操作需要测试的界面。在终端运行下面命令:

>adb shell dumpsys gfxinfo <package_name>

在产生的日志中,你会发现一段标记为“Profile”的毫秒量级的数据。这段数据包含了一个有三列数据的表,应用的每个window(窗口)都有一个这样 的表。为了使用这个数据,你可以简单的将这个表拷到你最喜欢的电子制表软件中,从而生成一个数据堆叠的列图。以下这个图就是我的测量结果。


每一列给出了每一帧花在渲染上的时间估计:
“Draw”是指Java层用在创建“display lists”(显示列表)上的时间。它表明运行例如View.onDraw(Canvas)需要多少时间。
“Process”是指Android 2D渲染引擎用在执行“display lists”上的时间。你的UI层级(hierarchy)中的View数量越多,需要执行的绘画命令就越多。
“Execute”是指将一帧图像交给合成器(compositor)的时间。这部分占用的时间通常比较少。

提醒:要以60fps的帧率进行平滑的渲染,每一帧所占用的时间需要少于16ms。

关于“Execute”:
如果Excute花费很多时间,这就意味着你跑在了系统绘图流水线的前面。Android在运行状态时最多可以用3块缓存,如果此时你的应用还需要一块缓 存,那应用就会被阻塞直到三块中的一块缓存被释放。这种情况的发生一般有两个原因。第一个原因是你的应用在Dalvik(java虚拟机)端画的太快,而在它的Display list在GPU端执行太慢。第二个原因是你的应用花费太多时间在前几帧的渲染上,一旦流水线满了,它就跟不上,直到动画的完成。这些是我们想在下一个版本的Android改进的地方。

以上这个图明显的证实了我的疑虑:这个应用在大部分时间运行良好,但某些时候会发生丢帧。

更多请查看:

英文原文:Android Performance Case Study
译文地址: http://www.importnew.com/3784.html 编译:ImportNew - 孙立

我的测试实践(honor 8,Android 8.0,知乎应用)

在“开发人员选项”中勾选“GPU呈现模式分析”下的“在屏幕上呈现为条形图”,然后执行命令

>adb shell dumpsys gfxinfo com.zhihu.android > E:/log/zhihu-tiaoxingtu.txt

输出结果如下所示

Applications Graphics Acceleration Info:
Uptime: Realtime: ** Graphics info for pid [com.zhihu.android] ** Stats since: 2145917787705821ns
Total frames rendered:
Janky frames: (26.85%)
50th percentile: 13ms
90th percentile: 24ms
95th percentile: 30ms
99th percentile: 69ms
Number Missed Vsync:
Number High input latency:
Number Slow UI thread:
Number Slow bitmap uploads:
Number Slow issue draw commands:
HISTOGRAM: 5ms= 6ms= 7ms= 8ms= 9ms= 10ms= 11ms= 12ms= 13ms= 14ms= 15ms= 16ms= 17ms= 18ms= 19ms= 20ms= 21ms= 22ms= 23ms= 24ms= 25ms= 26ms= 27ms= 28ms= 29ms= 30ms= 31ms= 32ms= 34ms= 36ms= 38ms= 40ms= 42ms= 44ms= 46ms= 48ms= 53ms= 57ms= 61ms= 65ms= 69ms= 73ms= 77ms= 81ms= 85ms= 89ms= 93ms= 97ms= 101ms= 105ms= 109ms= 113ms= 117ms= 121ms= 125ms= 129ms= 133ms= 150ms= 200ms= 250ms= 300ms= 350ms= 400ms= 450ms= 500ms= 550ms= 600ms= 650ms= 700ms= 750ms= 800ms= 850ms= 900ms= 950ms= 1000ms= 1050ms= 1100ms= 1150ms= 1200ms= 1250ms= 1300ms= 1350ms= 1400ms= 1450ms= 1500ms= 1550ms= 1600ms= 1650ms= 1700ms= 1750ms= 1800ms= 1850ms= 1900ms= 1950ms= 2000ms= 2050ms= 2100ms= 2150ms= 2200ms= 2250ms= 2300ms= 2350ms= 2400ms= 2450ms= 2500ms= 2550ms= 2600ms= 2650ms= 2700ms= 2750ms= 2800ms= 2850ms= 2900ms= 2950ms= 3000ms= 3050ms= 3100ms= 3150ms= 3200ms= 3250ms= 3300ms= 3350ms= 3400ms= 3450ms= 3500ms= 3550ms= 3600ms= 3650ms= 3700ms= 3750ms= 3800ms= 3850ms= 3900ms= 3950ms= 4000ms= 4050ms= 4100ms= 4150ms= 4200ms= 4250ms= 4300ms= 4350ms= 4400ms= 4450ms= 4500ms= 4550ms= 4600ms= 4650ms= 4700ms= 4750ms= 4800ms= 4850ms= 4900ms= 4950ms= Caches:
Current memory usage / total memory usage (bytes):
TextureCache /
Layers total (numLayers = )
RenderBufferCache /
GradientCache /
PathCache /
TessellationCache /
TextDropShadowCache /
PatchCache /
FontRenderer doesn't exist.
Other:
FboCache /
Total memory usage:
bytes, 0.00 MB Pipeline=FrameBuilder
Profile data in ms: com.zhihu.android/com.zhihu.android.app.ui.activity.MainActivity/android.view.ViewRootImpl@108398b (visibility=)
Draw Prepare Process Execute
1.91 0.74 6.35 1.76
10.42 0.73 4.52 1.77
1.95 0.70 9.78 2.12
1.96 0.92 6.02 1.93
1.88 1.06 6.16 2.58
2.47 1.02 5.39 2.25
2.53 1.04 5.44 2.33
2.75 1.00 7.00 2.66
2.57 1.13 6.21 2.44
6.08 1.58 5.28 3.58
3.90 1.83 8.05 4.41
3.47 1.49 7.00 3.30
3.97 1.08 4.25 2.31
2.33 0.78 4.12 2.26
1.96 0.74 5.42 1.86
1.72 1.10 4.63 1.67
1.63 0.73 4.36 1.62
1.42 0.86 4.90 2.01
6.32 1.36 8.52 3.01
4.55 1.10 6.42 3.72
8.18 0.88 5.40 2.71
4.24 0.86 4.11 2.04
6.11 0.91 3.77 1.84
5.22 0.72 6.50 1.87
4.18 0.41 4.23 1.72
4.13 0.87 3.94 1.90
3.62 0.96 7.41 2.03
4.59 0.85 3.77 1.84
4.83 0.72 3.96 2.01
5.37 0.71 3.70 1.68
3.41 0.96 4.24 1.72
3.46 0.83 4.55 1.88
2.98 0.70 4.81 1.85
3.52 0.94 4.27 2.03
5.36 0.70 3.82 1.71
3.38 0.93 4.13 1.71
6.01 1.25 5.89 2.92
7.39 1.17 9.01 2.68
9.79 1.31 16.11 4.10
9.81 0.75 14.20 3.72
13.28 1.77 11.97 3.82
14.87 1.91 10.70 7.43
31.82 0.99 8.60 2.06
8.42 0.78 6.58 1.83
4.38 0.81 5.54 1.96
3.81 0.85 5.48 1.89
3.80 1.14 5.76 1.80
3.67 1.20 5.35 1.75
4.29 0.81 5.80 1.96
4.37 0.99 5.40 2.02
5.10 0.77 5.39 1.80
3.99 1.02 5.17 1.99
4.20 0.94 5.11 1.75
2.96 0.75 6.41 1.70
2.93 0.93 5.80 1.79
2.78 0.82 7.04 1.93
3.59 1.07 5.77 1.84
4.14 1.06 6.67 2.47
6.35 1.04 6.82 2.57
5.84 1.05 6.16 2.55
3.75 1.24 7.44 2.63
6.43 1.01 6.59 2.64
3.73 1.51 6.78 2.54
4.93 1.07 6.83 2.50
6.09 1.06 7.38 2.52
4.30 1.31 7.37 2.54
4.07 1.09 9.62 3.96
8.27 1.37 8.60 4.31
3.74 0.93 8.39 12.89
7.61 0.83 7.47 1.83
14.74 0.82 6.05 1.87
6.52 0.82 5.43 2.08
5.62 0.76 5.48 1.82
5.92 0.76 10.58 2.19
5.00 0.78 8.08 1.93
50.00 2.83 6.46 2.16
50.00 0.88 7.23 1.83
3.61 0.93 7.27 1.74
3.64 1.20 5.32 2.14
4.41 0.76 5.32 2.38
3.75 0.97 6.22 2.54
4.74 0.97 5.53 3.06
3.52 0.87 6.68 2.13
5.56 0.73 5.31 1.80
4.21 0.79 5.67 1.88
3.26 0.87 6.81 2.21
5.62 0.70 5.67 1.88
3.34 0.73 6.64 2.05
3.62 0.84 5.82 2.14
5.01 6.90 5.13 2.01
4.37 0.82 7.01 1.73
4.90 0.75 4.13 1.76
4.53 0.96 4.06 1.80
3.60 0.98 4.39 1.83
3.92 0.84 4.29 1.72
4.43 0.90 4.49 1.91
3.58 1.09 5.63 1.64
3.46 0.92 5.69 1.64
8.53 0.84 8.19 3.02
10.41 1.29 10.69 3.59
9.71 1.14 13.76 2.70
7.31 1.05 8.99 2.71
6.50 1.15 7.68 3.57
6.37 1.14 8.01 1.90
8.11 0.80 6.61 1.98
4.42 1.27 5.92 2.16
4.33 0.89 5.49 1.91
5.70 0.78 5.39 1.93
3.97 0.98 5.59 1.80
3.72 0.87 5.68 1.73
6.03 0.77 5.77 1.66
5.60 0.75 5.52 1.73
4.02 0.90 5.65 1.68
2.98 0.97 6.31 2.15
3.04 0.92 6.31 1.73
2.77 1.07 6.36 1.84
3.43 0.87 7.68 1.99
4.85 0.91 6.15 1.97
1.33 0.83 9.52 2.77
26.07 0.79 4.95 1.70 com.zhihu.android/com.zhihu.android.app.ui.activity.QAHostActivity/android.view.ViewRootImpl@e8b0a68 (visibility=)
Draw Prepare Process Execute
10.08 0.40 6.08 1.59
5.85 0.38 4.19 1.48
5.09 0.39 6.83 1.56
5.52 0.44 6.03 1.95
6.77 0.41 4.90 1.93
5.14 0.39 7.49 1.62
5.88 0.38 4.92 2.51
5.34 0.43 6.99 2.03
5.62 0.41 5.14 1.72
5.03 0.43 6.06 1.57
5.59 0.39 5.34 1.63
5.46 0.41 6.60 1.52
5.51 0.40 5.12 1.72
4.76 0.48 4.89 1.74
4.74 0.40 6.06 1.37
5.19 0.51 5.25 1.71
4.91 0.49 9.86 1.84
7.42 0.40 10.30 3.85
6.09 0.44 5.23 1.80
5.21 0.49 6.40 1.94
6.46 1.02 7.08 1.80
5.82 0.40 5.14 2.84
6.78 0.49 7.34 1.79
6.45 0.52 5.45 1.70
6.77 0.40 6.02 2.34
7.03 0.44 6.94 1.49
5.37 0.40 6.11 1.77
4.93 0.41 5.20 1.60
7.17 0.42 5.50 1.80
7.51 0.44 6.28 2.01
5.46 0.43 6.50 1.62
5.17 0.41 5.54 1.88
5.64 0.39 5.46 1.67
4.75 0.41 4.92 1.66
4.75 0.39 6.11 1.57
6.58 0.44 4.82 1.78
4.86 0.43 5.02 1.63
4.60 0.41 5.29 1.66
4.86 0.39 5.30 1.71
4.61 0.53 5.00 1.67
5.79 0.38 4.94 1.87
5.52 0.51 4.91 1.74
4.78 1.31 4.86 1.65
4.70 0.40 6.72 1.73
4.82 0.41 4.96 1.73
4.77 0.39 6.11 1.56
6.67 0.40 4.79 1.70
4.87 0.41 5.19 1.87
4.86 0.39 5.01 1.83
4.48 0.40 6.47 1.73
4.70 0.41 5.73 1.87
4.62 0.42 6.22 1.58
4.99 0.40 5.42 1.67
5.31 0.39 5.99 1.56
5.11 0.42 6.53 2.21
7.55 0.60 6.59 2.67
7.40 0.56 6.90 2.70
7.03 0.73 8.17 3.97
9.59 0.55 7.83 5.02
10.94 0.51 5.59 1.93
6.82 0.42 7.59 4.42
6.94 0.42 5.58 1.99
8.14 0.41 5.70 1.76
4.83 0.41 5.52 1.70
5.86 0.46 5.65 1.91
7.27 0.51 5.21 1.81
6.47 0.42 5.55 1.83
8.56 0.38 6.93 2.05
7.47 0.41 6.60 2.52
8.12 0.39 5.20 2.57
5.19 0.43 6.40 1.77
7.75 0.39 5.08 1.77
6.31 0.42 5.33 1.95
6.47 0.25 5.25 1.78
6.56 0.39 5.24 1.66
4.79 0.42 4.99 1.70
5.12 0.41 4.61 1.88
5.62 0.40 4.90 1.59
5.50 0.40 5.95 1.85
6.09 0.32 4.85 1.65
2.75 0.31 6.37 1.92
2.58 0.31 4.46 2.14
6.91 0.28 10.89 3.26
5.69 0.31 4.53 2.17
1.72 0.29 6.18 1.61
1.88 0.97 5.62 1.67
1.70 0.30 6.53 1.79
1.81 0.97 5.45 1.72
1.67 0.29 6.64 1.67
1.74 0.28 6.39 1.67
1.75 0.75 5.72 1.69
1.72 0.30 6.45 1.65
1.71 0.37 6.34 2.07
1.75 0.60 6.01 1.70
1.73 0.29 6.53 1.67
1.68 0.29 6.50 1.87
1.26 0.32 7.00 1.71
7.10 0.49 12.71 3.40
19.43 0.43 6.42 2.08
15.03 0.68 6.03 3.95
10.45 0.48 5.02 1.88
8.49 0.43 5.51 2.24
8.16 0.41 4.97 2.09
7.87 0.42 5.48 1.83
2.81 0.36 6.43 1.98
7.57 1.22 19.97 14.92
6.90 1.83 14.12 6.48
19.60 0.47 6.10 2.57
3.95 0.43 11.00 2.01
2.60 0.30 12.31 1.85
2.38 0.36 14.06 1.99
1.87 0.31 14.93 2.01
1.92 0.41 4.41 2.10
2.92 0.39 6.54 3.33
2.47 0.40 6.45 2.62
3.33 0.46 6.54 2.86
3.57 0.60 6.58 2.77
3.28 0.44 6.73 2.29
2.09 0.35 5.05 1.94
1.91 0.45 5.65 2.17 View hierarchy: com.zhihu.android/com.zhihu.android.app.ui.activity.MainActivity/android.view.ViewRootImpl@108398b
views, 242.24 kB of display lists com.zhihu.android/com.zhihu.android.app.ui.activity.QAHostActivity/android.view.ViewRootImpl@e8b0a68
views, 64.70 kB of display lists Total ViewRootImpl:
Total Views:
Total DisplayList: 306.95 kB

zhihu-tiaoxingtu.txt

然后我发现在“Profile”中有4列数据:Draw Prepare Process Execute。比上述多了一列Prepare,估计是新版本增加的?暂时还未研究。

Android UI性能测试——使用 Gfxinfo 衡量性能的更多相关文章

  1. Android UI性能测试——使用 Systrace 查找问题

    一 官方文档翻译 官文地址:https://developer.android.com/studio/command-line/systrace systrace命令允许您在系统级别上收集和检查所有运 ...

  2. Android UI性能优化详解

    设计师,开发人员,需求研究和测试都会影响到一个app最后的UI展示,所有人都很乐于去建议app应该怎么去展示UI.UI也是app和用户打交道的部分,直接对用户形成品牌意识,需要仔细的设计.无论你的ap ...

  3. Android UI性能优化实战, 识别View中的性能问题

    出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android ...

  4. Android UI性能优化实战 识别绘制中的性能问题

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45556391: 本文出自:[张鸿洋的博客] 1.概述 2015年初google ...

  5. Android app性能测试小结(7个性能指标)

    1.性能测试的几个指标:       2.性能测试环境准备: 3.启动时间 3.1,监控值的获取方法 启动分为冷启动和热启动,冷启动:应用程序首次启动,进程首次创建并加载资源的过程:热启动:应用程序启 ...

  6. Android APP性能测试笔记(一)

    Android APP性能测试笔记(一) (1)工具使用   Android Studio  GT, root的真机 (2)记录apk大小(对比竞品)   使用Android Studio导入需要测试 ...

  7. Android应用性能测试

    Android应用性能测试 Android用户也许会经常碰到以下的问题: 1)应用后台开着,手机很快没电了——应用耗电大 2)首次/非首次启动应用,进入应用特别慢——应用启动慢 3)应用使用过程中,越 ...

  8. 怎样进行Android UI元素设计

    Android UI元素里面包含了许多的内容,比如:该平台由操作系统.中间件.用户界面和应用软件组成,一个应用程序要想受用户喜爱,那么UI可不能差. Android为相似的编程名词引入了一些新的术语, ...

  9. 详解 “Android UI”设计官方教程

    我们曾经给大家一个<MeeGo移动终端设备开发UI设计基础教程>,同时很多朋友都在寻找Android UI开发的教程,我们从Android的官方开发者博客找了一份幻灯片,介绍了一些Andr ...

随机推荐

  1. Luogu_1966_火柴排队

    题目描述 涵涵有两盒火柴,每盒装有\(n\)根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum (a_i-b_i)^2 ...

  2. C++如何保留2位小数输出

    cout<<setiosflags(ios::);//需要头文件#include <iomanip> 然后再输出实数类型变量即可以保留2位小数输出了,当然你要保留三位小数,se ...

  3. mysql启动报错ERROR! The server quit without updating PID file处理

    从其它服务器拷贝编译安装后的MySQL5.7目录后启动时报错如下: ERROR! The server quit without updating PID file(/path/to/XXX.pid) ...

  4. VMware 虚拟机重启后获取不到ip的问题

    问题: VMware 虚拟机重启后获取不到ip,如图: 解决: 打开windows服务管理器,将VMware相关服务启动. 验证: 重启网络服务后,成功获取ip.

  5. 从iPhone X到三星S9,为何现在山寨还能如此肆无忌惮?

    X到三星S9,为何现在山寨还能如此肆无忌惮?" title="从iPhone X到三星S9,为何现在山寨还能如此肆无忌惮?"> 曾几何时,以"土豪金&qu ...

  6. makefile(3)函数

    前言 学习make和makefile的主要目的是分析大型项目的源代码的关系,上一节我们讲述了makefile 中的变量,本节主要学习一下 makefile 中的函数,首先函数肯定可以分为几部分: 内置 ...

  7. JDK_Packages_java_utils

    utils包需要关注的主要有 ​ 集合框架.并发包.函数式编程.观察者模式@see PropertyChangeSupport java.util(集合框架) Contains the collect ...

  8. Core Java之7种单例模式

    初始化空 初始化创建 一把锁 两把锁 大专栏  Core Java之7种单例模式"headerlink" title="静态内部类">静态内部类 静态加载 ...

  9. YCSB项目学习

    主要总结Yahoo的数据库测试项目YCSB的使用(针对redis). github网址:https://github.com/brianfrankcooper/YCSB 需要安装 java maven ...

  10. Alberto Del Bimbo:为什么说研究员要有想象力?

    ​ Del Bimbo:为什么说研究员要有想象力?" title="Alberto Del Bimbo:为什么说研究员要有想象力?"> ​ 说到科研,与日本式的&q ...