专项测试之系统资源分析
CPU 与 GPU 的关系
图形API允许CPU直接与GPU,需要通过中间层来链接
CPU 把display list放入队列
中间层维护一个队列
GPU 从中间层取出队列进行绘制
GPU渲染工具
Android开发者选项中提供了Profile GPU Rendering功能,用于在屏幕上实时显示GPU渲染每一帧图像花费的时间(单位:ms)。
竖条=绘制每一帧所消耗的时间
不同的颜色代表UI绘制的不同阶段
并且在柱状图的中间还有一根绿色的横线代表16ms的绘制时间基准
GRP会统计并显示app最近运行的128帧
渲染时间用柱状图表示,上面的绿线代表16ms,也就是要尽量保证所有柱状图都在这条线下方。每一条柱状图都由3部分组成,蓝色、红色和橙色,代表渲染的3个不同的阶段,通过分析这三个阶段的时间就可以找到渲染时的性能瓶颈。
蓝色条码解析
蓝色条码含义:View需要先转换为GPU能识别的格式 ,对所有需要更新的view完成这两步花费的时间。 表示绘制时间或者在Java层创建和更新display list的时间。在一个View实际被渲染前,它需要先转换为GPU能识别的格式。简单来说可能就是几个绘制命令,复杂一点,我们可能在嵌入了一条从canvas获取的自定义路径。这一步完成之后,输出结果就会被系统作为display list缓存起来。
若蓝色条码高时可能的原因有:
view突然无效(invalidate),onDraw函数中做了复杂的绘制逻辑
红色条码解析:
红色条码含义:渲染引擎OpenGL处理DISPLAYLIST,将处理结果传递给GPU的执行时间,为了将变化绘制在屏幕上,Android需要使用OpenGL ES API来绘制这些display list信息,OpenGL最终将数据传给了GPU,然后GPU渲染到屏幕上。View越复杂,OpenGL绘制所需要的命令也越复杂。
红色较高可能的原因:
view过于复杂,view重复提交
橙色条码解析:
橙色色条码含义:cpu在等待gpu完成工作的过程,就是CPU告诉GPU渲染已经完成的时间。。
橙色较高可能的原因:
GPU任务太多,复杂的view绘制
不同颜色的含义
墨绿色 MiscTime/VSync Delay
代表在连续两帧间的时间间隔,可能是因为子线程执行时间过:长抢占了UI线程被cpu执行的机
会.
深绿色 Input Handing
代表app在用户输入事件回调中花费的时间,这部分过高可能意味着app处理用户输入事件时间:
过长,建议将操作分流到工作线程.
绿色 Animation
代表为该帧内所有animator求值(属性动画中代表通过估值器计算属性的具体值)所花费的时间.如果
这部分过高,代表自定义animator性能不佳或者更新view属性引发了某些意外操作.
淡绿色 Measure/Layout
代表了onLayout和onMeasure方法消耗的总时间,这段很高代表遍历整个view树结构花费了太多
时间.
深蓝色 draw
代表创建更新DisplayL ist的时间,过高代表在onDraw中花费过多时间,可能是自定义画图操作太多
或执行了其它操作.
浅蓝色 sync&upload
向CPU传输Bitmap花费的时间,过高代表了加载了大量图形.
红色 command Issue
Android 2D渲染器向OpenGL发出命令绘制或重绘花费的时间,条码的长度等于所有Display list绘制时间的总和
橘色 swap buffers
代表qpu在等待gpu完成工作,如果过高代表GPU需要完成的工作过多
men统计
内存耗用名词解析
VSS Virtual Set Size 虚拟耗用内存 (包含共享库占用的内存)
RSS Resident Set Size 实际使用物理内存 (包含共享库占用的内存)
PSS Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
各指标解析
VSS:衡量虚拟内存大小无太大用处,无法知道分配的物理内存大小
RSS:各进程的RSS相加,会超过系统内存使用量
PSS:各进程的PSS之和,就是系统的内存使用量
USS:是PSS中自己的部分,不包含任何共享的部分
内存大小占用规律
VSS>=RSS>=PSS>=USS
procstats:
adb shell dumpsys procstats - -hours 3
进程详情:
进程名称/USER/VersionCode
状态: (minPSS -avgPSS-maxPSS/minUSS -avgUSS -maxUSS over samples)
输入字段解析
百分比:表示在总的时间内,进程在各种状态下的消耗
例如,1000,就指在这段时间内,这个进程是一直处于运行当中的
TOTAL:表示了进程的综合占用情况
Imp Fg:加载到前台
Service:标识了是否是服务
Persistent: 标识了是否一直驻留在内存当中,与Service一样,表示内存进驻的级别。
Top:标识了是否是顶层进程
Receiver:标识了是否是广播进程。
查看指定进程的mem:
adb shell dumpsys meminfo com.xueqiu.android
因为安卓常驻系统应该较多,所有版本比对的形式来分析内存占比更加准确