学习记录:使用Bootchart分析安卓系统开机启动时长

最近在尝试优化一款安卓开发板上的开机启动时间,在使用bootchart获取时长分析的部分,走了很多的弯路,最终是找到了方法,特此记录一下,希望能够帮助到跟我遇到同样问题的人

环境说明

虚拟机:VMware 15 pro

Linux内核版本:Linux ubuntu 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

Android源码版本:Android 11

开发板:飞凌OKMX8MPQ-C

步骤

1.在ubuntu中安装bootchart

命令:

复制代码
1.sudo apt-get update

2.sudo apt-get upgrade

3.
//ubuntu18.04上面找不到这个
//sudo apt-get install bootchart
//可以安装这一个
sudo apt-get install pybootchartgui

2.通过安卓自带的bootchart工具来获取开机启动数据

复制代码
//进入adb shell
adb shell 
//获取root权限
su
//使能bootchart以支持获取启动数据
touch /data/bootchart/enabled
//重启安卓系统
reboot

//等待重启之后,建立连接

//进入adb shell
adb shell
//获取root权限
su
//进入bootchart目录下
cd /data/bootchart/
//将刚才bootchart获取到的数据打包
tar -czf bootchart.tgz enabled header proc_diskstats.log proc_ps.log proc_stat.log
//退出root权限
exit
//退出adb shell
exit
//获取安卓系统中刚才打包好的数据,放在你想要放的路径下
adb pull /data/bootchart/bootchart.tgz  /home/xxx
//进入该路径
cd /home/xxx
//使用bootchart命令生成图片
bootchart bootchart.tgz

一般来说,当你看到如下代码的时候,就证明成功了

复制代码
swy@ubuntu:~$ bootchart bootchart.tgz
parsing 'bootchart.tgz'
parsing 'enabled'
parsing 'header'
parsing 'proc_diskstats.log'
parsing 'proc_ps.log'
warning: no parent for pid '2' with ppid '0'
parsing 'proc_stat.log'
merged 0 logger processes
pruned 36 process, 0 exploders, 7 threads, and 0 runs
False
bootchart written to 'bootchart.png'

但是在某种情况下,也会出现一些错误,比如说折磨了我一上午的

ZeroDivisionError: float division by zero

复制代码
Traceback (most recent call last)
  File "/usr/bin/bootchart", line 23, in <module>
    sys.exit(main())
  File "/usr/lib/python2.7/dist-packages/pybootchartgui/main.py", line 137, in main
    render()
  File "/usr/lib/python2.7/dist-packages/pybootchartgui/main.py", line 128, in render
    batch.render(writer, res, options, filename)
  File "/usr/lib/python2.7/dist-packages/pybootchartgui/batch.py", line 41, in render
    draw.render(ctx, options, *res)
  File "/usr/lib/python2.7/dist-packages/pybootchartgui/draw.py", line 282, in render
    draw_chart(ctx, IO_COLOR, True, chart_rect, [(sample.time, sample.util) for sample in disk_stats], proc_tree)
  File "/usr/lib/python2.7/dist-packages/pybootchartgui/draw.py", line 201, in draw_chart
    yscale = float(chart_bounds[3]) / max(y for (x,y) in data)
ZeroDivisionError: float division by zero

我在网上找了很多方法,最终科学上网之后,终于找到了

复制代码
sudo vim /usr/lib/python2.7/dist-packages/pybootchartgui/draw.py

进到这个文件里,修改第200行和201行的代码

复制代码
200         xscale = float(chart_bounds[2]) / max(0.00001, max(x for (x,y) in data))
201         yscale = float(chart_bounds[3]) / max(0.00001, max(y for (x,y) in data))

linux 查看文件的行标的命令:

vi命令进入该文件之后,输入如下命令,回车即可

复制代码
:set nu

然后替换完成之后,再重新执行bootchart命令即可

说明:

使用bootchart需要注意的是

1.ubuntu环境需要安装bootchart,安装完成后输入

复制代码
bootchart --version

如果可以看到bootchart的版本即可

2.一定要确保自己的安卓系统上有bootchart,这个绝大部分的安卓系统中都有的,但是并不是默认启动的,大家在按照上面的指令一步步走的时候,如果哪个指令出现了找不到文件或者找不到路径,那么首先需要确定是否安卓系统中已经安装了bootchart,且是否启动了。

写在最后

因为这个bootchart折磨了我好几天了,我基本上把网上能够找到的方法都试了一遍,然后把GPT告诉我的方法也都试了一遍,不知道它有没有糊弄我,反正是我都试了,可能是有的有用,有的没用(我觉得我这几天是被GPT给糊弄了,我最后还是百度其他人的博客之后才解决的),如果大家在按照这篇博客的指导,没有完成效果,在评论区留言,我基本上每天都会看csdn,看到了,我会尽力用自己的经验帮助大家解决问题。

相关推荐
Kapaseker2 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴2 小时前
Android17 为什么重写 MessageQueue
android
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android