BOOTCHART ANDROID文档(开机慢)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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.mk
20ifeq($(strip$(INIT_BOOTCHART)),true)
21LOCAL_SRC_FILES+=bootchart.c
22LOCAL_CFLAGS+=-DBOOTCHART=1
23endif
#touch system/core/init/init.c
#cd device/qcom/msm7630_surf#vim BoardConfig.mk
ifeq($(TARGET_BUILD_VARIANT),user)
BOARD_KERNEL_CMDLINE:=androidboot.hardware=qcom
androidboot.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.log
proc_ps.log
proc_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 plaincopy
sudo apt-get install bootchart
sudo apt-get install pybootchartgui
2、bootchart在Android下的编译
Android系统编译时,默认的没有打开bootchart的编译开关,即没有把bootchart编译进系统中。

要把bootchart编进系统分为两种情况了:
1)、系统没有被编译过或者执行了make clean命令,可以执行以下命令:
[html]view plaincopy
$cd mydroid
$export INIT_BOOTCHART=true
$make clean
$make
2)、系统已经编译过,现在只是要添加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-bootchart
rm-rf$TMPDIR
mkdir-p$TMPDIR
LOGROOT=/data/bootchart
TARBALL=bootchart.tgz
FILES="header proc_stat.log proc_ps.log proc_diskstats.log kernel_pacct"
for f in$FILES;do
adb pull$LOGROOT/$f$TMPDIR/$f2>&1>/dev/null
done
(cd$TMPDIR&&tar-czf$TARBALL$FILES)
cp-f$TMPDIR/$TARBALL./$TARBALL
echo"look at$TARBALL"
从脚本的LOGROOT一项可以看出,步骤3的3)中,新建存放bootchart测量结果的文件目录不可以随便更改的,要保证所建目录与脚本的LOGROOT项保持一致。

打包后将在当前目录下,即system/core/init/下生成bootchart.tgz文件。

2)、在bootchart.tgz所在目录下执行命令:
$bootchart./bootchart.tgz
这样就在system/core/init/目录下生成了bootchart.png,如下图所示
5、问题总结
在执行第4步的2)时,即执行命令:$bootchart./bootchart.tgz
时,报错啦,如下错误:
parsing'./bootchart.tgz'
parsing'header'
parsing'proc_stat.log'
parsing'proc_ps.log'
warning:no parent for pid'2'with ppid'0'
parsing'proc_diskstats.log'
parsing'kernel_pacct'
merged0logger processes
pruned61process,0exploders,2threads,and0runs
False
Traceback(most recent call last):
File"/usr/bin/bootchart",line23,in<module>
sys.exit(main())
File"/usr/lib/pymodules/python2.7/pybootchartgui/main.py",line137,in main
render()
File"/usr/lib/pymodules/python2.7/pybootchartgui/main.py",line128,in render
batch.render(writer,res,options,filename)
File"/usr/lib/pymodules/python2.7/pybootchartgui/batch.py",line41,in render
draw.render(ctx,options,*res)
File"/usr/lib/pymodules/python2.7/pybootchartgui/draw.py",line282,in render
draw_chart(ctx,IO_COLOR,True,chart_rect,[(sample.time,sample.util)for sample in disk_stats],proc_tree)
File"/usr/lib/pymodules/python2.7/pybootchartgui/draw.py",line201,in draw_chart
yscale=float(chart_bounds[3])/max(y for(x,y)in data)
ZeroDivisionError:float division by zero
临门一脚出了问题,甚为恼火,找了一圈,总算解决了。

解决的具体办法见连接:点击打开链接,在链接网页内找到draw.py,parsing.py,samples.py三个文件的下载链接并下载,然后替换ubuntu上/usr/share/pyshared/pybootchartgui/下对应的文件,并再次执行命令:
bootchart./bootchart.tgz
即可。

开机速度慢原因之一:
nand_ids.c
struct nand_flash_dev nand_flash_ids[]={
{"NAND1GiB1,8V16-bit",0xB3,4096,1024,4096<<6,
LP_OPTIONS16|NAND_SKIP_BBTSCAN|NAND_USE_FLASH_B(add)
}
/sun_yfs/blog/item/7ded46101c9b571fb9127b09.html
接著,將bootchart.tgz製作成圖檔:
$java-jar/usr/share/bootchart/bootchart.jar/tmp/android-bootchart/bootchart.tgz Parsing/tmp/android-bootchart/bootchart.tgz
Wrote image:./bootchart.png。

相关文档
最新文档