Bootchart工具在Android手机上的使用方法和心得

adb push out/target/product/generic/root/init /init


1、简介

    bootchart本是一个开源工具,用可视化的方式对GUN/LINUX的开机启动过程进行性能分析,包括资源的使用,如CPU,磁盘等,各进程的执行时间等信息。根据分析结果,确定系统启动的性能瓶颈,制定相应的优化策略。关于bootchart的来历和说明件其官方网站:点击打开链接

    Android系统中已有一份bootchart的c实现,位于system/core/init/bootchart.c中。bootchart对Android开机测量是通过内建在init进程中实现的,在后台执行测量。不过bootchart的测量时段是从bootchart被初始化之后到home screen出来之前,不包括bootloader和kernel的执行时间。

2.使用步骤

(1)在ubuntu主机上安装Bootchart:

将bootchart-0.9.tar.bz2下载到本地,例如tools目录下,解压

下载ant:

apusr@BaokunYinubt:~/tools/bootchart-0.9$ sudo apt-get install ant

下载成功后,在bootchart-0.9目录下,使用ant生成bootchart.jar文件:

apusr@BaokunYinubt:~/tools/bootchart-0.9$ ant
执行结果:

Buildfile: /home/apusr/tools/bootchart-0.9/build.xml

prepare:
    [mkdir] Created dir: /home/apusr/tools/bootchart-0.9/build

classes:
    [javac] /home/apusr/tools/bootchart-0.9/build.xml:41: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 28 source files to /home/apusr/tools/bootchart-0.9/build
    [javac] 注意:/home/apusr/tools/bootchart-0.9/lib/org/apache/commons/cli/TypeHandler.java 使用或覆盖了已过时的 API。
    [javac] 注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。
    [javac] 注意:某些输入文件使用了未经检查或不安全的操作。
    [javac] 注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。
    [javac] /home/apusr/tools/bootchart-0.9/build.xml:51: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 26 source files to /home/apusr/tools/bootchart-0.9/build
    [javac] 注意:某些输入文件使用了未经检查或不安全的操作。
    [javac] 注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。

jar:
      [jar] Building jar: /home/apusr/tools/bootchart-0.9/bootchart.jar

javadoc:
    [mkdir] Created dir: /home/apusr/tools/bootchart-0.9/javadoc/api
  [javadoc] Generating Javadoc
  [javadoc] Javadoc execution
  [javadoc] 正在装入软件包 org.bootchart 的源文件...
  [javadoc] 正在装入软件包 org.bootchart.common 的源文件...
  [javadoc] 正在装入软件包 org.bootchart.parser 的源文件...
  [javadoc] 正在装入软件包 org.bootchart.parser.linux 的源文件...
  [javadoc] 正在装入软件包 org.bootchart.renderer 的源文件...
  [javadoc] 正在构造 Javadoc 信息...
  [javadoc] 标准 Doclet 版本 1.6.0_29
  [javadoc] javadoc: 警告 - 获取 URL 时出错:http://java.sun.com/j2se/1.4/docs/api/package-list
  [javadoc] 正在构建所有软件包和类的树...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart//Main.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//BootStats.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//Common.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//Common.LogFileFilter.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//CPUSample.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//DiskTPutSample.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//DiskUtilSample.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//FileOpenSample.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//Process.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//ProcessSample.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//ProcessTree.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//PsStats.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//Sample.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//Stats.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser//HeaderParser.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser/linux//PacctParser.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser/linux//PidNameParser.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser/linux//ProcDiskStatParser.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser/linux//ProcPsParser.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser/linux//ProcStatParser.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser/linux//PsParser.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/renderer//CSSInliner.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/renderer//EPSRenderer.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/renderer//ImageRenderer.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/renderer//PNGRenderer.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/renderer//Renderer.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/renderer//SVGRenderer.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/overview-frame.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart//package-frame.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart//package-summary.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart//package-tree.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//package-frame.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//package-summary.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/common//package-tree.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser//package-frame.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser//package-summary.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser//package-tree.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser/linux//package-frame.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser/linux//package-summary.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/parser/linux//package-tree.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/renderer//package-frame.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/renderer//package-summary.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/org/bootchart/renderer//package-tree.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/constant-values.html...
  [javadoc] 正在构建所有软件包和类的索引...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/overview-tree.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/overview-tree.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/index-all.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/deprecated-list.html...
  [javadoc] 正在构建所有类的索引...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/allclasses-frame.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/allclasses-noframe.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/index.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/overview-summary.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/help-doc.html...
  [javadoc] 正在生成 /home/apusr/tools/bootchart-0.9/javadoc/api/stylesheet.css...
  [javadoc] 1 警告

all:

BUILD SUCCESSFUL
Total time: 3 minutes 14 seconds

可以看到,在tools/bootchart-0.9/目录中生成了bootchart.jar文件,这个就是我们需要的chart分析文件。

注:如果在安装过程中遇到了问题,可以参考http://blog.csdn.net/harry_helei/article/details/8545032

(2)建立支持Bootchart的init文件(在Android源代码的根目录下执行):

$export INIT_BOOTCHART=true //在bootchart.h文件中把bootchart宏设置为1,就不用执行这一步了
$touchsystem/core/init/bootchart.h //touch命令能够创建一个空白文件,或者改变文件的创建时间    
$touch system/core/init/init.h
编译后重新烧机,并且把init文件push到手机中替换原来的init文件:

adb push out/target/product/generic/root/init /init
(3)启动Bootchart功能:

    在ubuntu上通过adb链接手机,在Android源代码根目录下执行:

adb shell 'echo 120 > /data/bootchart-start'   //其中120是采集时间,以秒为单位

注:在这个过程中如果遇到了错误,无法创建bootchart-start目录,可能原因是当前手机不支持echo功能。可以进入手机busybox一下,应该就可以了:

adb root 
adb shell
cd data
busybox touch bootchart-start
echo 120 > bootchart-start 

(4)查看Bootchart执行测量是否成功:

    重启手机,在ubuntu上使用adb链接手机,进入手机查看/data/bootchart目录中查看是否生成了需要的文件:

    # ls -l  
    -rw-rw-rw- root     root          452 2010-01-01 00:00 header  
    -rw-r--r-- root     root            0 2010-01-01 00:00 kernel_pacct  
    -rwxr-xr-x root     root      1020195 2010-01-01 00:02 proc_diskstats.log  
    -rwxr-xr-x root     root      4252966 2010-01-01 00:02 proc_ps.log  
    -rwxr-xr-x root     root       138215 2010-01-01 00:02 proc_stat.log 
    如果成功生成了这5个文件,说明bootchart执行测量成功,已经得到所需数据。下面需要将这些数据进一步处理成易读、易分析的图片。

5)生成bootchart.png图片:
    到这里要夸奖下android做的比较贴心,已经写好了脚本将bootchart测量生成的数据直接从开发板上打包出来,生成bootchart.tgz
这个打包脚是源码的system/core/init/grab-bootchart.sh文件,和bootchart源码位于同一目录下。可以执行以下命令将手机中的这五个
文件打包到PC上:

apuser@BaokunYinubt:~/Android/system/core/init$ ./grab-bootchart.sh

    此时在当前目录就可以看到bootchart.tgz文件,然后将该压缩文件复制到bootchart-0.9目录中,并进入该目录,执行在第(1)步中生成的bootchart.jar,

就可以在当前目录中生成bootchart.png图片了:

java -jar bootchart.jar ./bootchart.tgz
执行结果:
  Parsing examples/bootchart.tgz
  Wrote image: ./bootchart.png

    此时就可以在当前目录中看到bootchart.png文件了。

(6)如果你到了这一步,那么恭喜你,你已经成功使用bootchart工具完成了测量。接下来就可以使用看图工具分析该图片了。这就需要具体分析了,在此我就不再罗嗦了。

下面直接上一张我生成的图片吧:

注意:如果使用过bootchart,每次开机都会进行信息采集,会大约占用7%的开销,如果不想进行收集,需要把目录bootchart从手机上删除
注:要重新收集数据时,需做以下步骤:
# cd /data
# rm –r bootchart
# rm bootchart-start




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值