Bootchart分析Android启动时间

2023-10-24 23:50

本文主要是介绍Bootchart分析Android启动时间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介:

bootchart是一个用于linux启动过程性能分析的开源软件工具,在系统启动过程自动收集CPU占用率、进程等信息,并以图形方式显示分析结果,可用作指导优化系统启动过程。

bootchart是一个对linux启动流程进行分析得开源软件工具。Android中有集成bootchart源码,路径为system/core/init/bootchart.c

第一部分:先从具体使用流程如下
1、编译android中的bootchart(缺省时不被编译)
  在android源码system/core/init/目录执行: mm INIT_BOOTCHART=true -B

  或者直接修改 Android.mak文件

[html]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;color:#333333;">    LOCAL_PATH:= $(call my-dir)  
  2.     include $(CLEAR_VARS)  
  3.       
  4.     INIT_BOOTCHART :true  </span>  

2、将新编译的android系统镜像烧录到android设备中。
编译生成新的可执行文件init,该文件在手机文件系统位于根/下,对应的flash image是boot.img,为此需重新烧写含有新的init的boot.img

3、在手机上创建文件/data/bootchart-start,其内容是bootchart的采样时间
adb shell 'echo $TIMEOUT > /data/bootchart-start'
其中$TIMEOUT是期望采样的时间,单位为秒,例如要采样两分钟,则执行:
adb shell 'echo 120 > /data/bootchart-start'

4、重启设备,init运行时将自动创建文件夹/data/bootchart/,并在其中保存采样数据,采样数据由5个文件组成:

[html]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;color:#333333;">-rw-rw-rw- root     root          732 1970-01-01 08:00 header  
  2. -rw-r--r-- root     root            0 1970-01-01 08:00 kernel_pacct  
  3. -rwxr-xr-x root     root       517150 2014-04-09 12:06 proc_diskstats.log  
  4. -rwxr-xr-x root     root      2783967 2014-04-09 12:06 proc_ps.log  
  5. -rwxr-xr-x root     root       152090 2014-04-09 12:06 proc_stat.log</span>  
需要注意,在手机上运行bootchart采样完成后若不再使用bootchart则需手工删除文件/data/bootchart-start,否则手机每次重启时都会运行bootchart。


5、文件打包

在/data/bootchart/目录下执行命令:


[html]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;color:#333333;">busybox tar -czf bootchart.tgz header proc_stat.log proc_ps.log proc_diskstats.log kernel_pacct </span>  

然后将生成bootchart.tgz用u盘拷贝到电脑(ubuntu系统)上。

也可手工通过adb pull将这5个文件上传到PC并打包,反正最终就是生成 bootchart.tgz 

6.在电脑上安装bootchart工具
使用sudo apt-get install bootchart 命令安装, 如果出现 bootchart无法正常解析android中生成的bootchart.tgz文件。
需要使用老版本的安装包bootchart_0.9-0ubuntu6_all.deb,可以在此下载http://download.csdn.net/detail/sckgenius/7166477。
先sudo apt-get install librsvg2-bin,然后sudo dpkg -i bootchart_0.9-0ubuntu6_all.deb 。

7、执行下面的命令生成分析结果图表,缺省生成png格式的图像文件bootchart.png:
Java -jar /usr/share/bootchart/bootchart.jar /path/to/bootchart.tgz

这里上传一张bootchart.png图:



第二部分:下面说一下bootchart是如何得到这些数据信息的
分析是源码:system\core\init\bootchart.c 只有一个文件
1、启动

init.c 中通过宏定义 BOOTCHART 增加代码

[cpp]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;color:#333333;">#if BOOTCHART  
  2. static int bootchart_init_action(int nargs, char **args)  
  3. {  
  4.     bootchart_count = bootchart_init();  
  5.     if (bootchart_count < 0) {  
  6.         ERROR("bootcharting init failure\n");  
  7.     } else if (bootchart_count > 0) {  
  8.         NOTICE("bootcharting started (period=%d ms)\n", bootchart_count*BOOTCHART_POLLING_MS);  
  9.     } else {  
  10.         NOTICE("bootcharting ignored\n");  
  11.     }  
  12.   
  13.     return 0;  
  14. }  
  15. #endif</span>  
通过调用 bootchart_init() 启动

2、周期性执行

int main(int argc, char **argv)

[cpp]  view plain copy
print ? 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:14px;"><span style="color:#333333;">{  
  2.   
  3. #if BOOTCHART  
  4.     queue_builtin_action(bootchart_init_action, "bootchart_init");  
  5. #endif  
  6.   
  7.     for(;;) {  
  8.         int nr, i, timeout = -1;  
  9.   
  10.   
  11. #if BOOTCHART  
  12.         if (bootchart_count > 0) {  
  13.             if (timeout < 0 || timeout > BOOTCHART_POLLING_MS)  
  14.                 timeout = BOOTCHART_POLLING_MS;  
  15.             if (</span><strong><span style="color:#FF0000;">bootchart_step(</span><span style="color:#CC0000;">)</span></strong><span style="color:#333333;"> < 0 || --bootchart_count == 0) {  
  16.                 bootchart_finish();  
  17.                 bootchart_count = 0;  
  18.             }  
  19.         }  
  20. #endif  
  21.   
  22.         nr = poll(ufds, fd_count, timeout);  
  23.           
  24.   }   
  25.     ...  
  26. }</span></span>  

默认周期时间:

# define BOOTCHART_POLLING_MS   200   /* polling period in ms */

3、具体如何采样数据
分析一下源码就很清楚了,就是通过linux中的标准命令(shell上执行cat xxx 类似)并将其结果写入相应的文件
/proc/cmdline

/proc/version
/proc/cpuinfo
写入到文件 #define LOG_HEADER      LOG_ROOT"/header"

/proc/uptime
/proc/stat
写入到文件 #define LOG_STAT        LOG_ROOT"/proc_stat.log"

/proc/uptime
/proc/diskstats
写入到文件 #define LOG_DISK        LOG_ROOT"/proc_diskstats.log"

/proc/uptime
/proc/$PID/cmdline
/proc/$PID/stat
写入到文件 #define LOG_PROCS       LOG_ROOT"/proc_ps.log"

这个文件只打开,没有写入什么内容
/* create kernel process accounting file */
#define LOG_ACCT        LOG_ROOT"/kernel_pacct"

参考资料:

1、system/core/init/README.BOOTCHART

2、http://www.bootchart.org/index.html

转载自:http://blog.csdn.net/andyhuabing/article/details/23669007

这篇关于Bootchart分析Android启动时间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/278605

相关文章

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

在Android平台上实现消息推送功能

《在Android平台上实现消息推送功能》随着移动互联网应用的飞速发展,消息推送已成为移动应用中不可或缺的功能,在Android平台上,实现消息推送涉及到服务端的消息发送、客户端的消息接收、通知渠道(... 目录一、项目概述二、相关知识介绍2.1 消息推送的基本原理2.2 Firebase Cloud Me

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3