Android Boot timing properity
Init records some boot timing information in system properties.
`ro.boottime.init`
> Time after boot in ns (via the CLOCK\_BOOTTIME clock) at which the first stage of init started.
`ro.boottime.init.selinux`
> How long it took the first stage to initialize SELinux.
`ro.boottime.init.cold_boot_wait`
> How long init waited for ueventd's coldboot phase to end.
`ro.boottime.`
> Time after boot in ns (via the CLOCK\_BOOTTIME clock) that the service was first started.

 

 

Android 启动时间分析工具

  • bootchart工具 

在Android O当中,bootchart已经默认集成在Init当中。所以收集数据可以用以下步骤:

  • 只需要你通过开关打开即可生效:adb shell 'touch /data/bootchart/enabled'
  • 重启设备
  • $ANDROID_BUILD_TOP/system/core/init/grab-bootchart.sh抓取数据生成一张png图片,即可进行分析。

但是如果碰到bootchart工具不能使用的情况,就需要自己下载bootchart源码:http://www.bootchart.org/download.html,解压后:

  1. ant编译bootchart.jar 
  2. java -jar bootchart.jar  bootchart.tgz   生成分析结果的PNG图片

 

  • compare-bootcharts.py脚本

这个脚本用来对比两个bootchart图。

通过compare-bootcharts.py脚本对比所选两个进程的开始结束时间点,从而得到对应进程之间的耗时差距。

当我们使用grab-bootchart.sh脚本获取对应的bootcahrt图时,会在PC的/tmp/android-bootchart目录下留下bootchart.tgz压缩包.

然后将所要比较的两个bootchart的压缩包放在两个不同的目录base_bootchart_dir, exp_bootchart_dir.

执行如下命令: system/core/init/compare-bootcharts.py base_bootchart_dir exp_bootchart_dir

就可以得到如下信息:

 

    process: baseline experiment (delta) - Unit is ms (a jiffy is 10 ms on the system)
    ------------------------------------
    /init: 50 40 (-10)
    /system/bin/surfaceflinger: 4320 4470 (+150)
    /system/bin/bootanimation: 6980 6990 (+10)
    zygote64: 10410 10640 (+230)
    zygote: 10410 10640 (+230)
    system_server: 15350 15150 (-200)
    bootanimation ends at: 33790 31230 (-2560)

可以看到开机动画一个结束时间为33790ms , 一个为31230ms ,两者相差2560ms

 

 

  • analyze_boot.py

脚本位置: $KERNEL/tools/power/pm-graph/

  1. cmdline增加 initcall_debug log_buf_len=16M 
  2. dmesg > dmesg.txt
  3. ./analyze_boot.py -dmesg dmesg.txt 

最后会生成 bootgraph.html 用chrome打开查看

Android 启动时间优化_第1张图片

 

  • perfboot

perfboot工具是个Python的脚本,在AOSP/system/core/init/目录下,通过运行./perfboot.py -h 可以看到相关参数,运行perfboot需要在编译环境下,因为perfboot的运行需要依赖AOSP/development/python-packages/adb/目录下的相关模块。

获取记录开机时间点的文件:./perfboot.py --iterations=2 --interval=30 -v --output=/tmp/data.tsv,相关参数的意思可以参考说明,脚本执行结束后,可以打开文件进行分析。

如果出现报错说明找不到adb模块,此时在AOSP/system/core/init/目录下执行命令无法找到AOSP/development/python-packages/adb/目录的依赖,解决办法可以使拷贝adb目录和perfboot.py放到同级目录下,然后执行命令。

Traceback (most recent call last):  File "./perfboot.py", line 55, in     import adbImportError: No module named adb

或者工程先lunch一下,否则有可能出现ImportError: No module named adb 

 

释义:

Android 启动时间优化_第2张图片

name description
boot_progress_start 代表着Android屏幕点亮,开始显示启动动画. 系统进入用户空间,标志着kernel启动完成
boot_progress_preload_start Zygote启动
boot_progress_preload_end Zygote结束
boot_progress_system_run SystemServer ready,开始启动Android系统服务,如PMS,APMS等
boot_progress_pms_start PMS开始扫描安装的应用
boot_progress_pms_system_scan_start PMS先行扫描/system目录下的安装包
boot_progress_pms_data_scan_start PMS扫描/data目录下的安装包
boot_progress_pms_scan_end PMS扫描结束
boot_progress_pms_ready PMS就绪
boot_progress_ams_ready AMS就绪
boot_progress_enable_screen AMS启动完成后开始激活屏幕,从此以后屏幕才能响应用户的触摸,它在WindowManagerService发出退出开机动画的时间节点之前,而真正退出开机动画还会花费少许时间,具体依赖animation zip 包中的desc.txt。wm_boot_animation_done才是用户感知到的动画结束时间节点
sf_stop_bootanim SF设置service.bootanim.exit属性值为1,标志系统要结束开机动画了,可以用来跟踪开机动画结尾部分消耗的时间
wm_boot_animation_done 开机动画结束,这一步用户能直观感受到开机结束

根据以上log可以清楚的计算出每个步骤所用时间:

  • Kernel part : boot_progress_start
  • Zygote time : boot_progress_preload_end - boot_progress_preload_start
  • /system Scan time : boot_progress_pms_data_scan_start - boot_progress_pms_system_scan_start
  • /data Scan time : boot_progress_pms_scan_end- boot_progress_pms_data_scan_start
  • Home activity start time : boot_progress_enable_screen- boot_progress_ams_ready

 

 

 

更多相关文章

  1. Android 自定义时间选择器
  2. AndroidのTween动画实现
  3. Android 补间动画(动画列表,平移,旋转,缩放,渐变,动画集合)
  4. android使用属性动画代替补间动画
  5. Android 播放Gif 动画
  6. Android最简单播放GIF动画方法
  7. Android 动画——Frame Animation与Tween Animation

随机推荐

  1. Android异步双屏显示
  2. 【android】【Bootanimation】Bootanimat
  3. android基础画板的实现(surfaceView)
  4. 使用android的加速度计移动图像
  5. android.os.NetworkOnMainThreadExceptio
  6. 将JSON数据传递到SQLite并检索它
  7. Android的startActivityForResult()与onA
  8. C# PC客户端与Android服务端的Socket同步
  9. Android中使用HorizontalScrollView横向
  10. Android使用 startActivityForResult 、