Android Bootchart使用

2023-11-20

目录

  • 1,bootchart简介
  • 2,bootchart 在 android 平台的使用步骤(复杂方式, old)
  • 3,bootchart 在 android 平台的使用步骤(方便方式, new)
  • 4,修改bootchart抓取的停止时间
  • 5,可能遇到得问题
  • 6,bootchart 图形分析

1. bootchart 简介

bootchart 是一个用于 linux 启动过程性能分析的开源工具软件,在系统启动过程中自动收集 CPU 占用率、磁盘吞吐率、进程等信息,并以图形方式显示分析结果,可用作指导优化系统启动过程。bootchart 让用户可以很直观的查看系统启动的过程和各个过程耗费的时间,以便让用户能够分析启动过程,从而进行优化以提高启动时间。它由 bootchartd 服务和 bootchart-render 两部分组成,后者主要负责生成启动流程的分析结果图。
Android 系统源码中有 bootchart 的实现,路径在 system/core/init/bootchart.cpp 中, bootchart 通过内嵌在 init 进程中实现,在后台执行测量。不过 bootchart 的测量时段是 init 进程启动之后,不包含 uboot 和 kernel 的启动时间。

2,bootchart 在 android 平台的使用步骤(复杂方式, old)

2.1,使能调试设备的bootchart程序,进行设备必要的开机log: adb shell ‘touch /data/bootchart/enabled’
2.2,在reboot调试设备后,进入/data/bootchart目录,先行删除enabled, 再执行 tar -zcf bootchart.tgz *, 接着adb pull /data/bootchart/bootchart.tgz 到本地,拷贝到ubuntu;
2.3,ubuntu 机安装 bootchart 工具:
sudo apt-get install bootchart
sudo apt-get install pybootchartgui
2.4,生成bootchart图表:
bootchart bootchart.tgz

3,bootchart 在 android 平台的使用步骤(方便方式, new)

3.1,使能调试设备的bootchart程序,进行设备必要的开机log: adb shell ‘touch /data/bootchart/enabled’
3.2, 在adb reboot调试设备后,ubuntu电脑连接调试设备,终端android根目录执行命令:
android$ ./system/core/init/grab-bootchart.sh
bootchart的图标即生成在android根目录

4,修改bootchart抓取的停止时间

android高版本上不支持简单的设置方式调整bootchart的结束时间,只能在init.rc中修改,bootchart的启动和结束方式如下:

...
	# Start bootcharting as soon as possible after the data partition is
    # mounted to collect more data.
    mkdir /data/bootchart 0755 shell shell encryption=Require
    bootchart start
    ...
on property:sys.boot_completed=1
	bootchart stop

原生的逻辑中,在开机完成时,系统会设置sys.boot_completed属性=1,此时bootchart停止抓取信息;
我们可以更改stop的条件,自定义一个属性来实现停止,我自己实现可控停止方式如下,在开机后,手动去设置这个属性值=1:

on property:vendor.boot.complete=1
    bootchart stop

5,可能遇到得问题

在ubuntu里生成bootchart表时,可能会遇到如下问题

uluxy181@ubuntu16-010:~/workspace/phase5/android$ ./system/core/init/grab-bootchart.sh
18 KB/s (1194 bytes in 0.062s)
327 KB/s (42942 bytes in 0.127s)
589 KB/s (2440734 bytes in 4.045s)
366 KB/s (102575 bytes in 0.273s)
parsing '/tmp/android-bootchart/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'
merged 0 logger processes
pruned 146 process, 0 exploders, 4 threads, and 0 runs
False
Traceback (most recent call last):
  File "/usr/bin/pybootchartgui", 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
Clean up /tmp/android-bootchart/ and ./bootchart.png when done
uluxy181@ubuntu16-010:~/workspace/phase5/android$ 

解决办法:vim 打开/usr/lib/python2.7/dist-packages/pybootchartgui/draw.py
找到下面两行,将其修改为新得两行
#xscale = float(chart_bounds[2]) / max(x for (x,y) in data) //old
#yscale = float(chart_bounds[3]) / max(y for (x,y) in data) //old

xscale = float(chart_bounds[2]) / max(0.00001, max(x for (x,y) in data)) //new
yscale = float(chart_bounds[3]) / max(0.00001, max(y for (x,y) in data)) //new

6,bootchart 图形分析

整个图表以时间线为横轴,图标上方为 CPU 和 磁盘的利用情况,下方是各进程的运行状态条,显示各个进程的开始时间与结束时间以及对 CPU、I/O 的利用情况,我们关心的各个进程的运行时间以及 CPU 的使用情况,进而优化系统。
可以通过 Laucher 的启动完成时间判断开机完成完成时间,也就是开机动画结束的时间。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Bootchart使用 的相关文章

  • GCM 通知的自定义 UI

    In GCM Docs http developer android com google gcm gcm html其给定 它不提供任何内置用户界面或其他处理 消息数据 GCM 只是将收到的原始消息数据直接传递给 Android 应用程序
  • 关于android Sqlite在多进程情况下的安全性

    在我的应用程序中 存在多个进程 并且在每个进程中 我需要访问同一个SQLite数据库 当然 这意味着超过2个线程 所以我不仅担心SQLite的线程安全性 还担心SQLite的线程安全性 还有过程安全 这种情况的一种解决方案是使用内容提供者
  • 不支持动态值作为注释中的属性 - AspectJ Android [AOP Android]

    我正在使用自定义注释来记录用户单击的 id 但我收到一个错误 属性值必须是常量 我的代码片段如下 mAssetId Asset getContentId TrackEvent track event ArrayParams Params k
  • 如何以编程方式从 mipmap 文件夹加载图像? [复制]

    这个问题在这里已经有答案了 如何从 加载图像mipmap以编程方式保存文件夹 与可绘制对象一样 img setImageResource imageId 我使用的是Android Studio 1 2 1 In 安卓工作室我们有mipmap
  • 如何在发布版本中使用 Zebra EMDK?

    所以我有一台 Zebra MC330M 设备 我之前创建了一个应用程序 我想使用 PDA 内置的条形码扫描仪 如果在调试模式下运行我的应用程序 一切正常 我可以读取条形码 但是如果我创建暂存或释放版本 apk 则条形码读取器不活动 因此如果
  • 使用 ArrayAdapter 的 ListView 中的按钮

    我有一个使用 POJO 类填充的 ArrayAdapter 列表视图由 2 个布局组成 1 代表菜单项 1 代表类别 带分隔符的列表视图很好 后来我尝试在每个菜单项行中添加一个按钮来编辑其中的详细信息 当我尝试获取单击按钮的行的位置时 我遇
  • Android Material主题alpha颜色问题

    我已经创建了一个构建版本为 5 0 的应用程序 我在下面编写了主题
  • 要在进程中运行 dex,Gradle 守护进程需要更大的堆。目前有 910 MB

    实际上主要错误是 java exe完成非零退出值 1 首先我告诉你安装 studio 后遇到的每个问题 三天前 我刚刚安装了 android studio 并创建了新项目 1 首先它抛出错误 插件太旧 请更新到更新的版本 在谷歌上搜索后我改
  • 尝试使用掩码裁剪位图会抛出 IllegalArgumentException:

    我正在使用以下代码 public void cropSelection Bitmap bitmap annotationBitmap copy annotationBitmap getConfig true Canvas canvas ne
  • 首选项活动中的广告“没有足够的空间来显示广告!需要:<480, 75>,拥有:<432, 1073741823>”

    我试图在偏好活动中展示广告 但它从未出现 Logcat 始终显示消息 没有足够的空间来显示广告 想要 有 这就是我制作广告的方式 我对广告有自定义偏好 public class AdmobPreference extends Prefere
  • 创建用于 Android 库分发的 JAR

    我正在开发一个 android 库 并希望导出一个 JAR 文件 我可以分发该文件供其他人在他们的应用程序中使用 我不想分发源代码 因为它包含有关发布到我的网络服务器的详细信息 我尝试使用在 bin 目录中创建的 JAR 文件并将该 jar
  • 在 Android 5 上支持 BLE 外设角色的芯片组 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Android 5 0 Lollipop 引入的新 BLE 外设模式将不会在 Nexus 4 5 或 7 上启用 https code
  • 我可以在导航组件中使用多个 NavHostFragment 吗?

    如果您难以理解以下段落 请查看我制作的流程图 我目前正在制作一个带有 3 个顶级目的地的笔记应用程序 顶级目标之一 NotesList 显示用户创建的注释列表 NotesList 有一个过滤器按钮 可显示带有 FilterMenu 目标的底
  • 当创建 Android Jetpack Compose AndroidView 的参数发生变化时,如何替换它?

    我有一个应用程序 显示封装在其中的几个不同视图AndroidView 在下面重现的简单示例中 这些只是TextView实例 问题是更改文本 在本例中循环显示三个不同的值 似乎不会更新应用程序显示的内容 sealed class AppVie
  • 如何在维护数据的同时升级 docker 容器中的 postgres? 10.3 到最新的 10.x 或 12.x

    我的生产和本地主机中有一个 10 3 postgres docker 容器 在之前的一个question https stackoverflow com a 62789347 80353 我必须恢复在 10 5 中存档的转储 感谢您的回答
  • 如何在Webview中保存用户名和密码

    目前 我还在学习Android开发的过程中 所以如果我的这个问题对你来说不太容易理解 请原谅 我创建了一个 Android 应用程序 它使用 RecyclerView 显示一组列表 当用户单击列表中的每个名称时 它会将它们重定向到一组不同的
  • Android Windows:它们何时以及如何创建?

    我已经阅读了标准的 Windows 相关文档并翻阅了 一堆源代码 试图理解 Android 如何以及何时 窗口已创建 我相信我已经拥抱它并愿意 对其进行验证或更正 据我所知 只有两种方法可以获得 Window 对象的句柄 1 Activit
  • 随着速度变化,速度表针规绕其中心旋转

    Hi all 我编写了一个应用程序 其中有一个速度计 其指针垂直设置为 90 度 我试图以每秒变化的速度绕其中心旋转指针 我在文本视图中显示变化的速度 从 0 到 120 随机 我正在从远程服务获取速度并显示在文本视图中 因此 当速度发生变
  • Android 使用非公历

    我正在创建一个DatePickerDialogFragment用户将在其中选择出生日期 我想确保我可以处理非公历日期 我无法更改在我的设备上使用的日历类型 Android 是否允许用户切换日历类型 如果是的话 步骤是什么 到目前为止我还没有
  • 同时有两个操作栏(底部和向上)?

    我需要制作两个操作栏 顺便说一下我正在使用actionBarSherlock 所以我真正需要的是在正常操作栏上放置一个 欢迎屏幕 开关 并添加两个正常的 ActionBar 操作选项 与我需要的类似的是 Gmail 和地图 如下所示 htt

随机推荐

  • 蓝桥杯-稍大的字符串

    题目 标题 稍大的串 串可以按照字典序进行比较 例如 abcd 小于 abdc 如果给定一个串 打乱组成它的字母 重新排列 可以得到许多不同的串 在这些不同的串中 有一个串刚好给定的串稍微大一些 科学地说 它是大于已知串的所有串中最小的串
  • filter函数的用法_动态数组函数系列5

    FILTER函数是筛选函数 就是在源数据中按照我们的条件筛选出我们想要的数据 除了常规的数据筛选 还可以进行多条件的 且 或者 或 的筛选 下面我们来看看这个FILTER函数怎么用 如果不想看文字 直接拉到最后看视频吧 FILTER函数语法
  • 属性,服务,事件

    属性 即设备支持的可读和 或可设置的参数功能 以一个灯为例 灯的开关就可以定义为一个属性 用户可以读取该属性的当前数值来得知灯的开关状态 也可以通过对该属性进行设置来打开或者关闭这个灯 服务 如果设备的某个功能只能设置 不能获取 那么可以将
  • 微服务系统硬件要求_全面解析微服务系统监控分层,啃透服务治理核心!

    架构师 JiaGouX 我们都是架构师 架构未来 你来不来 前言 监控 是微服务治理的一个重要环节 监控系统的完善程度直接影响到我们微服务质量的好坏 我们的微服务在线上运行时 有没有一套完善的监控体系能去了解到它的健康情况 这对整个系统的可
  • 【NPS 服务器搭建】2. 客户端完全手册

    场景 内网机器需要提供远程访问 如SSH 环境 1 一台独立ip的VPS 如阿里云服务器 2 一台内网的主机 windows linux 步骤 1 服务端中 新建客户端 2 服务端中 新建通道 2 1 点击进入通道管理 2 2 新增通道 1
  • ruoyi框架源码阅读之--redis配置

    redis配置 文章目录 redis配置 前言 一 引入依赖 二 配置信息 三 序列化文件 四 redis配置文件 五 redis工具类 六 redis接口限流 注解实现 七 redis接口限流 注解代码 总结 前言 redis的配置信息
  • Java中count++的坑

    最近做了一道题 非常容易落入陷阱 当count初始值为0 count count 和count count 运行出来的结果是不一样的 count count 运行出来的结果依旧为0 这是因为JVM运行时 会把count变量拷贝到到临时变量区
  • mongos、nanomsg、zeroMQ简述和go-mongos使用实例

    mongos nanomsg zeroMQ简述和go mongos使用实例 文章目录 mongos nanomsg zeroMQ简述和go mongos使用实例 1 mongos nanomsg简述 2 zeroMQ nanomsg和可扩展
  • dac解码芯片天梯_【关于AK4499引发的思考】选DAC,解码芯片追新有没有必要?

    春风不度玉门关 又见才子伴乐谈 标题这个问题 其实是差不多一年前有人在微博上问我的 彼时是2018年的年底 AKM宣布了其新款旗舰解码芯片AK4499诞生的消息 吸引了玩家群体不小的关注 于是便有人问我 对于准备购置或者更换解码的玩家来说
  • 老年人教程,使用N2N进行异地组网

    一 简介 1 为什么用N2N 在一般情况下 两台机器如果是处在同一个局域网下 那么这两台机器可以通过各自的内网IP进行通信 但是 在某些情况下你可能希望两个不同局域网的机器进行通信 此时 N2N 就能给我们带来一个简单快捷的解决方案 N2N
  • Applovin股价飞涨,同场竞技的汇量或将拿到相同剧本

    全球化 跨行业投资是对冲投资风险 实现超额收益的重要方式 若论什么行业在全球化投资中入门最简单 那一定是互联网 APP 游戏人人都能接触 轻松解决了对商业门槛的理解问题 所有的增长价值一清二楚 但互联网作为一个看起来非常成熟的行业 留给外界
  • visual studio:给项目添加宏定义

    插眼 参考 https blog csdn net lucky fly article details 103321220
  • 浅谈Java Enum作用与应用场景

    在实际应用中 有的变量只有几种可能取值 如人的性别只有两种可能取值 星期只有七种可能取值 在 Java语言中对这样取值比较特殊的变量可以定义为枚举类型 所谓枚举是指将变量的值一一列举出来 变量只限于列举出来的值的范围内取值 枚举是一个特殊的
  • python 列表sort函数和sorted函数应用————实现c++ sort按不同关键字排序功能

    首先基本的应用请参考其它教程 百度很多 现有列表ll 1 2 4 5 8 9 1 1 4 3 8 20 要实现排序 排序规则为 按元组第一个元素降序 如果元祖第一个元素相同按元祖第二个元祖升序 import functools def tc
  • 以太坊执行miner.start返回null( 转载)

    博文地址 http blog csdn net wo541075754 article details 78735711
  • redis之expire命令详解

    expire是设置redis过期时间的命令 需要注意的点有以下几点 expire设置过期时间的单位是秒 如设置name的过期时间为1000秒 expire name 1000 超过时间后会自动删除key 但是不一定是立即删除 因为redis
  • el-select下拉弹窗样式修改

    首先在el select上定义 popper class eloption 和 popper append to body true 使用方法如下面代码段
  • CAN总线隔离器简介

    简介 LCAN OptoAdapter是一款通用插入式电隔离适配器 完全的硬件逻辑设计 可安装在CAN网络的任何位置 快速实现CAN网络之间电隔离 独有的CAN信号调理技术 可以实现改变CAN网络拓扑结构 长支线 增加节点数目等功能 独有的
  • Qt之Q_GLOBAL_STATIC创建全局静态对象

    概述 所谓的全局静态对象 大多是在单例类中所见 之前写过一篇文章介绍如何实现一个单例类 在这里 这是最常见的方式来进行创建 需要自定义 static 类对象 并进行手动初始化 而今天要说的是更简单的方式来实现 Qt 提供了一个非常方便的宏Q
  • Android Bootchart使用

    目录 1 bootchart简介 2 bootchart 在 android 平台的使用步骤 复杂方式 old 3 bootchart 在 android 平台的使用步骤 方便方式 new 4 修改bootchart抓取的停止时间 5 可能