暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

性能分析工具——Systrace

周末随心分享 2021-08-15
2855

背景

什么是Systrace?

Systrace是Android4.1引入的性能分析工具。利用ftrace,在系统关键位置都有埋点,主要用于分析系统调用耗时问题,可以自定义trace标签来细化调用栈


为什么要用Systrace,像腾讯的PerfDog不香吗?

原因有以下几点:

  • PerfDog这种软件能直观的查看CPU、GPU、内存等数据,比较适合用来做内存泄漏分析或者帧率的测试,但是对CPU具体使用情况是无法细化的,而systrace可以查看手机全部CPU每时每刻的占用情况,从而发现哪些时刻的CPU比较空闲或者太忙碌

  • 想象一下,如果你要排查项目中主线程耗时情况,你会怎么做呢?可选的方法是可以写个基于asm的插件来为每个方法进行插桩,不过这样一方面需要额外的人力消耗,另一方面不够直观,因为你最多只能发现耗时点,但是不知道当时的环境以及其他相关耗时。

    这时候systrace就有优势了,它可以直观的展示出比较耗时的方法以及里面的相关调用,而且也不需要你额外编写什么插件,最好的方式是systrace与插桩的结合,这样能快速定位问题



使用简介

systrace命令

    python systrace.py [options] [category1] [category2] ... [categoryN]

    样例:

      systrace_path=“/xxx/Android/sdk/platform-tools/systrace/systrace.py" 
      python $systrace_path -a “com.test.myapplication” -o trace.html gfx input view wm am dalvik

      可以看到systrace是Android SDK自带的工具,所以不用担心更新和维护问题,可以放心使用,不过目前systrace命令只能用Python2执行,暂不支持Python3


      下面针对上面命令进行几点说明:

      1)option可取值

      注意一般分析启动耗时-t设置为5到10秒,太长需要设置-b大小,-b默认2MB


      2)category可取值:

      由于category取值情况较多,上面只列出一些,有兴趣的小伙伴可以去官网查询完整的,从上面命令可以看出,systrace提供了非常丰富的性能种类,可以根据自己需要来选择相关category,一般情况下我们主要监听主线程和CPU情况,所以像input、view、am、wm、dalvik、sched是比较常用的



      具体场景分析

      1、Systrace执行后的产物:


      以上图为例进行分析:

      • 先看一下左边栏目,左边是一些具体的性能种类,我们一般是先找到对应的进程名,每个进程下面有一系列信息,比如上面的UI Thread就是我们关心的,注意如果要抓取OpenGL渲染信息,需要先在手机上进入Developer options->Enable OpenGL traces,选择Systrace(Graphics)

      • 接着定位到具体栏目,开始查看右边信息,上图右边是UI线程相关情况,这里我们抓取的是应用启动5秒内的信息,最上面是时间轴,中间那些五颜六色的就是具体的调用方法以及耗时信息,颜色越深代表越耗时

      • 快捷键介绍,如何查看信息,这边介绍几个快捷键,分别是a、d、w、s,和游戏使用的按键有点像,分别代表左移、右移、放大、缩小。第一次使用应该很多人不知道这个快捷键

      • 接着看下面部分,下面部分是你选择具体某个调用方法后展示的相关信息,里面有这个调用方法的介绍,耗时信息以及一些描述,比如我们可以看到像bindApplication这些系统方法,这个就代表了应用启动阶段走到了Application初始化这边,从上往下分别是该方法的调用栈,越往下越具体,比如下面这个:

        上面是点击了框中位置的方法调用,然后下面就显示了该方法具体信息,可以看出是我们的一个类对象创建,Wall Duration代表持续时间,即该方法总耗时,CPU Duration代表CPU耗时,还有个Self Time代表自身方法耗时,不包含其调用方法。比如分析耗时原因可以看是否Wall Duration远大于CPU Duration,如果是就说明耗时来自于等待CPU被释放,这时可以去看哪个任务占据了大量CPU时间

      • CPU信息查看

        以上图为例,我们可以清楚看到该手机八个CPU核的占用情况,和上面方法视图类似,也是用颜色来代表耗时情况,白色就是空闲状态,像我们做启动优化就可以根据CPU的空闲状态来重新分配每个时间段的代码调用,这样就能充分利用CPU,又能避免CPU高负载导致的ANR


      2、打桩

      先来看段代码:

        private boolean flag = true;
        private static Handler mHandler = new Handler();
        @Override
        public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if(hasFocus && flag) {
        flag = false;
        mHandler.post(new Runnable() {
        @Override
        public void run() {
        Trace.beginSection("endTime");
        SystemClock.sleep(500);
        Trace.endSection();
        }
        });
        }
        }

        如上图,如果要具体分析某个方法耗时,可以通过Trace.beginSection来打桩(beginSection和endSection要成对出现并在同一个线程),这样systrace产物中就能出现"endTime"代码块,如下图:



        总结

        • systrace可以查看系统相关api调用情况,它相比插桩来说是无法具体到每个方法,但是可以提供一个全局的性能数据,然后你可以根据定位到的具体对象来进一步排查就能解决大部分问题

        • systrace提供了很多性能选项,并且视图里面以时间为横轴记录了完整的代码执行过程,可以清晰看到CPU占用和每个对象的创建过程,可以做为性能优化的参考依据

        • systrace结合插桩可以做到先定位具体对象,再看对象具体方法耗时的操作流程,建议作为性能优化的必备工具



        好了,今天的分享就到这了,下周继续~

        文章转载自周末随心分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论