【第一章-知识】2、性能优化-Bootchart 分析之Android 7.1 版本Bug

原文作者:花前月下的细说
文章链接:链接

Bootchart 是什么

Bootchart是一个用于Linux启动过程性能分析的开源软件工具

在Android中又是什么

Google已经在Android系统中默认集成了Bootchart 用来记录开机时间的
可查看开机耗时在什么位置,以便优化开机时间

Android5.1之前已自带bootchart,但缺省时不被编译,需要显式指定编译

5.1之后的都默认编译进了init中

谷歌介绍

system/core/init/readme.txt

Bootcharting
------------
This version of init contains code to perform "bootcharting": generating log
files that can be later processed by the tools provided by www.bootchart.org.

On the emulator, use the -bootchart <timeout> option to boot with bootcharting
activated for <timeout> seconds.

On a device, create /data/bootchart/start with a command like the following:

  adb shell 'echo $TIMEOUT > /data/bootchart/start'

Where the value of $TIMEOUT corresponds to the desired bootcharted period in
seconds. Bootcharting will stop after that many seconds have elapsed.
You can also stop the bootcharting at any moment by doing the following:

  adb shell 'echo 1 > /data/bootchart/stop'

Note that /data/bootchart/stop is deleted automatically by init at the end of
the bootcharting. This is not the case with /data/bootchart/start, so don't
forget to delete it when you're done collecting data.

The log files are written to /data/bootchart/. A script is provided to
retrieve them and create a bootchart.tgz file that can be used with the
bootchart command-line utility:

  sudo apt-get install pybootchartgui
  # grab-bootchart.sh uses $ANDROID_SERIAL.
  $ANDROID_BUILD_TOP/system/core/init/grab-bootchart.sh

One thing to watch for is that the bootchart will show init as if it started
running at 0s. You'll have to look at dmesg to work out when the kernel
actually started init.

system/core/init/grab-bootchart.sh

这个脚本是因为需要在Linux环境下打包这些数据并做可视化处理输出性能分析图表。为此Google已经给我们在源码/system/core/init/目录下写了一个grab-bootchart.sh脚本,专门用来处理这些数据并做可视化处理

中文通俗解释下谷歌翻译

可以使用下面的命名来打开Bootchart来收集开机性能数据(主要就是记录日志文件)

//在data/bootchart/目录中新建start文件
adb shell 'touch /data/bootchart/start'

/*
* 在start文件中写入采用时间timeout=120s
* 这里的时间可以自定义,通过查看源代码可知最长时间不能超过10*60 s
 */
adb shell 'echo 120 > /data/bootchart/start'

//在data/bootchart/目录中新建stop文件
adb shell 'touch /data/bootchart/stop'

//在stop文件中写入1标记,用于停止采集数据
adb shell 'echo 1 > /data/bootchart/stop'

设置了 start 后,重启即刻看到在 data/bootchart/ 目录下应该会有相应的收集文件

但 7.1 的这时候就出现了 Bug ,机器一直down 机,无法开机(后面有解决办法)

代码目录

system/core/init/bootchart.cpp

执行时机

system/core/rootdir/init.rc


on post-fs-data

    ...
    
    # Start bootcharting as soon as possible after the data partition is
    # mounted to collect more data.
    mkdir /data/bootchart 0755 shell shell
    bootchart_init

在 init.rc 执行的时,在挂载好了 data 分区时,就执行 bootchart_init

所以 bootchart_init 就是在 bootchart.cpp 中的入口函数了

bootchart.cpp 中的代码也很容易看懂大概原理

从 data/bootchart/start 中读取设置的时间,并根据代码中设置默认的检测间隔执行读取记录

读取相关文件,如 proc/pid/cmd   proc/pid/stat 等的信息,写入

data/bootchart/proc_stat.log
data/bootchart/proc_ps.log
data/bootchart/proc_diskstats.log
data/bootchart/header
data/bootchart/kernel_pacct

如果读取到 data/bootchart/stop = 1,即停止
大概就这样,但读取出来的文件,还需要配合工具查看分析,就不关注了~~

Bug解决办法

设置了 start 的时间后,重启,发现无法开机了…

经过一番百度,Google

有的Blog是说把 system/core/init/bootchart.cpp中的

stat.replace(open + 1, close - open - 1, full_name);

删除就好了

我试过,确实,可以开机了

但是又想了想,谷歌会没发现这个问题么?不至于吧

真相只有一个!

然后对比了谷歌7.0 8.1 甚至 9.0 的源代码,开启了漫长2个小时的地毯上搜索…

最终在 Google 的提交记录上找到相关修复提交

system/core/init/Android.mk


LOCAL_SANITIZE := integer

========》

LOCAL_SANITIZE := signed-integer-overflow

有梯子的可以直接看原生提交

https://android-review.googlesource.com/c/platform/system/core/+/445032/2/init/Android.mk#b97

虽然不知道这是什么,但从字面意思大概猜到是和内存溢出有关系吧

LOCAL_SANITIZE

然后再百度搜索一波 LOCAL_SANITIZE signed-integer-overflow

是什么

官方解释

Android 的构建系统还使用了 UBSan 的整数溢出检查功能。UBSan 还支持 unsigned-integer-overflow,这不是严格意义上的未定义行为,但它包含在擦除器中。在生成文件中,可以将 LOCAL_SANITIZE 设置为 signed-integer-overflow、unsigned-integer-overflow 或 combination flag integer,启用 signed-integer-overflow、unsigned-integer-overflow、integer-divide-by-zero、shift-base 和 shift-exponent,以启用这些行为。在 blueprint 文件中,可以将 Misc_undefined 设置为所需的标志,启用这些行为。这些 UBSan 目标,尤其是 unsigned-integer-overflow,广泛用于 mediaserver 组件中,以用来消除任何潜在的整数溢出漏洞

在 Android 中,当出现未定义的行为时,默认的做法是中止程序。但是,从 2016 年 10 月开始,Android 中的 UBSan 将提供一个可选的运行时库,其报告的错误信息将更加详细,包括出现的未定义行为类型、文件和源代码行信息

在 Android.mk 文件中,可通过以下方式启用该库:

LOCAL_SANITIZE:=unsigned-integer-overflow signed-integer-overflow
LOCAL_SANITIZE_DIAG:=unsigned-integer-overflow signed-integer-overflow

(⊙﹏⊙),看完了还是有点懵,不过也算了解多一点知识吧,行吧,记录完 溜~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OA系统版本号A8-7.1是一种较新的OA系统版本。OA系统即办公自动化系统,是一种集成办公软件和相关功能的系统,旨在优化企业内部的办公流程和信息管理。 A8-7.1版本的OA系统可能具有以下特点和功能: 1. 用户界面升级:这个版本的OA系统可能会进行界面升级,使得用户界面更加美观、直观,使用起来更加方便快捷。 2. 手机端应用:随着移动办公的普及,A8-7.1版本的OA系统可能会新增手机端应用,方便员工随时随地进行办公操作。 3. 流程管理:OA系统通常是以流程为核心的,A8-7.1版本可能会提供更加强大和灵活的流程管理功能,包括审批流程、报销流程等。 4. 文件管理:OA系统一般也提供文件管理功能,A8-7.1版本可能会加强文件管理的安全性和便捷性,支持多种文件格式的上传、下载、共享和版本管理。 5. 计划管理:办公自动化系统通常也包含计划管理功能,A8-7.1版本可能会提供日程安排、任务分配等功能,帮助企业员工更好地组织、管理和跟踪工作中的任务和计划。 6. 数据分析:OA系统通常也具备一定的数据分析功能,A8-7.1版本可能会加强数据分析的能力,提供更加丰富的数据报表和可视化分析工具,帮助企业更好地理解和利用数据。 7. 安全性升级:A8-7.1版本的OA系统可能会对系统安全性进行升级,采用更加严格的权限管理和数据加密技术,保障企业信息的安全性。 总之,A8-7.1版本的OA系统可能会在用户界面、移动办公、流程管理、文件管理、计划管理、数据分析和安全性方面进行优化和升级,提供更加强大、高效、安全的办公自动化工具。 ### 回答2: OA系统版本号为A8-7.1,是指该OA系统的具体版本和升级级别。 OA系统是指办公自动化系统,它是利用计算机和通信技术来管理、协调和处理办公事务的一种信息化管理系统。OA系统可以帮助企业提高工作效率、降低成本、提升管理水平。 A8-7.1是该OA系统的具体版本号,其中A8表示该系统的主要版本,7表示该主要版本的次要版本,即第7个次要版本,1表示该次要版本的修订版本,即第1个修订版本版本号的更新通常意味着系统在功能、性能、安全性等方面进行了改进和优化,用户可以通过版本升级来享受到系统的新功能和改进。 针对A8-7.1版本的OA系统,具体的功能和特点可能需要根据具体的系统情况来进行分析。一般来说,OA系统包含了人事管理、办公流程管理、文件管理、协同办公、会议管理、知识管理等多个模块,用户可以通过电脑、手机等终端进行操作。同时,OA系统通常还具备权限管理、审批流程、报表生成、数据分析等功能,以满足不同用户的不同需求。 总之,OA系统版本为A8-7.1是一种办公自动化系统的具体版本号,用户可以根据具体情况进行系统升级,以享受到更好的功能和性能。 ### 回答3: OA系统版本A8-7.1是一种办公自动化系统的软件版本。OA系统是指使用计算机和网络技术来管理和协调办公室工作的系统。A8-7.1是该系统的一个具体版本。 OA系统的功能主要包括文件管理、协同办公、流程管理、考勤管理和公告通知等。文件管理功能是指用户可以上传、下载和共享文件,实现文件的统一管理和快速检索。协同办公功能可以使不同部门的员工进行实时沟通和协作,提高工作效率。流程管理功能可以帮助企业建立各种业务流程,将工作按照流程化和标准化的方式进行。考勤管理功能可以记录员工的出勤情况和工作时长,为企业提供有效的考勤管理手段。公告通知功能可以方便地向员工发布通知和公告,提高信息的传递效率。 A8-7.1版本相对于之前的版本可能包括了一些新的功能和改进,例如界面设计更加美观简洁、操作更加便捷,性能更加稳定可靠等。同时,A8-7.1版本可能也修复了之前版本中存在的一些bug和问题,提高了系统的稳定性和用户体验。 综上所述,OA系统版本A8-7.1是一款广泛应用于办公环境中的软件系统,具有丰富的功能和稳定的性能,可帮助企业提高工作效率和管理水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值