Android:通过systrace进行性能分析

一.Systrace 简介

  Systrace 允许您在系统级别(如SurfaceFlinger、WindowManagerService等Framework部分关键模块、服务、View系统等)收集和检查设备上运行的所有进程的计时信息。 它将来自Android内核的数据(例如CPU调度程序,磁盘活动和应用程序线程)组合起来,以生成HTML报告。

二、抓取Systrace 的方法:

方法一:使用Android Device Monitor行抓取 Systrace

  1. 启动 Android Device Monitor 工具,因为Android studio 3.1后认为monitor用的很少,便去掉了菜单栏启动按钮,所以只能通过命令运行该工具了。
    工具位于android-sdk目录中,例如我的本地SDK目录为“C:\Users\drago\AppData\Local\Android\Sdk” ,然后在tools目录中的monitor.bat即为启动脚本,双击运行即可。
  2. Monitor的界面如下:
  3. 点击Capture按钮并配置需要抓取信息:

    Destination File :制定生成的trace.html文件的地址
    Trace duration:抓取时间,通常设置5秒,并在5秒内重现问题,时间太短会导致问题重现时没有被抓到,时间太长会导致JavaHeap不够而无法保存。因此在能抓到问题点的情况下,时间越小越好。
    Trace Buffer Size:存储Systrace的size,同样太小会导致信息丢失,太长会导致Java Heap不够而无法保存。如果检测结果有异常,请调整Buffer Size的大小试试。
    Enable Application Traces from:检测的应用,默认选择none,这里需选择自己需要检测的应用。
    Commonly Used Tag:常用标签,这部分TAG全部使能。只关注显示情况的话 ,只选取Graphics和View System即可。
    Advanced Options:高级选项。如果设备root了,可以看到更多的TAG,如eMMC commands、Synchonization、Kernel Workqueues。

    注:假如抓取过多次trace,为避免数据丢失,请及时清除缓存中的内容,清理地方在 Android Device Monitor的右下角,如下图所示:

  4. 配置完成(如抓取camera相关trace)点击确定后,开始操作手机,在时间到了后会自动生成报表(trace.html)文件。

方法二:使用命令行抓取 Systrace

  1. 下载并安装Android SDK Tools(C:\Users\drago\AppData\Local\Android\Sdk\platform-tools\systrace\systrace.py),安装Python

    注:Python是没有自带访问windows系统API的库的,需要下载。库的名称叫pywin32,可以从网上直接下载:

      https://github.com/mhammond/pywin32/releases (下载适合你的Python版本)

  2. 连接手机,打开开发者选项中的USB Debug选项,使用命令行抓取 Systrace,语法如下:
    python systrace.py [options] [categories]

     例1: 调用systrace10秒钟内记录设备进程,包括图形进程,并生成一个名为mynewtraceHTML报告:

       python systrace.py --time=10 -o mynewtrace.html gfx 

     例2: 检测UI性能:

       python systrace.py view --time=10

     如果不指定任何类别或选项,systrace将生成包含所有可用类别的报告,并使用默认设置。 可用的类别取决于您使用的连接设备。

  3. Systrace存储路径如下android-sdk/platform-tools/systrace/

三、trace.html文件分析:

使用Google Chrome(其他浏览器很可能打不开)将这个文件打开进行分析,界面如下:
在进程的上面有一条很细的进度条,包含了该线程的状态:
  灰色
: 睡眠。
  蓝色: 可以运行(它可以运行,但还未被调度运行)。
  绿色: 正在运行(调度程序认为它正在运行)。

  红色
: 不间断的睡眠(通常发生在内核锁上), 指出I / O负载,对于性能问题的调试非常有用
  橙色: 由于I / O负载导致的不间断睡眠。
  要查看不间断睡眠的原因(可从sched_blocked_reason跟踪点获取),请选择红色不间断睡眠切片。

  快捷键:w:用于变大 s:用于缩小 d:左边移动 a:右边移动
  
  然后通过w放大,找F(即Frames)和F之间的间隔时间,如果间隔时间超过16ms的都是有问题的,16ms其实对应的就是60fps(1/60≈16ms),因为人眼与大脑之间的协作无法感知超过60fps的画面更新。Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,那么整个过程如果保证在16ms以内就能达到一个流畅的画面。那么如果操作超过了16ms就会发生下面的情况,如果系统发生的VSYNC信号,而此时无法进行渲染,还在做别的操作,那么就会导致丢帧的现象,(察觉到APP卡顿的时候,可以看看logcat控制台,会有drop frames类似的警告)。其中F圆圈中绿色表示在16.6毫秒内呈现的帧,花费16.6毫秒以上渲染的帧用黄色红色框圈表示。

  

  放大后可看到时间1420~1500ms中,两个F之间间隔70ms左右,明显是超过16ms的,然后继续放大可以看到具体的任务内容和占用时长:

  此时再点击“F”图标会在下栏提示相关内容如下:

  提示是listview在recycling/rebinding的时效率低,接着点击Alerts:

  点击各项也会相应展开,并给出性能分析结果和优化建议:

  如果要查看工具在 trace中发现的每个 Alert以及设备触发 Alert的次数,请单击窗口最右侧的 Alerts选项卡,如下图所示:
  

  如果在 UI Thread上做太多的工作,需要找出哪些方法消耗了太多的 CPU时间。一种方法是添加跟踪标记到您认为会导致这些瓶颈的方法,以查看这些函数调用是否显示在 systrace中。 如果您不确定哪些方法可能会在UI线程上造成瓶颈,请使用 Android Studio的内置 CPU分析器,或者生成跟踪日志并使用 Traceview查看它们。
   虽然Systrace无法定位到某一行需要优化的代码,但通过Alerts和Frames以根据TraceView分析具体函数花了多长时间来进一步优化代码提高性能。

代码中添加标记生成 trace log

  由于systrace是在系统级显示有关进程的信息,因此很难在HTML报告中的某个特定时间知道您的应用程序正在执行什么方法。 在Android 4.3(API级别18)及更高版本中,您可以使用代码中的Trace类在HTML报告中标记执行事件。 您不需要用代码来记录systrace的跟踪记录,但是这样做可以帮助您查看应用程序代码的哪些部分可能会导致线程挂起或UI断线。这种方法与使用Debug类不同,Trace类简单地将标志添加到systrace报告中,而Debug类可帮助您通过生成.trace文件来检查详细的app CPU使用情况。 要生成包含已检测的跟踪事件的systrace HTML报告,需要使用-a或--app命令行选项运行systrace,并指定应用程序的包名称。 通常我们在怀疑引起jank代码地方,添加如下内容: Trace.beginSection("MyAdapter.onCreateViewHolder"); Trace.endSection();  这两个方法需要在同一个线程中成对出现,否则多次调用beginSection(String)时,调用endSection()只会结束最近调用的beginSection(String)方法。

 
使 用TraceView 分析trace Log

  Traceview是提供跟踪日志的图形工具。您可以通过使用Debug类来设置代码来生成日志。 这种跟踪方法非常精确,因为您可以准确指定要启动的代码中的哪个位置,并停止记录跟踪数据。 如果尚未生成这些跟踪日志并将其从连接的设备保存到本地计算机,请转至通过检测应用程序生成跟踪日志。 使用Traceview检查这些日志可帮助您调试您的应用程序并剖析其性能。

  如果您不需要查看通过使用Debug类检测应用程序来记录的跟踪日志,则可以使用Android Studio 3.0及更高版本中包含的CPU分析器来查看应用程序的线程和记录方法跟踪。使用Android Device Monitor可以查看trace Log内容,

  提示:可以使用命令行中的dmtracedump来生成跟踪日志文件的图形调用堆栈图。

  打开跟踪日志后,Traceview使用以下两个窗格显示日志数据:

    1. 时间轴窗格:
      描述每个线程何时进入和退出方法的时间轴窗格
    1. 配置文件窗格:
      总结每个线程在跟踪日志的执行期间的配置文件窗格
      以下各节提供有关traceview输出窗格的附加信息。

1.时间轴窗格

  每个线程的执行都显示在自己的进程中,并且时间向右增加。 每种方法都以不同的颜色显示。 第一行下方的细线显示所选方法的子项(从入口到出口),如下图所示。

 

2. 配置文件窗格

  如下图所示,配置文件窗格提供了系统在跟踪日志期间执行的每种方法的列表以及执行这些方法所用的时间。调用另一个方法的方法称为父级方法,父级调用的方法称为其子级。 当您通过单击方法选择一种方法时,它会在两个单独的节点下显示其父项和子项。对于每种方法(顶级节点),该表都显示包含和排他时间(以毫秒为单位)以及总时间的百分比。独占时间是执行方法自己的代码的时间,而包含时间是执行方法自己的代码的时间加上执行子程序的时间。定时信息也以CPU时间和实时的方式报告。 CPU时间只考虑线程主动使用CPU时间的时间,实时提供绝对时间信息,从您的应用程序进入方法的时刻到退出该方法的时间 - 无论线程处于活动状态还是休眠状态。

  对于配置文件窗格中的每个顶级节点,表中的Calls + RecCalls / Total列(图2中未显示)将报告该方法的调用次数和递归调用次数。或者,对于父级和子级方法,此列显示方法在顶级节点中是方法的子级或父级的调用次数。

 
 


-end-

猜你喜欢

转载自www.cnblogs.com/blogs-of-lxl/p/10926824.html