精华内容
下载资源
问答
  • TraceView工具分享

    2018-09-07 16:04:37
    TraceView工具分享,今天头一次碰见这个错误,说我缺这个工具发现咱们这个都要蛮多分的就去自己的电脑里检索了一下 还真有一个
  • TraceView工具如何使用

    千次阅读 2017-10-12 20:53:07
    TraceView工具如何使用

    一、TraceView工具如何使用

    TraceView有4种启动/关闭分析方式:

    (1) 第一种使用方法演示

    1、 选择跟踪范围

    在想要根据的代码片段之间使用以下两句代码:

    Debug.startMethodTracing("love_world_");
    Debug.stopMethodTracing();

    例如,onCreate与onStart方法之间方法跟踪

    public class MainActivity extends Activity {  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
              
            Debug.startMethodTracing("Love_World_");  
        }  
      
        @Override  
        protected void onStart() {  
            super.onStart();  
              
            Debug.stopMethodTracing();  
        }  
          
    }  

    2、添加SD卡访问权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>    

    如果不添加,执行项目会出现以下异常

    java.lang.RuntimeException:Unable to open trace file '/mnt/sdcard/Love_World_.trace': Permission denied  

    如果手机没有SD卡也会出现同样的问题

    3、 导出traceview文件

    1  首先执行项目,查看trace文件是否生成

    进入shell模式

    adb shell  

    查看是否已经生成这个文件

    ls sdcard/Love_World_.trace  

    2 导出trace文件

    adb pull sdcard/Love_World_.trace

    4、 打开trace文件

    打开trace文件需要Android提供的traceview.bat工具,工具所在目录:sdk\tools\traceview.bat, 有两种方式执行:
    1. 在命令行中切换到此目录
    2. 将此目录添加到系统环境变量中
    //  cmd在calc.trace所在目录执行  
    traceview C:\Users\YourName\Desktop\Love_World_.trace  

    其中“C:\Users\YourName\Desktop\” 表示trace所在你系统中的目录,此工具需要输入trace文件的绝对路径才行

    在新版本的SDK 会有以下提示:

    The standalone version of traceview is deprecated.  
    Please use Android Device Monitor (tools/monitor) instead.  

    所以建议使用tools/monitor 启动后跟Eclipse DDMS界面差不多,然后File -> Open File -> 选择trace文件

    5、异常处理

    1 异常处理
    'C:\Windows\system32\java.exe' 不是内部或外部命令,也不是可运行的程序  
    或批处理文件。  
    SWT folder '' does not exist.  
    Please set ANDROID_SWT to point to the folder containing swt.jar for your platfo  
    rm.  

    2 异常信息
    The standalone version of traceview is deprecated.  
    Please use Android Device Monitor (tools/monitor) instead.  
    Failed to read the trace filejava.io.IOException: Key section does not have an *  
    end marker  
            at com.android.traceview.DmTraceReader.parseKeys(DmTraceReader.java:420)  
            at com.android.traceview.DmTraceReader.generateTrees(DmTraceReader.java:91)  
            at com.android.traceview.DmTraceReader.<init>(DmTraceReader.java:87)  
            at com.android.traceview.MainWindow.main(MainWindow.java:286)  

    通常是trace文件有异常,再重新生成并导出试试

    3. 没有SD卡会出现异常
    Unable to open trace file '/sdcard/Love_World_.trace': Permission denied  
     Caused by: java.lang.RuntimeException: Unable to open trace file '/sdcard/Love_World_.trace': Permission denied  

    生成的trace系统自动放在SDCARD上,没有sd卡所以会出现这种异常

    (2)  第二种使用方法演示

    Eclipse -> DDMS -> Start Method Profiling

    二者的区别,第一种方式更精确到方法,不方便的地方是自己需要添加方法并且要导出文件,第二种方式的优缺点刚好相反。

    (3) 任意时间点启动与关闭trace

    启动:am profile <PROCESS> start <FILE>
    关闭:am profile <PROCESS> stop

    <PROCESS> 填写进程名,例如AndroidManifest.xml中声明的包名,通常都是主进程名

    例如:  
    adb shell am profile com.example start ./mnt/sdcard/test.trace

    adb shell am profile com.example stop

    (4)  启动指定Activity并进行trace

    am start -n <Package Name>/<Package Name>.<Activity Name> --start-profiler <FILE>
    例如:
    adb shell am start -n com.example/com.example.MainActivity --start-profiler ./mnt/sdcard/test.trace

    细节详见官方文档:
    http://developer.Android.com/tools/help/shell.html

    二、 TraceView工具面板介绍

    有两方面用途: 
    1  查看跟踪代码的执行时间,分析哪些是耗时操作  
    2  可以用于跟踪方法的调用,尤其是android Framework层的方法调用关系

    获取方法的调用顺序
    1. 在traceview中搜索响应的方法名不能使用大写字母
    2. 搜索出的方法会自动展开,其中包含Parents 和 Children 两组信息
    3. 点击Parents下的方法名,直接跳转到调用当前的方法处。Children相反



    Traceview 面板分上下两部分
    上面是时间轴面板 (Timeline Panel)
         左侧显示的是线程信息
         右侧黑色部分是显示执行时间段、白色是线程暂停时间段,
         右侧鼠标放在上面会出现时间线纵轴,在顶部会显示当前时间线所执行的具体函数信息
    下面是分析面板(Profile Panel) -  每一列内容

    Inclusive time  - 函数本身运行花费时间 + 函数调用其他函数时间

    Exclusive time - 函数本身运行花费时间。

    Calls + RecurCall/Total 调用 + 重复调用次数 / 函数总调用次数

    Cpu Time/Call 总的Cpu时间与总的调用次数之比

    1-1  Profile Panel各列作用说明

    列名

    描述

    Name

    该线程运行过程中所调用的函数名

    Incl Cpu Time

    某函数占用的CPU时间,包含内部调用其它函数的CPU时间

    Excl Cpu Time

    某函数占用的CPU时间,但不含内部调用其它函数所占用的CPU时间

    Incl Real Time

    某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间

    Excl Real Time

    某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间

    Call+Recur Calls/Total

    某函数被调用次数以及递归调用占总调用次数的百分比

    Cpu Time/Call

    某函数调用CPU时间与调用次数的比。相当于该函数平均执行时间

    Real Time/Call

    CPU Time/Call类似,只不过统计单位换成了真实时间




    三、如何进行具体的分析

    有两个问题需要解决:

    1. 如何定位到所关心的地方? 
    上面只是介绍了如何使用TraceView且有两种用法,但是有时使用第一种方式范围又不太精确,使用第二种添加代码的方式,可能有些地方又监听不到。这种情况可以尝试把开始或者结束放到延迟线程中,延迟一段时间在执行开始或者结束。

    2. 如何查找出哪些地方比较耗时?
    TraceView罗列出了是所有监听到的方法,当然也包括Android系统很多方法的耗时,如何在这么多方法里面查找到自己关心的? 可以通过TraceView 底部的find 来查找,通常Android app都是有包名的,可以先针对某些关心的列排序后,在通过包名进行一个个查找,这些就省去自己筛选出自己app 方法耗时排行的时间。

    四、 相关资料:

    Android系统性能调优工具介绍 (还有具体如何使用进行性能分析的例子,非常棒)

    展开全文
  •            正确姿势使用TraceView工具    在对手机应用性能分析和定位的过程中Traceview是使用最多的一个工具,在遇到启动时间长界面切换时间长特别卡顿的时候Traceview是首选工具。如果查看界面的帧率...

               正确姿势使用TraceView工具

       在对手机应用性能分析和定位的过程中Traceview是使用最多的一个工具,在遇到启动时间长界面切换时间长特别卡顿的时候Traceview是首选工具。如果查看界面的帧率问题建议还是先使用GPU配置文件以列表的形式展示在屏幕上这样可以首先发现这个界面的帧率是否有问题再做后续的排查。



    如何开启TraceView

       Traceview是Android平台特有的数据采集和分析工具它主要用于分析Android中应用程序的性能问题。Traceview本身只是一个数据分析工具而数据的采集则需要使用Android SDK中的Debug类或者利用DDMS工具。二者的用法如下:
    (1) 通过代码开启:

    android.os.Debug.startMethodTracing();
    ...
    android.os.Debug.stopMethodTracing();
    

    就是使用如上代码方法,当运行了这段代码的时候,就会有一个trace文件在/sdcard目录中生成,也可以调用startMethodTracing(String traceName) 设置trace文件的文件名,最后你可以使用adb pull /sdcard/test.trace /tmp 命令将trace文件复制到你的电脑中,然后用DDMS工具打开OK了。

    (2)通过DDMS工具
       借助Android SDK中的DDMS工具。DDMS可采集系统中某个正在运行的进程的函数调用信息。对开发者而言此方法适用于没有目标应用源代码的情况(且必须应用源代码没有设置android:debuggable=“false”,否则也是望洋兴叹,无能为力了,可以修改固件另外一说 啊)。DDMS工具中Traceview的使用如图所示,主要是使用"Start Method Profiling"按钮进行相关的操作:

    在这里插入图片描述
    在做性能分析的过程中基本都是采用DDMS工具中来启动TraceView这样简单易用随便哪个地方的代码都可以跟踪。在对android 4.4以上手机点击TraceView按钮的时候会出现2种方式的选择对话框如下所示:
    在这里插入图片描述
    (1)、Sample based profiling以固定的频率像VM发送中断并搜集调用栈信息。低版本手机也是采用该方式来采集样本的默认是1毫秒采集一次。精确度和采集的频率有关间隔频率越小会越精确但运行也会相应的更慢。
    (2)、Trace based profiling不论多小的函数都会跟踪整个函数的执行过程所以开销也会很大。运行起来会非常的慢不适合检测滑动性能。
    一般情况用第一种默认1000微妙的间隔就足够了。
    另外在Eclipse中或者Android Studio中启动的DDMS中的这个工具搜索功能不能使用如果要使用搜索功能可以通过Android SDK tools下的命令行来启动这样就可以搜索了。



    TraceView面板介绍

    在这里插入图片描述
       通过前面的篇章,我想读者朋友们一定对TraceView的功能和启动方式有了一定的了解,那么下面我们来介绍一下其面板和及其功能,Traceview其UI划分为上下两个面板即Timeline Panel和Profile Panel,下面分别进行介绍:
    Timeline Panel:左边是测试数据中所采集的线程信息右边Pane所示为时间线时间线上是每个线程测试时间段内所涉及的函数调用信息。内容的丰富代表该时间段执行的函数多从而可以反应线程的繁忙状态。也可以看出线程的启动时间和结束时间等。
    Profile Panel是Traceview的核心界面其内涵非常丰富。它主要展示了某个线程先在Timeline Panel中选择线程中各个函数调用的情况包括CPU使用时间、调用次数等信息。而这些信息正是查找性能瓶颈的关键依据。
    另外开发者可以在时间线Pane中移动时间线纵轴。纵轴上边将显示当前时间点中某线程正在执行的函数信息。
    另个面板之间也是互相联动的点击下面的函数可以在时间轴上显示对应的位置。如上图。点击时间线上的函数位置则可以展开对应Profile Panel的函数行数。在时间线上拉伸可以放大时间线双击顶部的时间条区域可以缩小会原始状态。
    点一个方法后可以看到有两部分,一个是Parents,另一个是Children。

    • Parent表示调用这个方法的方法,可以叫做父方法

    • Children表示这个方法中调用的其他方法,可以叫做子方法


    Profile Panel中各列的含义。如下表所示:

    列名 描述
    Name 该线程运行过程中所调用的函数名
    Incl Cpu Time 某函数占用的CPU时间包含内部调用其它函数的CPU时间
    Excl Cpu Time 某函数占用的CPU时间但不含内部调用其它函数所占用的CPU时间
    Incl Real Time 某函数运行的真实时间以毫秒为单位内含调用其它函数所占用的真实时间
    Excl Real Time 某函数运行的真实时间以毫秒为单位不含调用其它函数所占用的真实时间
    Call+Recur Calls/Total 某函数被调用次数以及递归调用次数/总调用次数
    Cpu Time/Call 某函数调用CPU时间与调用次数的比。相当于该函数平均执行时间
    Real Time/Call 同CPU Time/Call类似只不过统计单位换成了真实时间


    TraceView实际案例分析

       了解完Traceview的基本信息后现在介绍如何利用Traceview来查找性能问题。让我们来浪一把,分析分析各种问题。


    1、直接查看帧率和渲染情况

    如上面的TraceView图面板所示显示了Draw函数的执行情况。在时间线上可以看到前面部分间隔平滑且时间比较短到中间部分开始就开始中断执行时间也明显拉长。说明出现了丢帧等情况通过放大时间线可以查看执行时间较长的draw函数中每一个函数的执行情况从而发现问题。


    2、了解函数前后的路径和执行情况

    Profile Panel面板的函数有Parents和Chindren对于部分有递归调用的函数还会有Parents while recursive和Chindren while recursive。通过点击Parents和Chindren的各个函数用于跟踪性能问题也能了解这个函数的来龙去脉。以及几个Parents调用了该函数每个Parents调用的次数。该函数自己的执行时间以及各个Chindren和他们的执行时间以及本函数Chindren中用到的某个函数A占据所有调用该函数A的分布比例情况。
    在这里插入图片描述


    3、找出函数所在的线程分布

    Profile Panel面板的函数点击后在对应上面部分函数时间线上会有相应的指示如下面的括号上下的颜色标记符号该颜色标记符号和Profile Panel面板中的该函数前面的方块颜色对应。如下图Logger.isLoggable函数点击后从时间线上看到了在main线程和Thread-3191线程中的分布情况。

    在这里插入图片描述


    4、CPU定位高负荷函数

    通过Incl Cpu Time排序就可以轻松发现cpu被哪些函数占用了。

    在这里插入图片描述)


    5、查找主线程耗时

    通过Incl Cpu Time排序可以找到相对耗时的函数在函数排序的面板中选中该函数如果在Main线程中底部某区间出现了括号则表示该线程这段时间执行了该函数。这样就可以找出主线程的耗时函数了。同理也可以查找某函数在各个线程中的分布情况。
    在这里插入图片描述


    6、查看部分GC原因和位置

    因为安卓2.3以后GC并不会每次都停止其他线程因此只能跟踪到部分停止所有线程的GC情况。一般出现GC的时候时间线上会有比较大块的同颜色的区域点击后就可以定位到函数面板区域的GC函数一步一步向parent函数追踪就可以定位到GC的起因了。如下图的绿色部分主线程在加载资源图的时候发生了GC。
    在这里插入图片描述


    7、动画或者滑动过程是否触发Layout

    动画和滑动过程中在控件调用gone或者动态添加删除重新设置paramsTextView重新设置文字以及重新设置Drawable的时候都会触发Layout。在ListView的getview过程中它自己阻断了这个requestlayout自己对子控件做了layout的操作所以不会引起整个界面的重新布局。但是如果在其他时间设置了图片、文字等就可能导致requestlayout被触发进而执行onMeasure过程和onLayout过程这样的话就会大大影响了滑动过程中的性能容易造成卡顿。在滑动过程中或者有动画的情况下做TraceView跟踪可以发现是否被触发了重新布局。在跟踪结束中搜索onLayout或者layout或者requestlayout可以方便找到对应的控件。
    在这里插入图片描述
    在这里插入图片描述


    8、找出较小的耗时函数

    前面按照Incl Cpu Time排序一下就可以找到较大的性能问题函数但是小的耗时函数就不是通过这种方式来找了。我们把Call+Recur Calls/Total和Cpu Time/Call放到最前面按照Cpu Time/Call排序找出平均执行时间久的函数展开其子函数分析是否存在问题并通过调用次数看严重的程度。如下图我们发现社区界面在滑动过程中的TBS提交埋点函数耗时过久进一步跟踪发现是Hashmap多余的putall操作。
    在这里插入图片描述


    9、查找高频率调用存在性能的点

    我们把Call+Recur Calls/Total和Cpu Time/Call放到最前面按照Call+Recur Calls/Total排序查看执行次数多的隐患函数展开其子函数分析是否存在问题并通过Incl Cpu Time 的CPU占用比以及Incl Cpu Time 的占用百分比来判断严重性特别是调用次数多的且Cpu Time/Call次数也多的应该重点排查。通过这样我们就能找到高频率调用函数的性能问题点。我们发现一个简单的函数但是调用次数太多后导致了相对的耗时且这里只要用到一个宽度只要第一次获取后保存该值不需要每次从系统函数中去取这样就解决了。
    在这里插入图片描述
    但是有时候判断一个函数是否严重还是需要对系统的了解。比如SharedPreferences的apply函数较高频率调用但是其CPU和单次时间都不会占用多少但是这确是一个性能影响点因为直接commit有阻塞的IO操作apply函数调用后进程中有专门一个SharedPreferences的写线程会处理写入操作而这个写线程此时可能会很耗时。反过来如果看到SharedPreferencesImpl&*run线程占用较高cpu的时候就可以推断出较多的SharedPreferences的操作了我们应该通过搜索把apply的调用出都找出来。
    在这里插入图片描述


    10、查看布局性能问题

    通过Incl Cpu Time百分比排序列表滑动过程中如果看到onMeasure或者onLayout大于25%以上的就应该可以判断出当前这个界面的布局性能不佳需要优化了。
    在这里插入图片描述
    在列表滑动过程中也需要检查getview这样的函数的性能特别是布局复杂的初始化时间会比较久。
    在这里插入图片描述
    在这里插入图片描述


    11、查看布局复用问题

    在列表滑动的过程中或者广告Banner控件一般的做法都是应该复用布局提升性能的但有时候因为觉得麻烦有些可能是动态添加的就没有复用这些view导致在滑动过程中还是会出现infalte布局的情况影响性能。跟踪方法是在这个列表已经滑动过的情况下开始进行TraceView这个时候来回滑动不应该出现infalte如果出现了就是复用出现了问题。下图中我们对“我的订单”界面做了跟踪发现有动态inflate button导致每次都额外增加了时间影响性能。

    在这里插入图片描述
    还有一种判断方法就是在进入界面的时候找出LayoutInflater.createViewFromTag函数找出它数量以及parents调用方检查是否有问题。
    在这里插入图片描述


    12、判断布局嵌套过多或者过于复杂

    我们把Call+Recur Calls/Total和Cpu Time/Call放到最前面通过View/ViewGroup的draw调用次数和递归调用次数来判断布局的层级过多或者布局Layout太多。也可以通过buildDisplayList函数的调用和递归调用次数来判断布局的层级过多或者是Layout太多。
    在这里插入图片描述


    13、查类的初始化性能

    我们把Call+Recur Calls/Total和Cpu Time/Call放到最前面通过Cpu Time/Call排序找到一些类的构造函数判断类的初始化性能。类的初始化过程如果太久特别是在主线程中会影响性能而这个又是一个容易忽略的问题因为类的初始化过程可以简单也可以复杂复杂的可以做懒加载来优化。如果调用次数多的那就更应该优化或者做复用。
    在这里插入图片描述


    14、排查字符串问题

    把Call+Recur Calls/Total放到前面在搜索字符串相关的一些StringBuiler类或者StringBuffer类还有append方法以及enlarge方法来查看当前的字符串问题。找到调用方去掉不必要的字符串拼接和扩容来提升性能。
    在这里插入图片描述


    15、未开启硬件加速

    检查绘制函数如果发现是drawSoftware那就是未开启硬件加速影响了帧率。
    在这里插入图片描述


    16、排查集成的问题

    有时候集成需要多个包可能会漏掉其中一个这一个时候通过TraceView调用分析自己的某个函数但是和自己的预期不一样明明已经改过了为什么还会这样这个时候可能就是打包的时候没有引用到正确的包。


    17、排查自己写的函数是否符合预期

    有时候自己写的函数如字符串问题会被编译器做一些优化或者不太注意用了很多+号导致了很多StringBuilder对象的分配这个时候通过TraceView我们可以发现在该函数下创建了多少个StringBuilder和以及扩容的问题。通过调用次数来判断对性能的影响如果是频率比较多的函数就应该去优化这些问题。
    在这里插入图片描述


    18、发现可复用对象

    在对一些频率较高的函数的子函数分析过程中我们可以去看是否每次这个函数调用的时候都会去创建这些对象如果是那可以考虑一下是否可以对这些对象做复用。如下图发现这个重入锁对象应该做复用。
    在这里插入图片描述


    19、判断主线程长时间等待原因

    时间线上主线程长时间空白可能是受其他因素的影响比如安全软件对IO的监控用了锁等待某个资源或者CPU太忙了没有时间片来分配。下面第一张图是因为安全软件对IO的监控用了锁等待某个资源导致主线程执行性能问题第二张图则是由于其他现场太多太忙了导致主线程CPU分配不到时间片。
    在这里插入图片描述
    在这里插入图片描述


    20、灵活运用时间线找出根源

    在安卓代码中我们不建议主动调用System.gc方法来触发GC但是在检测首页滑动过程中LogCat中还是定时出现了GC_EXPLICIT的垃圾回收信息。通过启用TraceView的跟踪发现了调用System.gc的函数位置但是向上跟踪后最终只能跟踪到一个线程池的run具体这个线程的run由谁调用没法继续跟踪了。这样只能通过时间线上再去找问题通过鼠标放在时间线上从后到前简单扫描了一下时间线并未发现和taobao,ali等包名的函数为了继续排查只能放大时间线来发现线索通过放大时间线面板调用函数也会变得越来越细腻最终在调用gc前面部分位置找到了com.alibaba.mobileiim.channel.http.httpwebTokenCallback的函数调用从而定位到问题所在。
    在这里插入图片描述
    在这里插入图片描述


    21、了解一些函数的性能问题如字符串函数格式化函数等

    通过占用cpu百分比调用次数平均调用时间可以观察到一些系统类实现的函数有性能问题在高频率下不应该调用。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述


    22、如果你对JAVA相当熟悉甚至可以通过这个软件发现一些代码上的问题

    在分析一个高频率函数的时候发现该函数包装了一个subString方法但是子函数中却多了一个String类的创建。待着问题查看了实现代码发现该函数确实实现有问题。String是不可变对象source.substring函数本身就会返回指定的sub字符串内部会new一个string外部不需要再new string这样多了一次对象的分配。
    在这里插入图片描述

    查看该文件的这个函数

    public static String substring(String source, int start, int end) {
    
     if (end <= 0) {
        new String(source.substring(start));
      }
        new String(source.substring(start, end));
    }
    

    23、一定不要忘了在各个界面的静默状态做跟踪特别是有动画的界面

    在有广告条轮播等动画的界面尤其要注意像首页、社区等界面都发现了在广告条移出屏幕外的时候还有定时刷新广告的问题这个会影响性能和耗电。有时候看代码已经用Handler的removeCallbacks(this)接口移除了但队列中可能还有其他的定时实例会重新启动这个定时removeCallbacks只是在队列中移除了这个实例相关的消息。替换成removeCallbacksAndMessages(null)函数移除全部等候执行的消息后才解决了该问题。
    TraceView也是一个在界面切换到后台被其他程序覆盖等情况下检查程序中仍再运行的线程等问题的首选工具。

    在这里插入图片描述
    以上是常用的TraceView性能跟踪的一些方法,当然随着使用的娴熟你会发现它的功能并不止这些而且用的熟练后很容易就能找到影响性能的关键点。



    彩蛋

       读者朋友们,经过上面的介绍我想大家一定掌握了TraceView使用精髓了,是时候展现真正的技术实力的时候了,下面我提供一个TraceView的现场现场,看看读者朋友们能否查出原因来。TraceView的文件见附件ddms_traceView.zip
    在这里插入图片描述

    参考文章:
    http://bxbxbai.github.io/2014/10/25/use-trace-view/
    https://yq.aliyun.com/articles/20467

    展开全文
  • TraceView工具(Device Monitor) 参考文章: Traceview Walkthrough  Android 编程下的 TraceView 简介及其案例实战  正确使用Android性能分析工具——TraceView  Android内存使用分析和程序性能分析 ...

    TraceView工具(Device Monitor)

    参考文章: Traceview Walkthrough 
    Android 编程下的 TraceView 简介及其案例实战 
    正确使用Android性能分析工具——TraceView 
    Android内存使用分析和程序性能分析

    TraceView工具能做什么?

    从代码层面分析性能问题,针对每个方法来分析,比如当我们发现我们的应用出现卡顿的时候,我们可以来分析出现卡顿时在方法的调用上有没有很耗时的操作,关注以下两个问题:

    • 调用次数不多,但是每一次执行都很耗时
    • 方法耗时不大,但是调用次数太多

    简单一点来说就是我们能找到频繁被调用的方法,也能找到执行非常耗时的方法,前者可能会造成Cpu频繁调用,手机发烫的问题,后者就是卡顿的问题

    TraceView工具启动

    打开Monitor,点击图中的标注的按钮,启动追踪:

    TraceView工具面板

    打开App操作你的应用后,再次点击的话就停止追踪并且自动打开traceview分析面板: 
     
    traceview的面板分上下两个部分:

    • 时间线面板以每个线程为一行,右边是该线程在整个过程中方法执行的情况
    • 分析面板是以表格的形式展示所有线程的方法的各项指标

    时间线面板

     
    左边是线程信息,main线程就是Android应用的主线程,这个线程是都会有的,其他的线程可能因操作不同而发生改变.每个线程的右边对应的是该线程中每个方法的执行信息,左边为第一个方法执行开始,最右边为最后一个方法执行结束,其中的每一个小立柱就代表一次方法的调用,你可以把鼠标放到立柱上,就会显示该方法调用的详细信息: 
     
    你可以随意滑动你的鼠标,滑倒哪里,左上角就会显示该方法调用的信息。 
    1.如果你想在分析面板中详细查看该方法,可以双击该立柱,分析面板自动跳转到该方法: 
     
    2.放大某个区域 
    刚打开的面板中,是我们采集信息的总览,但是一些局部的细节我们看不太清,没关系,该工具支持我们放大某个特殊的时间段:

     
    如果想回到最初的状态,双击时间线就可以。 
    3.每一个方法的表示: 

    可以看出来,每一个方法都是用一个型结构来表示,坐标的凸起部分表示方法的开始,右边的凸起部分表示方法的结束,中间的直线表示方法的持续.

    分析面板

    面板列名含义如下:

    名称 意义
    Name 方法的详细信息,包括包名和参数信息
    Incl Cpu Time Cpu执行该方法该方法及其子方法所花费的时间
    Incl Cpu Time % Cpu执行该方法该方法及其子方法所花费占Cpu总执行时间的百分比
    Excl Cpu Time Cpu执行该方法所话费的时间
    Excl Cpu Time % Cpu执行该方法所话费的时间占Cpu总时间的百分比
    Incl Real Time 该方法及其子方法执行所话费的实际时间,从执行该方法到结束一共花了多少时间
    Incl Real Time % 上述时间占总的运行时间的百分比
    Excl Real Time % 该方法自身的实际允许时间
    Excl Real Time 上述时间占总的允许时间的百分比
    Calls+Recur 调用次数+递归次数,只在方法中显示,在子展开后的父类和子类方法这一栏被下面的数据代替
    Calls/Total 调用次数和总次数的占比
    Cpu Time/Call Cpu执行时间和调用次数的百分比,代表该函数消耗cpu的平均时间
    Real Time/Call 实际时间于调用次数的百分比,该表该函数平均执行时间

    你可以点击某个函数展开更详细的信息: 
     
    展开后,大多数有以下两个类别:

    • Parents:调用该方法的父类方法
    • Children:该方法调用的子类方法

    如果该方法含有递归调用,可能还会多出两个类别:

    • Parents while recursive:递归调用时所涉及的父类方法
    • Children while recursive:递归调用时所涉及的子类方法

    首先我们来看当前方法的信息:

    Name 24 android/widget/FrameLayout.draw(L android/graphics/Canvas;)V
    Incl Cpu% 20.9%
    Incl Cpu Time 375.201
    Excl Cpu Time % 0.0%
    Excl Cpu Time 0.000
    Incl Real Time % 1.1%
    Incl Real Time 580.668
    Excl Real Time % 0.0%
    Excl Real Time 0.000
    Calls+Recur 177+354
    Cpu Time/Call 0.707
    Real Time/Call 1.094

    根据下图中的toplevel可以看出总的cpu执行时间为1797.167ms,当前方法占用cpu的时间为375.201,375.201/1797.167=0.2087,和我们的Incl Cpu Time%是吻合的。当前方法消耗的时间为580.668,而toplevel的时间为53844.141ms,580.668/53844.141=1.07%,和Incl Real Time %也是吻合的。在来看调用次数为177,递归次数为354,和为177+354=531,375.201/531 = 0.7065和Cpu Time/Call也是吻合的,580.668/531=1.0935,和Real Time/Call一栏也是吻合的。 

    Parents

    现在我们来看该方法的Parents一栏: 

    Name 22 com/android/internal/policy/impl/PhoneWindow$DecorView.draw(Landroid/graphics/Canvas;)V
    Incl Cpu% 100%
    Incl Cpu Time 375.201
    Excl Cpu Time %
    Excl Cpu Time
    Incl Real Time % 100%
    Incl Real Time 580.668
    Excl Real Time %
    Excl Real Time
    Call/Total 177/531
    Cpu Time/Call
    Real Time/Call

    其中的Incl Cpu Time%变成了100%,因为在这个地方,总时间为当前方法的执行时间,这个时候的Incl Cpu Time%只是计算该方法调用的总时间中被各父类方法调用的时间占比,比如Parents有2个父类方法,那就能看出每个父类方法调用该方法的时间分布。因为我们父类只有一个,所以肯定是100%,Incl Real Time一栏也是一样的,重点是Call/Total,之前我们看当前方式时,这一栏的列名为Call+Recur,而现在变成了Call/Total,这个里面的数值变成了177/531,因为总次数为531次,父类调用了177次,其他531次是递归调用。这一数据能得到的信息是,当前方法被调用了多少次,其中有多少次是父类方法调用的。

    Children

     
    可以看出来,我们的子类有2个,一个是自身,一个是23android/view/View.draw(L android/graphics/Canvas;)V,self代表自身方法中的语句执行情况,由上面可以看出来,该方法没有多余语句,直接调用了其子类方法。另外一个子类方法,可以看出被当前方法调用了177次,但是该方法被其他方法调用过,因为他的总调用次数为892次,你可以点击进入子类方法的详细信息中。

    Parents while recursive

     
    列举了递归调用当前方法的父类方法,以及其递归次数的占比,犹豫我们当前的方法递归了354次,以上三个父类方法递归的次数分别为348+4+2 = 354次。

    Children while recursive

     
    列举了当递归调用时调用的子类方法。


    展开全文
  • TraceView工具的使用

    2016-10-20 23:25:00
    一、TraceView工具如何使用 TraceView有4种启动/关闭分析方式: (1) 第一种使用方法演示 1、 选择跟踪范围 在想要根据的代码片段之间使用以下两句代码 Debug.startMethodTracing("love_world_"); Debug....

    一、TraceView工具如何使用

    TraceView有4种启动/关闭分析方式:

    (1) 第一种使用方法演示

    1、 选择跟踪范围

    在想要根据的代码片段之间使用以下两句代码

    Debug.startMethodTracing("love_world_");  
    Debug.stopMethodTracing(); 
    

    例如,onCreate与onStart方法之间方法跟踪

    public class MainActivity extends Activity {  
      
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.activity_main);  
              
            Debug.startMethodTracing("Love_World_");  
        }  
      
        @Override  
        protected void onStart() {  
            super.onStart();  
              
            Debug.stopMethodTracing();  
        }  
          
    }  
    

    2、添加SD卡访问权限

    uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    

    如果不添加,执行项目会出现以下异常

    java.lang.RuntimeException:Unable to open trace file '/mnt/sdcard/Love_World_.trace': Permission denied  
    

    如果手机没有SD卡也会出现同样的问题

     

    3、 导出traceview文件
    1  首先执行项目,查看trace文件是否生成
           进入shell模式

    adb shell 
    

    2 导出trace文件

    adb pull sdcard/Love_World_.trace  
    

     

    4、 打开trace文件

    打开trace文件需要Android提供的traceview.bat工具,工具所在目录:sdk\tools\traceview.bat, 有两种方式执行:
    1) 在命令行中切换到此目录
    2) 将此目录添加到系统环境变量中

    //  cmd在calc.trace所在目录执行  
    traceview C:\Users\YourName\Desktop\Love_World_.trace  
    

    其中“C:\Users\YourName\Desktop\” 表示trace所在你系统中的目录,此工具需要输入trace文件的绝对路径才行

    在新版本的SDK 会有以下提示:

    The standalone version of traceview is deprecated.  
    Please use Android Device Monitor (tools/monitor) instead.
    

    所以建议使用tools/monitor 启动后跟Eclipse DDMS界面差不多,然后File -> Open File -> 选择trace文件

     

    5、异常处理
    1 异常处理

    'C:\Windows\system32\java.exe' 不是内部或外部命令,也不是可运行的程序  
    或批处理文件。  
    SWT folder '' does not exist.  
    Please set ANDROID_SWT to point to the folder containing swt.jar for your platfo  
    rm.  
    

       配置Java环境变量,把java bin 添加到系统环境变量PATH中
    2 异常信息

    The standalone version of traceview is deprecated.  
    Please use Android Device Monitor (tools/monitor) instead.  
    Failed to read the trace filejava.io.IOException: Key section does not have an *  
    end marker  
            at com.android.traceview.DmTraceReader.parseKeys(DmTraceReader.java:420)  
      
      
            at com.android.traceview.DmTraceReader.generateTrees(DmTraceReader.java:  
    91)  
            at com.android.traceview.DmTraceReader.<init>(DmTraceReader.java:87)  
            at com.android.traceview.MainWindow.main(MainWindow.java:286) 
    

    通常是trace文件有异常,再重新生成并导出试试

    3. 没有SD卡会出现异常

    Unable to open trace file '/sdcard/Love_World_.trace': Permission denied  
     Caused by: java.lang.RuntimeException: Unable to open trace file '/sdcard/Love_World_.trace': Permission denied  
    

    生成的trace系统自动放在SDCARD上,没有sd卡所以会出现这种异常

     

    (2)  第二种使用方法演示

    Eclipse -> DDMS -> Start Method Profiling

    二者的区别,第一种方式更精确到方法,不方便的地方是自己需要添加方法并且要导出文件,第二种方式的优缺点刚好相反。

     

    (3) 任意时间点启动与关闭trace

    启动:am profile <PROCESS> start <FILE>关闭:am profile <PROCESS> stop
    <PROCESS> 填写进程名,例如AndroidManifest.xml中声明的包名,通常都是主进程名


    例如:  
    adb shell am profile com.example start ./mnt/sdcard/test.trace


    adb shell am profile com.example stop

    (4)  启动指定Activity并进行trace

    am start -n <Package Name>/<Package Name>.<Activity Name> --start-profiler <FILE>

    例如:
    adb shell am start -n com.example/com.example.MainActivity --start-profiler ./mnt/sdcard/test.trace

     

    细节详见官方文档:
    http://developer.Android.com/tools/help/shell.html

     

    二、 TraceView工具面板介绍

    有两方面用途: 

    1  查看跟踪代码的执行时间,分析哪些是耗时操作  

    2  可以用于跟踪方法的调用,尤其是Framework层的方法调用关系

     

    获取方法的调用顺序

     

    1. 在traceview中搜索响应的方法名不能使用大写字母

    2. 搜索出的方法会自动展开,其中包含Parents 和 Children 两组信息

    3. 点击Parents下的方法名,直接跳转到调用当前的方法处。Children相反




    Traceview 面板分上下两部分
    上面是时间轴面板 (Timeline Panel)
         左侧显示的是线程信息
         右侧黑色部分是显示执行时间段、白色是线程暂停时间段,
         右侧鼠标放在上面会出现时间线纵轴,在顶部会显示当前时间线所执行的具体函数信息
    下面是分析面板(Profile Panel) -  每一列内容

     

    Inclusive time  - 函数本身运行花费时间 + 函数调用其他函数时间

    Exclusive time - 函数本身运行花费时间。

    Calls + RecurCall/Total 调用 + 重复调用次数 / 函数总调用次数

    Cpu Time/Call 总的Cpu时间与总的调用次数之比
     

    表1-1  Profile Panel各列作用说明

    列名

    描述

    Name

    该线程运行过程中所调用的函数名

    Incl Cpu Time

    某函数占用的CPU时间,包含内部调用其它函数的CPU时间

    Excl Cpu Time

    某函数占用的CPU时间,但不含内部调用其它函数所占用的CPU时间

    Incl Real Time

    某函数运行的真实时间(以毫秒为单位),内含调用其它函数所占用的真实时间

    Excl Real Time

    某函数运行的真实时间(以毫秒为单位),不含调用其它函数所占用的真实时间

    Call+Recur Calls/Total

    某函数被调用次数以及递归调用占总调用次数的百分比

    Cpu Time/Call

    某函数调用CPU时间与调用次数的比。相当于该函数平均执行时间

    Real Time/Call

    同CPU Time/Call类似,只不过统计单位换成了真实时间

     
     

    三、如何进行具体的分析

    有两个问题需要解决:

     

    1. 如何定位到所关心的地方? 

    上面只是介绍了如何使用TraceView且有两种用法,但是有时使用第一种方式范围又不太精确,使用第二种添加代码的方式,可能有些地方又监听不到。这种情况可以尝试把开始或者结束放到延迟线程中,延迟一段时间在执行开始或者结束。

     

    2. 如何查找出哪些地方比较耗时?

    TraceView罗列出了是所有监听到的方法,当然也包括Android系统很多方法的耗时,如何在这么多方法里面查找到自己关心的? 可以通过TraceView 底部的find 来查找,通常Android app都是有包名的,可以先针对某些关心的列排序后,在通过包名进行一个个查找,这些就省去自己筛选出自己app 方法耗时排行的时间。

     

    四、 相关资料:

     

    Android系统性能调优工具介绍 (还有具体如何使用进行性能分析的例子,非常棒)

     

    念茜 : Android代码调试工具 traceview 和 dmtracedump的波折演绎 

     

    原文地址: http://blog.csdn.net/love_world_/article/details/8223805

      

      

      

      

      

      

      

      

      

     

    转载于:https://www.cnblogs.com/ganchuanpu/p/5983067.html

    展开全文
  • 一、 TraceView工具简述  Traceview是android平台配备的一个很好的性能分析工具。它可以通过图形界面的方式让我们了解我们要跟踪的程序的性能,并且能具体到method。  二、 TraceView工具使用方法  ...
  • 参考文章: Traceview Walkthrough ...TraceView工具能做什么?从代码层面分析性能问题,针对每个方法来分析,比如当我们发现我们的应用出现卡顿的时候,我们可以来分析出现卡顿时在方法的调用上有没有很耗
  • 一、TraceView工具如何使用 TraceView有两种启动/关闭分析方式: (1) 第一种使用方法演示 1、 选择跟踪范围 在想要根据的代码片段之间使用以下两句代码 [java] view plain ...
  • Android性能检测--traceview工具各个参数的意思
  • 一、TraceView工具如何使用 TraceView有4种启动/关闭分析方式: (1) 第一种使用方法演示 1、 选择跟踪范围 在想要根据的代码片段之间使用以下两句代码 [java] view pla
  • TraceView工具能做什么?从代码层面分析性能问题,针对每个方法来分析,比如当我们发现我们的应用出现卡顿的时候,我们可以来分析出现卡顿时在方法的调用上有没有很耗时的操作,关注以下两个问题: 调用次数不多,...
  • TraceView工具能做什么? 从代码层面分析性能问题,针对每个方法来分析,比如当我们发现我们的应用出现卡顿的时候,我们可以来分析出现卡顿时在方法的调用上有没有很耗时的操作,关注以下两个问题: 调用次数不多,...
  • TraceView工具使用

    2016-04-09 15:30:21
    TraceView界面 现来看一下整个界面的图,整个界面包括上下两部分,上面是你测试的进程中每个线程的执行情况,每个线程占一行;下面是每个方法执行的各个指标的值 上面一部分是你测试进程的中每个线程运行的...
  • 1.概述 Trracview性能分析功能另一利器。...traceview 参数说明: Name: 该线程运行过程中所调用的函数名 Incl Cpu Time: 某函数占用的CPU时间,包含内部调用其它函数的CPU时间 Excl Cpu Time: 某函数占用的...
  • TraceView工具能做什么? 从代码层面分析性能问题,针对每个方法来分析,比如当我们发现我们的应用出现卡顿的时候,我们可以来分析出现卡顿时在方法的调用上有没有很耗时的操作,关注以下两个问题: 调用次数不...
  • 一、SysTrace简介 Systrace允许你监视和跟踪...但是不能确定具体有问题的代码在哪里,这里可用用traceview工具。在Android平台中,Systrace主要由3部分组成: 内核部分:Systrace利用了Linux Kernel中的ftrace功
  • Traceview是android平台配备一个很好的性能分析的工具。它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到method。 Traceview的作用 1.查看跟踪代码的执行时间,分析哪些是耗时操作 2....
  •  TraceView是Android SDK中内置的一个数据采集和分析工具,它可以加载trace文件,用图形的形式展示代码的执行时间、次数及调用栈,找出最需要优化的点。  trace文件是log信息文件的一种,可以通过代码,Android ...
  • TraceView,作为性能优化的工具,在优化代码,重构代码中可以提供比较靠谱的参考。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 899
精华内容 359
关键字:

traceview工具