BootChart在Android中的应用1简介Bootchart是一个能对GNU/Linux boot过程进行性能分析并把结果直观化的工具。
它在boot过程中搜集资源利用情况及进程信息然后以PNG,SVG或EPS格式来显示结果。
BootChart包含数据收集工具和图像产生工具,数据收集工具在原始的BootChart中是独立的shell程序,但在Android中,数据收集工具被集成到了init程序中。
2BootChart使用步骤概述∙在主机上安装BootChart∙建立有BootChart支持的init文件∙安装init到系统镜像∙使能启动时的BootChart功能∙收集系统产生的数据∙根据产生的数据生成图表∙结果分析以下部分将对这些步骤进行详细描述(环境:Ubuntu9.04,Android1.6)。
3详细说明∙在主机上安装BootChart$sudo apt-get install bootchart注:由于BootChart是用Java语言实现,所以要求其所运行的主机安装Java包。
∙创建支持BootChart功能的‘init’文件Andoid系统中运行的第一个程序是'init',其所在的目录为Andoid文件系统的根目录下(即/)。
'init'是一个由内核启动的用户级进程,主要是对系统进行初始化和根据init.rc与init.xxx.rc文件建立几个基本的服务。
创建'init'时对BootChart的数据收集功能是可选的,默认的'init'是不支持BootChart 的数据收集功能的。
要想在Andoid中应用BootChart,必须创建支持BootChart数据收集功能的'init'。
$cd~/myandroid$export INIT_BOOTCHART=true#vim system/core/init/Android.mk20ifeq($(strip$(INIT_BOOTCHART)),true)21LOCAL_SRC_FILES+=bootchart.c22LOCAL_CFLAGS+=-DBOOTCHART=123endif#touch system/core/init/init.c#cd device/qcom/msm7630_surf#vim BoardConfig.mkifeq($(TARGET_BUILD_VARIANT),user)BOARD_KERNEL_CMDLINE:=androidboot.hardware=qcomandroidboot.bootchart=xifangqing(Add this line)#vim system/core/rootdir/init.rc(loglevel3改成8,这样INFO可以打印)adb shell dmesg查看$make clean(删除out目录)$make(make kernel即可system/core..)∙安装'init'到系统镜像将生成的'init'拷贝到目标板的'/'目录下。
(具体方法:将myandroid/out/target/product/zoom2/root下生成的init文件拷贝到~/work/root目录下,重新编译内核下载到板子上即可在/目录下找到支持BOOTCHART的init文件)∙使能系统启动时的BootChart功能#echo120>/data/bootchart-start重启系统,当'init'开始运行时,BootChart也开始收集数据,知道设定的时间结束(120seconds=2minutes).∙收集系统产生的数据'init'过程激活BootChart数据收集工具,并将数据存储到目标系统的/data/bootchart路径下。
BootChart会在/data/bootchart目录下生成三个文件:proc_diskstats.logproc_ps.logproc_stat.log注:要重新收集数据时,需做以下步骤:#cd/data#rm–r bootchart#rm bootchart-start重启系统#echo120>/data/bootchart-start重启系统后就可以在/data/bootchart目录下看到新的数据∙根据产生的数据生成图表将上一步骤中产生的三个文件拷贝到主机上,运行如下命令渲染图像:$tar czf bootchart.tgz*.log$bootchart-f png bootchart.tgz会在当前目录下生成bootchart.png文件,即为目标系统Android启动时的信息。
∙结果分析一般来说,图表的最上方是CPU和disk的利用情况,从左到右是时间轴,下方是各进程的运行状态条,显示各进程的开始时间和结束时间以及对cpu和I/O的利用情况。
我们关注的主要是各进程的运行时间以及对cpu的利用情况,进而优化系统。
bootchart工具在Android系统开机测量中的应用bootchart本是一个开源工具,用可视化的方式对GUN/LINUX的开机启动过程进行性能分析,包括资源的使用,如CPU,磁盘等,各进程的执行时间等信息。
根据分析结果,确定系统启动的性能瓶颈,制定相应的优化策略。
关于bootchart的来历和说明件其官方网站:点击打开链接Android系统中已有一份bootchart的c实现,位于system/core/init/bootchart.c中。
bootchart对Android开机测量是通过内建在init进程中实现的,在后台执行测量。
不过bootchart的测量时段是从bootchart被初始化之后到home screen出来之前,不包括bootloader和kernel的执行时间。
我的系统是UBuntu10.04,现将整个使用步骤归纳如下:1)、UBuntu下bootchart工具的安装2)、bootchart在Android下的编译3)、bootchart在Android下的执行4)、bootchart测量结果的图形化过程下面依次对上述四个步骤进行详细说明。
1、UBuntu下bootchart工具的安装需要安装的工具有两个bootchart和pybootchartgui,执行命令如下:[html]view plaincopysudo apt-get install bootchartsudo apt-get install pybootchartgui2、bootchart在Android下的编译Android系统编译时,默认的没有打开bootchart的编译开关,即没有把bootchart编译进系统中。
要把bootchart编进系统分为两种情况了:1)、系统没有被编译过或者执行了make clean命令,可以执行以下命令:[html]view plaincopy$cd mydroid$export INIT_BOOTCHART=true$make clean$make2)、系统已经编译过,现在只是要添加bootchart进系统中,执行以下命令:‘$touch system/core/init/init.c$m INIT_BOOTCHART=true其中touch命令的作用就是将init.c文件的最后修改时间改为当前时间,这样保证init.c文件会被重新make,而bootchart就是在init.c中被调用,从而保证bootchart会被编进系统中。
3、bootchart在Android下的执行1}、将编译生成的带有bootchart工具的Android系统重新烧录到开发板上,并启动系统2)、在UBuntu上通过adb connect连接到开发板,然后执行:$adb shell'echo120>/data/bootchart-start'3)、执行命令:$adb shell'mkdir/data/bootchart'在开发板上系统的/data/目录下新建目录bootchart/用来存放bootchart的测量结果,后面要利用这些文件生成可视化图片4)、重新启动开发板,在开发板的Android系统的/data/bootchart/目录下将看到以下文件:#ls-l-rw-rw-rw-root root4522010-01-0100:00header-rw-r--r--root root02010-01-0100:00kernel_pacct-rwxr-xr-x root root10201952010-01-0100:02proc_diskstats.log-rwxr-xr-x root root42529662010-01-0100:02proc_ps.log-rwxr-xr-x root root1382152010-01-0100:02proc_stat.log到此为止,bootchart执行测量后生成的测量数据已经完成,看上面有3个.log文件,下面需要将这些数据进一步处理成易读、易分析的图片。
4、bootchart测量结果的图形化过程1)、到这里要夸奖下android做的比较贴心,已经写好了脚本将bootchart测量生成的数据直接从开发板上打包出来,生成bootchart.tgz。
这个打包脚是Android源码的system/core/init/grab-bootchart.sh文件,和bootchart源码位于同一目录下。
脚本的内容如下:#!/bin/sh##this script is used to retrieve the bootchart log generated#by init when compiled with INIT_BOOTCHART=true.##for all details,see//device/system/init/README.BOOTCHART#TMPDIR=/tmp/android-bootchartrm-rf$TMPDIRmkdir-p$TMPDIRLOGROOT=/data/bootchartTARBALL=bootchart.tgzFILES="header proc_stat.log proc_ps.log proc_diskstats.log kernel_pacct"for f in$FILES;doadb pull$LOGROOT/$f$TMPDIR/$f2>&1>/dev/nulldone(cd$TMPDIR&&tar-czf$TARBALL$FILES)cp-f$TMPDIR/$TARBALL./$TARBALLecho"look at$TARBALL"从脚本的LOGROOT一项可以看出,步骤3的3)中,新建存放bootchart测量结果的文件目录不可以随便更改的,要保证所建目录与脚本的LOGROOT项保持一致。