diff --git a/Software/Application/BootChart/Android_8_上使用_bootchart.md b/Software/Application/BootChart/Android_8_上使用_bootchart.md new file mode 100644 index 0000000..1e6155e --- /dev/null +++ b/Software/Application/BootChart/Android_8_上使用_bootchart.md @@ -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 + +也可以将以上命令按自己的实际需求写成脚本文件来使用。