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. 奇异值分解SVD

    在介绍奇异值分解(SVD)之前我们先来回顾一下关于矩阵的一些基础知识. 矩阵基础知识 方阵 给定一个$ n×m $的矩阵$ A $,若n和m相等也就是矩阵的行和列相等那矩阵$ A $就是一个方阵. 单 ...

  2. 奇葩念头:微信能取代WP应用吗

         墙倒众人推,原本是再平常不过的事,但每次发生都显得特别凄凉--就和楼市买房买涨不买跌一样,在互联网行业,用户数量越多的产品或服务,就会越受到行业和大众青睐.而越是小众的产品或服务,虽然是要走 ...

  3. Python---2文本编辑器

    1.介绍 在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍. 所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为一个文 ...

  4. connect() failed (111: Connection refused) while connecting to upstream报错处理

    新lnmp环境调试项目时,nginx报错如下: 解决: 发现php-fpm.conf是以套接字方式通信,而nginx是以端口方式通信,见下图: 将nginx.conf修改为如下,重新reload即可

  5. React中key的讲解

    通过阅读React的文档我们知道React这个框架的核心思想是,将页面分割成一个个组件,一个组件还可能嵌套更小的组件,每个组件有自己的数据(属性/状态);当某个组件的数据发生变化时,更新该组件部分的视 ...

  6. 如何进行Web服务的性能测试

         涉及到web服务的功能在不断的增加,对于我们测试来说,我们不仅要保证服务端功能的正确性,也要验证服务端程序的性能是否符合要求.那么性能测试都要做些什么呢?我们该怎样进行性能测试呢? 性能测试 ...

  7. jquery和zepto的异同

    相同点 相同点: zepto: 是jquery 的 阉割版 是为移动端开发的库 jQuery的轻量级替代品.文件大小比较小 只有8k左右 ,是目前功能库中最小的一个,尽管不大,zepto 所提供的工具 ...

  8. 爬虫(一)爬取鱼c淘贴信息

    掏出了以前的小练习: 现在开始,每天复习下以前的爬虫练习,争取发现新的问题和可以优化的地方. # -*- coding:utf-8 -*- import requests import chardet ...

  9. 深度解析互联网大厂面试难题自定义@EnableXX系列

    深度解析互联网大厂面试难题自定义@EnableXX系列   其实是一个@Import的设计技巧 创建注解@EnableXX(任何名称注解都行,只是这个名字好一些) XXConfiguration类不能 ...

  10. 三年前端,面试思考(头条蚂蚁美团offer)

    小鱼儿本人985本科,软件工程专业,前端.工作三年半,第一家创业公司,半年.第二家前端技术不错的公司,两年半.第三家,个人创业半年.可以看出,我是个很喜欢折腾的人,大学期间也做过很多项目,非常愿意参与 ...