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源代码的根目录下执行):
编译后重新烧机,并且把init文件push到手机中替换原来的init文件:$export INIT_BOOTCHART=true //在bootchart.h文件中把bootchart宏设置为1,就不用执行这一步了 $touchsystem/core/init/bootchart.h //touch命令能够创建一个空白文件,或者改变文件的创建时间 $touch system/core/init/init.h
(3)启动Bootchart功能:adb push out/target/product/generic/root/init /init
在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目录中查看是否生成了需要的文件:
如果成功生成了这5个文件,说明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.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
此时就可以在当前目录中看到bootchart.png文件了。Parsing examples/bootchart.tgz Wrote image: ./bootchart.png
(6)如果你到了这一步,那么恭喜你,你已经成功使用bootchart工具完成了测量。接下来就可以使用看图工具分析该图片了。这就需要具体分析了,在此我就不再罗嗦了。
下面直接上一张我生成的图片吧:
注意:如果使用过bootchart,每次开机都会进行信息采集,会大约占用7%的开销,如果不想进行收集,需要把目录bootchart从手机上删除 注:要重新收集数据时,需做以下步骤: # cd /data # rm –r bootchart # rm bootchart-start