Android性能优化第(六)篇---TraceView 分析图怎么看

版权声明:本文为LooperJing原创文章,未经博主允许不得转载!

Android性能优化系列好久没有更新了,一直在写Android源码解析的部分,附上前面性能优化文章的链接。

Android性能优化第(一)篇---基本概念
Android性能优化第(二)篇---Memory Monitor检测内存泄露
Android性能优化第(三)篇---MAT比Menmery Monitor更强大
Android性能优化第(四)篇---AndroidUI的渲染机制
Android性能优化第(五)篇---Allaction Tracing追踪内存分配的轨迹

现在废话不多讲,直接开车了。TraceView是什么,TraceView 是 Android 平台特有的数据采集和分析工具,主要用做热点分析,找出最需要优化的点。TraceView 从代码层面分析性能问题,针对每个方法来分析,比如当我们发现我们的应用出现卡顿的时候,我们可以来分析出现卡顿时在方法的调用上有没有很耗时的操作,通过TraceView,可以得到两种数据。

  • 单次执行最耗时的方法
  • 执行次数最多的方法
TraceView

要打开上面的面板,一般有两种方式

1、第一种方式

首先选择跟踪范围,在想要根据的代码片段之间使用以下两句代码

   Debug.startMethodTracing(“hello”);

   Debug.stopMethodTracing();

生成的traceview文件会自动放在SDCARD上,没有SDCARD卡会出现异常,所以使用这种方式需要确保应用的AndroidMainfest.xml中的SD卡的读写权限是打开的,其中hello是traceview文件的名字,是然后用adb导出traceview文件。

adb pull sdcard/hello.trace    C:\Users\wangjing\Desktop

然后启动Android Device Monitor-->File-->openFile,打开traceview文件即可。

2、第二种方式

同样是要先打开Android Device Monitor


先选择应用进程,然后点击Start Method Profiling(开启方法分析),按钮会变为Stop Method Profiling(停止方法分析),开启方法分析后,对应用的目标页面进行测试操作,测试完毕后停止方法分析,界面会自动跳转到 DDMS 的 trace 分析界面。

两种方式的对比:第一种方式更精确到方法,起点和终点都是自己定,不方便的地方是自己需要添加方法并且要导出文件,第二种方式的优缺点刚好相反。

2、分析方式

下面写一个DEMO,来分别模拟调用次数不多,但每次调用却需要花费很长时间的函数,和自身占用时间不长,但调用却非常频繁的函数。


public class MainActivity extends Activity {
    int count = 0;
    long longCount=-1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Debug.startMethodTracing("hello");

       //线程1
        new Thread(new Runnable() {
            @Override
            public void run() {
                printNum();
            }
        },"printNum_thread").start();
       //线程2
        new Thread(new Runnable() {
            @Override
            public void run() {
                calculate();
            }
        },"calculate_thread").start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Debug.stopMethodTracing();
    }

    private void printNum() {
        for (int i = 0; i < 20000; i++) {
            print();
        }
    }

    /**
     * 模拟一个自身占用时间不长,但调用却非常频繁的函数
     */
    private void   print(){
        count=count++;
    }

    /**
     * 模拟一个调用次数不多,但每次调用却需要花费很长时间的函数
     */
    private  void  calculate(){
        for (int i = 0; i < 1000; i++) {
            for (int j = 0; j < 1000; j++) {

                    for (int l = 0; l < 1000; l++) {
                        if(longCount>10){
                            longCount=-10;
                        }
                    }

            }
        }
       Log.e("MainActivity",String.valueOf(longCount));
    }
}

现在来分析一下采集的数据。先看线程面板


线程面板

在线程面板上发现我们应用中的三个线程,main线程,这个线程是都会有的,还有printNum_thread,calculate_thread两个线程。

再看时间线面板

时间线面板

时间线面板以每个线程为一行,右边是该线程在整个过程中方法执行的情况,一行中有很多的小色块。这些色块代表采集过程中方法调用时间线,相同的颜色代表相同的方法,其中的每一个小色块就代表一次方法的调用,色块的长度代表方法执行时间的长短,左边为第一个色块代表方法执行开始,最右边色块代表最后一个方法执行结束,有时候可以根据色块长度来做个大致判断,哪一个方法执行时间相对来说比较长,你可以把鼠标放到色块上,就会显示该方法调用的详细信息,你可以随意滑动你的鼠标,滑倒哪里,左上角就会显示该方法调用的信息,并且可以按住CTRL键加鼠标滚轮进行放大。如下图。

方法调用信息

比如我放大后,现在鼠标停在一个红色的方块上,这个红色的方块是在printNum_thread线程条上,左上角显示了这个色块代表的是MainActivity的printNum方法,在0.883的时候调用了这个方法,下面还有一些详细时间信息,下面细说。如果想回到最初的状态,双击时间线就可以。

最后看一下数据分析面板,在数据分析面板,你可以点击某个函数展开更详细的信息

数据分析面板

展开后,大多数有以下两个类别:

  • Parents:调用该方法的父类方法
  • Children:该方法调用的子类方法
    如果该方法含有递归调用,可能还会多出两个类别:
  • Parents while recursive:递归调用时所涉及的父类方法
  • Children while recursive:递归调用时所涉及的子类方法

至于数据分析面板红色框中,各个字段的含义如下:


开发者最关心的数据有:
很重要的指标:Calls + Recur Calls / Total , 最重要的指标: Cpu Time / Call
因为我们最关心的有两点,一是调用次数不多,但每次调用却需要花费很长时间的函数。这个可以从Cpu Time / Call反映出来。另外一个是那些自身占用时间不长,但调用却非常频繁的函数。这个可以从**Calls + Recur Calls / Total **反映出来。

点击Calls + Recur Calls这一栏,可以按照方法调用次数排序,如下图,可以看出print方法执行了2000次。


调用次数最多

点击Cpu Time / Call这一栏,可以按照方法调用时间排序,如下图,


占用CPU时间最多

可以看到calculate方法执行了13s多,非常的耗时。

这是模拟的两个极端的情况,实际情况下,分析的难度比较大,但是当体验卡顿的时候,我们可以借助TraceView来定位问题。所以TraceView虽说不常用,但是还是很有意义的!

参考链接:

Please accept mybest wishes for your happiness and success !

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,563评论 25 707
  • 一、关于App性能优化 1. 性能优化分类 Google官方给出的性能优化教程,主要分为以下几类:1)布局与UI渲...
    cszhangchao阅读 1,823评论 0 6
  • 导语 随着Android应用增多,功能越来越复杂,布局也越来越丰富了,而这些也成为了阻碍一个应用流畅运行,因此,对...
    一个有故事的程序员阅读 810评论 2 9
  • 01 前几天走了一趟北京,听到两个“现象级”的女性名字,和其中一个作了深入交流,另一个据说有交往自闭症,一走红就躲...
    干国祥备课老干阅读 7,329评论 15 28
  • 5.取得的成绩 a.新乡往返启动完毕! b.洛阳往返甩挂正在洽谈中! c.南阳线路末端已谈好,准备11月初正式启动...
    冯斌2018阅读 133评论 0 0