---
layout: post
title: 工具篇-TraceView 
description: 让我们远离卡顿和黑屏 2015-10-09
category: blog
---

## 让我们远离卡顿和黑屏##

### 一、与Traceview的不得已de 相逢 ###
当我们被山一样的业务需求压倒喘不过气的时候,经常就有人跑到你身边说

为什么某个页面的启动速度那么慢?
        为什么这台手机app的启动速度那么慢?
        为什么滑动在有些手机上会出现卡顿?
        为什么*****那么慢?

早期我们使用了疑问句的回复:

1. 内存不够?
        2. 一定是手机不好吧?
        3. 我的手机明明不会啊!!
        4. 可是别的应用不会卡,UI也没我们复杂

其实我们内心很清楚,一定是哪里出bug了
刚开始的时候使用了很土的打点的办法来查看每个方法执行的时间,天真的以为可以轻松解决这个问题,恩,果然很天真,写了N多的打点,效果不明显,也就是-并没有什么卵用了,猿类生存环境进一步恶化。
接着开始了google,性能分析的工具traceview渐渐浮出水面。

### 二、 ^-^ Traceview 毫无保留的付出和帮助 ^-^ ###
1. **开始使用traceview**
    
    **(1) 场景一**

我们需要查看某段代码的执行时间消耗在什么地方,那么我们就可以这么写:
    
    代码开始时执行:
    ```java
    android.os.Debug.startMethodTrace(String tracename);```
    >这是trace文件名称,如果你写trace_home,生成的文件名就是trace_home.trace

代码结束时执行:
    ```java
    andoird.os.Debug.stopMethodTrace();    ```

完了之后启动app,让这段代码执行完毕,此时,trace文件已经在你的sdcard目录下,然后执行
    ```java
    adb pull /sdcard/trace_home.trace;```
    会将此文件pull到你的用户目录下,也就是Administrator文件夹下。    
    
    打开方式:可以使用
    ```java 
    traceview trace_home.trace```或者打开TraceView工具来打开这个文件
    
    **(2) 场景二**

我们并不知道耗时是在哪段代码,我们只知道这个页面滑动比较卡,那么我们可以这么做:

打开Android Device Monitor,选择进程,点击start Method Profiling

![](http://i.imgur.com/WNy4HXN.jpg)

当其变为黑色时候说明已经开始采集数据,此时滑动之前认为卡顿的页面,停止后,再点击一次进行停止,此时会自动跳转到traceview页面,页面如下:
    ![](http://7xnby9.com1.z0.glb.clouddn.com/trace_view_overview.jpg)
    
    至此,我们已经揭开了造成卡顿的幕后黑色的神秘的面纱。

2. **traceview参数分析-找到我们想要的**

抛一个问题:我们想要的是什么?是我们的具体业务代码执行了多少时间;
    然而从上图里,我们几乎看不出业务代码在哪里,所以,我们开始找,在这之前解释一下下面这几个参数:
    
    (1)上图的上左边区域:是指线程的名称和数量,这里可清楚的看到运行着哪些线程,如main指主线程,Picasso-Idea是Picasso线程;
    
    (2)上图的上右边区域:是指对应线程所分到的cpu执行时间和具体的执行方法,所有黑色区域的底部边缘都有对应的颜色对应这上图底部区域总具体的某个执行方法;
    
    (3)上图的底部区域:罗列了此次统计执行时间和对应的执行方法,这是我们要重点分析的对象;先熟悉几个重要的指标:
    
        a:toplevel是顶级节点
            可以从这里一级一级看到有哪些子节点执行了了什么;
            以及每个子节点执行的时间;
            此节点的之后每个节点都有Parent和Children两个分支;
            是字面上的意思,可以追溯到父节点和子节点
        b: Incl Cpu Time %是指总时间的百分比
        c: Incl Cpu Time 是指占用了多少时间(毫秒); 
        d: Calls+RecurCalls/Total指调用次数+递归次数/总数 
        e: Cpu Time/Call 每执行 一次该方法消费的时间(毫秒)
        
3、**具体分析**

上图中底部区域图如下:(MDP抽风,上传不了图了- -,一定是代理坏了,口头描述吧)
        
(1)展开0(toplevel)如下图
![](http://7xnby9.com1.z0.glb.clouddn.com/top_level.jpg)
    
(2)上图检测到的5718ms主要消耗在Thread.run和NativieStart.main这两个上面,我们主要来看一下main里边做了什么东西,一直点击main的childeren直到这里:
![](http://7xnby9.com1.z0.glb.clouddn.com/main_fenbu.jpg)
    
(3)这里开始出现了时间分布,TraversalRunable跟踪下去是计算绘制和实际绘制的时间,无法跟踪到业务代码,这部分的优化需要对布局优化,检查过度绘制;
我们我们主要看一下FlingRunnable做了什么,继续狂戳children直到这里:
![](http://7xnby9.com1.z0.glb.clouddn.com/fling_final.jpg)
    
(4)好了,业务代码全部都出现了,哪个方法调用了多少次,消耗了多少时间,一目了然;在这里,我们发现:

getview调用了22次,消耗时间690ms
        getview 每次执行时间 31ms;时间越短性能越好
        fillResource()调用了22次,消耗了192ms
        handleOtherType()调用了19次,消耗190ms
    
(5)这里调试的手机是魅蓝note,感觉稍微有点卡,不是很明显;从上边参数有两个优化点:

a:fillResource()改为只执行一次
    b:handleOtherType的时间主要是消耗在:
      SkineEngine每次都执行了getResource()重新拿资源转为Drawable或者bitmap的缘故,
      需要对SkinEngine的资源ID和Drawable做缓存,可大量减少IO时间;
![](http://7xnby9.com1.z0.glb.clouddn.com/handleSetOther.jpg)

Done
----------
blog:http://iceAnson.github.io

http://iceanson.github.io/tool-traceview/

工具篇-TraceView的更多相关文章

  1. 工具篇-MAT(Memory Analyzer Tool)

    --- layout: post title: 工具篇-MAT(Memory Analyzer Tool) description: 让内存泄漏无所遁形 2015-10-08 category: bl ...

  2. 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档

    对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...

  3. css,js工具篇

    4. web前端开发分享-css,js工具篇   web前端开发乃及其它的相关开发,推荐sublime text, webstorm(jetbrains公司系列产品)这两个的原因在于,有个技术叫emm ...

  4. 大数据工具篇之Hive与MySQL整合完整教程

    大数据工具篇之Hive与MySQL整合完整教程 一.引言 Hive元数据存储可以放到RDBMS数据库中,本文以Hive与MySQL数据库的整合为目标,详细说明Hive与MySQL的整合方法. 二.安装 ...

  5. 大数据工具篇之Hive与HBase整合完整教程

    大数据工具篇之Hive与HBase整合完整教程 一.引言 最近的一次培训,用户特意提到Hadoop环境下HDFS中存储的文件如何才能导入到HBase,关于这部分基于HBase Java API的写入方 ...

  6. Linux工具XFTP、Xshell(centos配置java环境 工具篇 总结一)

    ♣Xmanager5是什么? ♣安装XFTP ♣安装Xshell 1.Xmanager5(官网:https://www.netsarang.com/download/software.html)是全新 ...

  7. 工具篇之GIT知识整理(一)

    目录 项目工具篇(一)GIT 说在前面 背景 与其他版本控制产品对比 Git下载地址及安装 下载地址 安装 在案例中简单使用Git命令 git clone git log git diff git c ...

  8. Caffe学习系列——工具篇:神经网络模型结构可视化

    Caffe学习系列——工具篇:神经网络模型结构可视化 在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py ...

  9. spring boot 学习(九)小工具篇:?秒防刷新

    注解 + 拦截器:?秒防刷新 小工具篇:工具许多都是我以前在 github 之类开源平台找到的小工具类,作者的信息什么的许多都忘了.先说声不好意思了.若有相关信息,麻烦提醒一下~ 解释 所谓的?秒防刷 ...

随机推荐

  1. codeforces 631D. Messenger kmp

    题目链接 首先想到kmp, 和普通的不一样的是,中间部分严格相等, 头和尾的字符相等但是数量可以不相等. 所以应该把子串的头和尾先去掉,然后对剩下的部分进行kmp. 子串长度为1或2要特别讨论. 不要 ...

  2. poj 1091 跳骚

    /** 题意: 求对于小于m的n个数, 求x1*a1 + x2*a2+x3*a3........+xn*an = 1 即求 a1,a2,a3,....an 的最大公约数为1 , a1,a2....an ...

  3. 一个好用的hash函数(C语言)

    typedef unsigned int DWORD; typedef unsigned char BYTE; /******************************************* ...

  4. checkbox 全选反选实现全代码

    //跳转到指定action function validateForm(url){ if($("#form").form('validate')){ var x=document. ...

  5. 升级automake和autoconf

    <pre name="code" class="html">zjtest7-redis:/root/soft/json-c-json-c-0.12- ...

  6. Azure 网站上的 Java

     编辑人员注释:本文章由Windows Azure 网站团队的项目经理Chris Compy 撰写. Microsoft 已推出针对 Azure 网站上基于 Java 的网站的支持.此功能旨在通过 ...

  7. HDU 3501 Calculation 2

    题目大意:求小于n的与n不互质的数的和. 题解:首先欧拉函数可以求出小于n的与n互质的数的个数,然后我们可以发现这样一个性质,当x与n互质时,n-x与n互质,那么所有小于n与n互质的数总是可以两两配对 ...

  8. openstack windows 2008 img

    1,制作镜像主机pre Env yum -y install qemu-img virt-install libvirt 2,配置bridge

  9. 使用ssh无密码登录

    使用ssh无密码登录 ssh 是一个专为远程登录会话和其他网络服务提供安全性的协议.默认状态下ssh链接是需要密码认证的,可以通过添加系统认证(即公钥-私钥)的修改,修改后系统间切换可以避免密码输入和 ...

  10. Nothing2

    重压下似乎找不到释放的出口. 拳套早已封存, 竹箫也非常久不去碰它, 如今预计已然吹不出心弦之曲, 围棋的造诣也退步到家了. 是不是仅仅有当思路电光石火, 当指尖快如闪电, 当键盘上舞动的手指跟上思想 ...