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)如果在真机上调试, ...
随机推荐
- C#文件操作与编程
一:驱动器System.IO 软盘,优盘,光盘,硬盘 DriveInfo/DriveType DriveInfo:确定有关驱动器的信息:盘符,类型,可用空间 DriveType:确定DriveInfo ...
- pyqt5 学习总结
关于基类 一般的文件都会基于QWidget,QtWidgets.QMainWindow 或QDialog,like this class Example(QWidget): QWidget类是所有用户 ...
- iOS_12_tableViewCell的删除更新_红楼梦
终于效果图: Girl.h // // Girl.h // 12_tableView的增删改 // // Created by beyond on 14-7-27. // Copyright (c) ...
- Java 语法清单
Java 语法清单 Java 语法清单翻译自 egek92 的 JavaCheatSheet,从属于笔者的 Java 入门与实践系列.时间仓促,笔者只是简单翻译了些标题与内容整理,支持原作者请前往 ...
- Apcahe Shiro学习笔记(一):简介及运行官方Demo
一.Apache Shrio: apache shiro 是一个功能强大和易于使用的Java安全框架,为开发人员提供一个直观而全面的的解决方案的认证,授权,加密,会话管理. 支持认证跨一个或多个数据源 ...
- gridcontrol复选框功能实现(超具体)
博主这几天就准备离职了,以后不再做.Net开发.因此这应该是我写的最后一篇关于dev控件的博文.既然是最后一篇,那就写的具体一些.画个圆满的省略号...... 本文介绍gridcontrol怎样实现复 ...
- datatables参数配置详解
//@translator codepiano //@blog codepiano //@email codepiano.li@gmail.com //尝试着翻译了一下,难免有错误的地方,欢迎发邮件告 ...
- [Python爬虫] Selenium自己主动訪问Firefox和Chrome并实现搜索截图
前两篇文章介绍了安装.此篇文章算是一个简单的进阶应用吧.它是在Windows下通过Selenium+Python实现自己主动訪问Firefox和Chrome并实现搜索截图的功能. [Python爬虫] ...
- 【WordSearch】Word Search
Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...
- Go语言string,int,int64 ,float之间类型转换方法
(1)int转string ? 1 2 s := strconv.Itoa(i) 等价于s := strconv.FormatInt(int64(i), 10) (2)int64转string ? 1 ...