专项测试之系统资源分析

CPU 与 GPU 的关系

图形API允许CPU直接与GPU,需要通过中间层来链接

CPU 把display list放入队列

中间层维护一个队列

GPU 从中间层取出队列进行绘制

GPU渲染工具

Android开发者选项中提供了Profile GPU Rendering功能,用于在屏幕上实时显示GPU渲染每一帧图像花费的时间(单位:ms)。

GPU渲染分析: GPU-RENDERING-PROFILE

竖条=绘制每一帧所消耗的时间

不同的颜色代表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

 

因为安卓常驻系统应该较多,所有版本比对的形式来分析内存占比更加准确

posted @ 2021-01-08 17:24  成子吃橙子  阅读(180)  评论(0编辑  收藏  举报