Android调试之TraceView
TraceView
在应用运行时,可以使用Debug类打开操作日志记录功能,打开后Android会详细记录应用花在每个线程以及线程的每个函数的调用时间。操作日志记录完毕后,可以使用Android SDK自带的traceView工具将应用操作日志图形化显示,在应用开发的过程中,可以用它来观察应用的性能瓶颈。
1.记录应用操作日志
记录应用操作日志的方法有两种:
利用Debug类的startMethodTracing和stopMethodTracing函数分别来打开和关闭日志记录功能。
这个方法的优点在于精确,应为可以指定需要衡量的函数,但它的缺点是需要修改应用函数源码。
使用DDMS工具来启动日志记录功能,这种方法不是很精确,因为它不是通过修改源码实现,而是在DDMS工具中指明何时启用和停止日志
使用第一种方式的时候,在应用只要在源码中调用Debug类的startMethodTracing函数,指定保存操作日志的文件名就可以开始跟踪记录操作日志。要停用日志功能,只需要调用stopMethodTracing函数即可。即:
Debug.startMethodTracing("tracedemo");
.
.
.
Debug.stopMethodTracing();
之后就会在sd卡目录生成一个tracedemo.trace文件,使用adb命令把它下载到本地开发机
adb pull /sdcard/tracedemo.trace
使用Android SDK中的traceview打开收集到得操作日志,
traceview tracedemo.trace
使用第二种方式很简单,打开DDMS界面,选中对应的进程,点击“start Method Profilling”按钮开始记录,再点击一次结束记录

2.Traceview界面
TraceView的界面分为两部分,上面是时间线(Time Panel),应用中运行的每个线程以单独一行显示。下面是详细日志面板,详细列出各函数运行的耗时分析,如下图所示


详细日志面板参数说明
| 参数 | 说明 |
|---|---|
| Incl Cpu Time(%);Incl Cpu Time | 包含时间(Inclusive Time)表示花在执行函数的时间,包括函数调用的所有子函数运行消耗的时间。 |
| Excl Cpu Time(%);Excl Cpu Time | 独占时间(Exclusive time)比奥斯只花在执行函数的时间,不包括函数调用的所有子函数运行消耗的时间 |
| Calls+Recur;Calls/Total | 虽然用一列显示,其实该列包含了两个信息,分别是“Calls+Recur”和“Calls/Total”。“Calls+Recur”表示函数被调用的次数(前者)和被递归调用的次数(后者),而“Calls/Total”表示子函数被父函数调用的次数(前者)和其总的被调用次数(后者)。 |
| Cpu Time/Call | 对应函数每次调用平均消耗的Cpu的时间 |
通过分析Traceview我们可以分析那些方法耗时比较严重,从而找到性能瓶颈,继而解决问题。
3.am命令
除了上面两种方式来记录操作日志之外,还可以通过Android系统中am命令来启用日志记录功能。与ddms命令类似,am的profile子命令可以在进程运行时打开操作日志记录功能,其使用格式如下:
- 启用日志记录, adb shell am profile <进程或进程ID>start<日志路径>
- 停用日志记录, adb shell am profile <进程或进程ID>stop
4.使用dmtracedump分析函数调用树
在TraceView的详细日志面板中可以以层次的方式展开每个函数,方便开发人员观察函数之间的调用关系,如当前函数被哪个函数所调用,当前函数直接调用了哪些函数等。但这种方式还不是很直观,在Android中,dmtracedump命令可以用来图形化的显示函数之间的层次调用关系。
dmtracedump命令依赖开源的dot命令生成函数调用,而dot是graphviz包得一部分,graphviz是一个可以从文本形式的描述文件中生成图片的程序,用法可以参考其官网 http://www.graphviz.org.在使用之前,需要安装graphviz包,安装命令如下:
brew install graphviz(mac)
dmtracedump命令的使用格式是“dmtracedump[参数列表]日志文件”,例如:
dmtracedump -g tracedemo.png tracedemo.trace
可以生成类似下面的图

以下是dmtracedump命令的参数说明表
| 参数 | 说明 |
|---|---|
| -d(日志文件) | 与指定的日志文件做对比 |
| -g<输出的图像文件> | 以图形方式显示调用树并输出到指定的文件中 |
| -k | 保存中间用于生产调用树图像的dot文件 |
| -h | 与以HTML格式输出 |
| -o | 只是显示日志文件,而不做任何处理 |
| -s<排序js文件> | 当以HTML格式输出时,这个参数指定在HTML文件中进行排序的javascript文件 |
| -t<百分比> | 要显示的函数调用包含时间(inclusive time)阀值,对于子节点来说,该阀值是其调用包含时间相对于父节点调用包含时间的百分比,默认值是20%,即只输出调用包含时间是父节点总调用包含时间20%的函数到最终文件中 |
例如,除了生成调用树图像文件,也可以生产一个详细的html网页发布到web服务器,供开发者在线浏览
dmtracedump -h tracedemo.trace > temp.html

Android调试之TraceView的更多相关文章
- Android调试优化篇
为了开发出商业级的应用程序,大规模的測试是不可避免的,同一时候为了提高应用程序的执行速度,须要进行必要的优化.在Android中.提供了丰富的调试与优化工具供开发者应用,主要包含模拟器和目标端等两种场 ...
- 在 MAC OS X 安装 ADB (Android调试桥)
什么是 ADB? Android调试桥( adb )是一个开发工具,帮助安卓设备和个人计算机之间的通信. 这种通信大多是在USB电缆下进行,但是也支持Wi-Fi连接. adb 还可被用来与电脑上运行的 ...
- 2.[WP Developer体验Andriod开发]Andriod Studio结合Visual Studio Emulator for Android调试Android App
0. 工欲善其事必先利其器 上一篇博客对比了一下Android和WinPhnoe的布局容器,后续篇章重点放在Android的开发上了. 说到开发就绕不开调试程序,调试Android App我们有2种选 ...
- Android 开发笔记 “android调试遇到ADB server didn't ACK以及顽固的sjk_daemon进程 ”
资源来源:http://blog.csdn.net/wangdong20/article/details/20839533 做Android调试的时候经常会遇到,程序写好了,准备接上手机调试,可不一会 ...
- Android性能检测--traceview工具各个参数的意思
Android性能检测 traceview的使用方法 1. 把android-sdk-windows\tools路径加到Path当中 2. 编写测试代码: package com.wwj.tracev ...
- [Android学习笔记]Android调试
Eclipse Debug 快捷键: [Ctrl + Shift + B]: 添加/取消断点 [F5]:进入方法中 [F6]:单步执行 [F7]:执行完毕此方法 [F8]:继续执行,直接跳到下一个断点 ...
- 2.[Andriod]Andriod Studio结合Visual Studio Emulator for Android调试Android App
0. 工欲善其事必先利其器 上一篇博客对比了一下Android和WinPhnoe的布局容器,后续篇章重点放在Android的开发上了. 说到开发就绕不开调试程序,调试Android App我们有2种选 ...
- Stetho简化Android调试(二)
Stetho简化Android调试(一) 一文中讲述了如何使用Stetho结合Chrome远程调试Android App. Stetho给我们调试带来很大的便利,效率显著提升的同时也产生一个问题:如果 ...
- cocos2d-js 写日志log 查看日志log Android调试查看log
1 输出日志的方式,当然是cc.log了 2 如何查看日志? a)如果小程序可以先在浏览器上跑,例如用chrome,在控制台就可以看到输出的log: b)如果在真机上调试, ...
随机推荐
- (八):构建WineLib DLL
(一):介绍 出于某些原因,你可能会发现你想要和使用Windows DLL一样使用你的Linux库.对于这有一些原因例如以下: 你正在支持一个使用多个第三方库的大应用.该项目在Linux中是可用的,可 ...
- Fakeapp2.2安装,使用简记
1,硬件和操作系统,支持cuda的Nvidia显卡,8G及以上的内存,Windows10 x64(推荐,Windows7 x64亲测可行),可以使用gpu-z查看你的显卡详情 我的笔记本是双显卡(都是 ...
- 腾讯云ubuntu memcached 安装
ubuntu安装 sudo apt-get install memcached 停止memcached服务:sudo systemctl stop memcached 激活memcached服务:s ...
- erlang防止反编译
前面提到了erlang的反编译,下面说下防止反编译: 1)建立~/.erlang.crypt 在编译的用户名的home目录中建立一个加密方法的文件.erlang.crypt,内容如下: [{debug ...
- 【BZOJ1483】[HNOI2009]梦幻布丁 链表+启发式合并
[BZOJ1483][HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2 ...
- hihocoder #1122 二分图二•二分图最大匹配之匈牙利算法(*【模板】应用 )
梳理整个算法: 1. 依次枚举每一个点i: 2. 若点i尚未匹配,则以此点为起点查询一次交错路径. 最后即可得到最大匹配数. 在这个基础上仍然有两个可以优化的地方: 1.对于点的枚举:当我们枚举了所有 ...
- .net2.0 C# Json反序列化
http://cjl20082002.blog.163.com/blog/static/120827332009511103457637/ 去:http://json.codeplex.com/下载 ...
- Java Web 项目打包脚本
可用于 (但不限于) Eclipse 项目. 一次性生成:1. Java doc .zip 包:2. Java 源代码 .zip 包:3. Java 二进制文件 .jar 包:4. Java 源代码加 ...
- html5--3.18 新增的output元素
html5--3.18 新增的output元素 学习要点 了解output元素的用法 output元素:数据的输出 output元素是HTML5新增的元素,用来设置不同数据的输出 output元素的输 ...
- Java中的final和static
final final可以用在类.方法.变量上. 1.final用在类上,表明当前类它不能被继承,没有子类. 2.final用在方法上,表明当前方法不能被override,不能被重写. 3.final ...