新建文件 Software/Application/bootchart/Android_8_上使用_bootchart.md
This commit is contained in:
parent
1f24686dc2
commit
86dd67fe85
|
@ -0,0 +1,141 @@
|
|||
# Android 8 上使用 bootchart
|
||||
|
||||
## 基本原理
|
||||
|
||||
bootchart 可以在 Android 系统启动到 init 阶段时开始收集系统信息,并保存成 Log 文件。可在开发机上使用 bootchart 命令对这些 Log 文件进行分析,生成图表。
|
||||
|
||||
Android 8 上默认编译 bootchart 为 init 内置工具。使用方式可参考:
|
||||
|
||||
${AndroidSrc}/system/core/init/README.md
|
||||
|
||||
中与 bootchart 有关的内容。也可以通过分析以下文件了解 bootchart 的启动流程和触发条件。
|
||||
|
||||
${AndroidSrc}/system/core/init/Android.mk
|
||||
${AndroidSrc}/system/core/init/builtins.cpp
|
||||
${AndroidSrc}/system/core/init/bootchart.cpp
|
||||
${AndroidOS}/init.rc
|
||||
|
||||
通过上述文件分析可知,bootchart 会在
|
||||
|
||||
${AndroidOS}/data/bootchart/enabled
|
||||
|
||||
文件存在的情况下被使能。系统启动时,触发其执行的条件可以分析 init.rc 文件,主要触发流程为:
|
||||
|
||||
on property:sys.boot_from_charger_mode=1
|
||||
trigger late-init
|
||||
|
||||
on late-init
|
||||
trigger post-fs-data
|
||||
|
||||
on post-fs-data
|
||||
bootchart start
|
||||
|
||||
结束 bootchart 执行的条件为:
|
||||
|
||||
on property:sys.boot_completed=1
|
||||
bootchart stop
|
||||
|
||||
## 使用方法
|
||||
|
||||
在开发机上先安装 bootchart 和 pybootchartgui 用于处理和分析开机数据:
|
||||
|
||||
sudo apt-get install bootchart
|
||||
sudo apt-get install pybootchartgui
|
||||
|
||||
接着在目标机上使能 bootchart:
|
||||
|
||||
$ touch /data/bootchart/enabled
|
||||
|
||||
之后重启目标机系统,bootchart 会在启动时自动开始和结束收集目标机系统的启动数据信息。系统启动后在 /data/bootchart/ 路径下会多出几个 Log 文件。使用 adb 命令将这些 Log 文件传输到开发机:
|
||||
|
||||
$ adb pull /data/bootchart/
|
||||
|
||||
接下来,在开发机上使用以下脚本文件对 Log 文件进行分析并生成 PNG 文件:
|
||||
|
||||
```sh
|
||||
#!/bin/bash
|
||||
|
||||
FILES="header proc_stat.log proc_ps.log proc_diskstats.log"
|
||||
TMPTAR="bootchart.tgz"
|
||||
|
||||
tar -cvzf $TMPTAR $FILES
|
||||
bootchart --format=svg -o bootchart.svg $TMPTAR
|
||||
rm -rf $TMPTAR
|
||||
|
||||
```
|
||||
|
||||
或者可以使用源码中官方脚本一次完成 Log 文件的下载和分析工作:
|
||||
|
||||
${AndroidSrc}/system/core/init/grab-bootchart.sh
|
||||
|
||||
其内容如下:
|
||||
|
||||
```sh
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
|
||||
# This script is used to retrieve a bootchart log generated by init.
|
||||
|
||||
# All options are passed to adb, for better or for worse.
|
||||
|
||||
# See the readme in this directory for more on bootcharting.
|
||||
|
||||
|
||||
|
||||
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"
|
||||
|
||||
|
||||
|
||||
for f in $FILES; do
|
||||
|
||||
adb "${@}" pull $LOGROOT/$f $TMPDIR/$f 2>&1 > /dev/null
|
||||
|
||||
done
|
||||
|
||||
(cd $TMPDIR && tar -czf $TARBALL $FILES)
|
||||
|
||||
bootchart ${TMPDIR}/${TARBALL}
|
||||
|
||||
gnome-open ${TARBALL%.tgz}.png
|
||||
|
||||
echo "Clean up ${TMPDIR}/ and ./${TARBALL%.tgz}.png when done"
|
||||
|
||||
|
||||
```
|
||||
|
||||
## 性能对比
|
||||
|
||||
Google 还给我们提供了一个比较脚本,用来比较两次开机的数据:
|
||||
|
||||
${AndroidSrc}/system/core/init/compare-bootcharts.py
|
||||
|
||||
首先将两次得到的 Log 文件打包成 tgz 包并保存到不同的目录中如 cmp1_dir 和 cmp2_dir:
|
||||
|
||||
$ FILES="header proc_stat.log proc_ps.log proc_diskstats.log"
|
||||
$ TMPTAR="bootchart.tgz"
|
||||
$ cd cmp1_dir
|
||||
$ tar -cvzf $TMPTAR $FILES
|
||||
$ cd ../cmp2_dir
|
||||
$ tar -cvzf $TMPTAR $FILES
|
||||
$ cd ..
|
||||
|
||||
接着使用如下命令处理两次开机数据
|
||||
|
||||
$ ${AndroidSrc}/compare-bootcharts.py cmp1_dir cmp2_dir
|
||||
|
||||
也可以将以上命令按自己的实际需求写成脚本文件来使用。
|
Loading…
Reference in New Issue