当前位置: 首页 > news >正文

安卓开机启动性能优化之-bootchart相关工具使用及查看

背景:

开机启动相关的详细信息,一般都是可以通过logcat中查看boot_progress相关查看,这种方式查看相对不那么方便,毕竟开机过程中涉及的进程较多,要查看也较多,而且还经常需要查看代码才可以对应起来,但有另一种方式可以通过看bootchart方式更加直观

ubuntu上相关方法

步骤1:

adb shell touch /data/bootchart/enabled

然后重启设备
重启后就会在对应的data/bootchart目录有如下文件
在这里插入图片描述这些日志文件其实就是bootchart绘制图片的基础,下面这些步骤其实就是对这log转换成图表。

步骤2:

安装相关的bootchart的库

test@test:~/demos$ git clone https://gitee.com/wasdzy/bootchart
Cloning into 'bootchart'...
remote: Enumerating objects: 2614, done.
remote: Counting objects: 100% (2614/2614), done.
remote: Compressing objects: 100% (956/956), done.
Receiving objects:  43% (1125/2614), 868.00 KiB | 561.00 KiB/s
remote: Total 2614 (delta 1620), reused 2614 (delta 1620), pack-reused 0
Receiving objects: 100% (2614/2614), 1.85 MiB | 767.00 KiB/s, done.
Resolving deltas: 100% (1620/1620), done.

再进行编译

test@test:~/demos$ cd bootchart/
test@test:~/demos/bootchart$ make

可以看到已经编译出来了pybootchartgui.py文件
在这里插入图片描述
再进行安装

test@test:~/demos/bootchart$ sudo make install
[sudo] password for test: 
install -d /usr/lib/python3.8/site-packages/pybootchartgui
cp pybootchartgui/*.py /usr/lib/python3.8/site-packages/pybootchartgui
install -D -m 755 pybootchartgui.py /usr/bin/pybootchartgui
[ -z "" ] && ( cd /usr/lib/python3.8/site-packages/pybootchartgui ; \python3 /usr/lib/python3.8/py_compile.py *.py ; \PYTHONOPTIMIZE=1 python3 /usr/lib/python3.8/py_compile.py *.py ); :
install -d /lib/bootchart/tmpfs
install -m 755 -D bootchartd /sbin/bootchartd
install -m 644 -D bootchartd.conf /etc/bootchartd.conf
install -m 755 -D bootchart-collector /lib/bootchart/bootchart-collector
mkdir -p /lib/systemd/system
install -m 0644 bootchart2.service \bootchart2-done.service \bootchart2-done.timer \/lib/systemd/system
install -m 644 -D README /usr/share/docs/bootchart/README
install -m 644 -D README.pybootchart /usr/share/docs/bootchart/README.pybootchart
mkdir -p /usr/share/man/man1
gzip -c bootchart2.1 > /usr/share/man/man1/bootchart2.1.gz
gzip -c bootchartd.1 > /usr/share/man/man1/bootchartd.1.gz
gzip -c pybootchartgui.1 > /usr/share/man/man1/pybootchartgui.1.gz

步骤3:

执行aosp自带的grab-bootchart.sh

test@test:~/disk2/aosp14$ ./system/core/init/grab-bootchart.sh 
adb server version (41) doesn't match this client (39); killing...* daemon started successfully
Traceback (most recent call last):File "/usr/bin/pybootchartgui", line 20, in <module>from pybootchartgui.main import main
ModuleNotFoundError: No module named 'pybootchartgui'
gio: file:///home/test/disk2/aosp14/bootchart.png: Error when getting information for file “/home/test/disk2/aosp14/bootchart.png”: No such file or directory
Clean up /tmp/android-bootchart/ and ./bootchart.png when done

发现还是会传递报错找不到,干脆直接依赖编译出来的
手动修改init/grab-bootchart.sh文件

diff --git a/init/grab-bootchart.sh b/init/grab-bootchart.sh
index 2c56698a1..37c5a4eeb 100755
--- a/init/grab-bootchart.sh
+++ b/init/grab-bootchart.sh
@@ -17,6 +17,7 @@ for f in $FILES; doadb "${@}" pull $LOGROOT/$f $TMPDIR/$f 2>&1 > /dev/nulldone(cd $TMPDIR && tar -czf $TARBALL $FILES)
-pybootchartgui ${TMPDIR}/${TARBALL}
+#pybootchartgui ${TMPDIR}/${TARBALL}
+~/demos/bootchart/pybootchartgui.py ${TMPDIR}/${TARBALL}xdg-open ${TARBALL%.tgz}.pngecho "Clean up ${TMPDIR}/ and ./${TARBALL%.tgz}.png when done"

最重要就是把pybootchartgui直接变成~/demos/bootchart/pybootchartgui.py
再执行

test@test:~/disk2/aosp14$ ./system/core/init/grab-bootchart.sh
parsing '/tmp/android-bootchart/bootchart.tgz'
parsing 'header'
parsing 'proc_stat.log'
parsing 'proc_ps.log'
parsing 'proc_diskstats.log'
merged 0 logger processes
pruned 66 process, 0 exploders, 17 threads, and 0 runs
bootchart written to 'bootchart.png'
Clean up /tmp/android-bootchart/ and ./bootchart.png when done

注意如果有的机器有ImportError: No module named cairo报错,则需要sudo apt-get install python-cairo
执行后自动就打开了表格图:
在这里插入图片描述

windows上相关方法

上面是对于ubuntu系统上,也可以windows上使用,因为上面说过本质其实就是data/bootchart下面日志进行解析生成png
这里可以把日志打包,然后bootchart解析。
adb shell进入设备对日志进行打包:

emulator_x86_64:/data/bootchart #  tar -czvf bcl.tar.gz *log
proc_diskstats.log
proc_ps.log
proc_stat.log

打包好成了 bcl.tar.gz文件,再进行导出用bootchart.jar进行解析生成图片
bootchart.jar下载地址:
https://share.weiyun.com/NdM2ZE4F

接下来在导出日志进行解析

test@test:~/Downloads$ adb pull /data/bootchart/bcl.tar.gz .
test@test:~/Downloads$ java -jar bootchart.jar bcl.tar.gz 
Parsing bcl.tar.gz
Wrote image: ./bcl.png

在这里插入图片描述

bootchart前后对比法:

上面通过图形绘制绘制出开机启动的时间后,可以通过图形大概看出时间点,但是明显图形时间坐标不够精确,那么优化前后有没有什么方法可以可以精确对比出两次优化时间呢?这个android其实也是有自带相关的工具

具体可以参考如下py文件:
system/core/init/compare-bootcharts.py

具体原理可以看这个脚本,就是对比相关主要进程的log的time

在这里插入图片描述

具体的使用对比方式:
log文件打包成bootchart.tgz
在这里插入图片描述
在这里插入图片描述
然后使用如下命令:

test@test:~/Downloads$ ~/disk2/aosp14/system/core/init/compare-bootcharts.py bcl1 bcl
process: baseline experiment (delta)- Unit is ms (a jiffy is 9 ms on the system)
------------------------------------
/system/bin/surfaceflinger: 6561 5628 (-933)
/system/bin/bootanimation: 7104 6104 (-1000)
zygote64: 6361 5438 (-923)
zygote: 6361 5447 (-914)
system_server: 17428 15723 (-1704)
bootanimation ends at: 31809 30142 (-1666)

上面就有对比出相关surfaceflinger,bootanimation,system_server时间等

具体详情试看方式:
投屏专题部分:
https://mp.weixin.qq.com/s/IGm6VHMiAOPejC_H3N_SNg

更多framework详细代码和资料参考如下链接

hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

参考相关链接:
https://blog.csdn.net/zhimokf/article/details/137958615

更多framework假威风耗:androidframework007

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Django】在vscode中新建Django应用并新增路由
  • 模拟电子技术-实验四 二极管电路仿真
  • IDEA缓存和索引
  • css中如何清除浮动
  • js点击或者双击页面使其全屏,并且内容自适应
  • C++ : 序列容器之Vector
  • 面试场景题系列--(3)如何避免超预期的高并发压力压垮系统?限流算法--xunznux
  • 微服务架构下Mojo模型的创新应用:细粒度服务与智能优化
  • 【LLM】-08-搭建问答系统-语言模型,提问范式与 Token
  • 虚拟机centos9搭建wordpress
  • c++ 自定义异常
  • 相机的内参与外参
  • 端到端自动驾驶科普向
  • 数据结构和算法入门
  • 调度器——DolphinScheduler讲解及安装教程
  • [Vue CLI 3] 配置解析之 css.extract
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • co模块的前端实现
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Material Design
  • php中curl和soap方式请求服务超时问题
  • 从零开始的无人驾驶 1
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 开源SQL-on-Hadoop系统一览
  • 理清楚Vue的结构
  • 微信小程序设置上一页数据
  • 第二十章:异步和文件I/O.(二十三)
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • (003)SlickEdit Unity的补全
  • (2)空速传感器
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (ZT)薛涌:谈贫说富
  • (七)Activiti-modeler中文支持
  • (三)docker:Dockerfile构建容器运行jar包
  • (十二)springboot实战——SSE服务推送事件案例实现
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • 、写入Shellcode到注册表上线
  • ./configure,make,make install的作用
  • .NET Core WebAPI中封装Swagger配置
  • .Net IE10 _doPostBack 未定义
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .net6Api后台+uniapp导出Excel
  • .NET大文件上传知识整理
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .Net中的设计模式——Factory Method模式
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @GetMapping和@RequestMapping的区别
  • [1159]adb判断手机屏幕状态并点亮屏幕
  • [AI Google] 使用 Gemini 取得更多成就:试用 1.5 Pro 和更多智能功能
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [CC-FNCS]Chef and Churu