Android bootchart 工具使用

1,330 阅读2分钟

多看书 少写文章

该工具在mac上使用需要自己编译

下载bootchart源码:bootchart-0.9.tar.bz2

编译需要ant,一下子需要更新homebrew,如果卡着换个网络试试。

brew install ant

进入源码目录

ant

编译生成bootchart.jar

之后可以丢到bin, java -jar xxxx.jar 执行。

如果是linux,安装如下两个(暂时未验证 主力是mac)

sudo apt-get install pybootchartgui

sudo apt-get install bootchart
找不到请替换
sudo apt-get install systemd-bootchart

开启bootchart

adb shell touch /data/bootchart/enabled

之后重启设备会在/data/bootchart/发现这么一堆

image.png

直接adb shell 进去执行压缩。

tar -czf bootchart.tgz *

如果是mac则可以用busybox曲线救国(待验证 太久忘记了)

busybox tar -czf bootchart.tgz header proc_stat.log proc_ps.log proc_diskstats.log

接下来是文件bootchart.tgz转化成图片

如果是mac ,或者自己写个shell

java  -jar   bootchar.jar   /path/to/bootchart.tgz

如果linux bootchart xxx/ bootchart.tgz




### 报错处理


# 报错如下:
$ bootchart ./ bootchart.tgz 
parsing './bootchart.tgz'
parsing 'header'
parsing 'proc_diskstats.log'
parsing 'proc_ps.log'
warning: no parent for pid '2' with ppid '0'
parsing 'proc_stat.log'
parsing 'header'
parsing 'proc_diskstats.log'
parsing 'proc_ps.log'
warning: no parent for pid '2' with ppid '0'
parsing 'proc_stat.log'
parsing 'bootchart.tgz'
parsing 'header'
parsing 'proc_diskstats.log'
parsing 'proc_ps.log'
warning: no parent for pid '2' with ppid '0'
parsing 'proc_stat.log'
merged 0 logger processes
pruned 265 process, 0 exploders, 18 threads, and 2 runs
False
Traceback (most recent call last):
  File "/usr/bin/bootchart", line 23, in <module>
    sys.exit(main())
  File "/usr/lib/python2.7/dist-packages/pybootchartgui/main.py", line 137, in main
    render()
  File "/usr/lib/python2.7/dist-packages/pybootchartgui/main.py", line 128, in render
    batch.render(writer, res, options, filename)
  File "/usr/lib/python2.7/dist-packages/pybootchartgui/batch.py", line 41, in render
    draw.render(ctx, options, *res)
  File "/usr/lib/python2.7/dist-packages/pybootchartgui/draw.py", line 282, in render
    draw_chart(ctx, IO_COLOR, True, chart_rect, [(sample.time, sample.util) for sample in disk_stats], proc_tree)
  File "/usr/lib/python2.7/dist-packages/pybootchartgui/draw.py", line 201, in draw_chart
    yscale = float(chart_bounds[3]) / max(y for (x,y) in data)
ZeroDivisionError: float division by zero

原因:解析磁盘数据时,bootchart 默认的 /proc/diskstats 格式数据是14列的, 而我这边的环境是18列,所以解析失败,进而导致后面的除数为0 的错误,把这里改成真实数据的列数就好了;

解决方法:


打开:/usr/lib/python2.7/dist-packages/pybootchartgui/parsing.py
def _parse_proc_disk_stat_log(file, numCpu):
...
  def is_relevant_line(linetokens):
---    return len(linetokens) == 14 and re.match(DISK_REGEX, linetokens[2])
+++    return len(linetokens) == 18 and re.match(DISK_REGEX, linetokens[2])
...


开机时间检测工具 ——bootchart

[Android][Framework]使用bootchart分析开机数据