Android 启动时间优化

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.<service-name>`
> 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打开查看

  • 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 <module>
    import adb
ImportError: No module named adb

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

释义:

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

猜你喜欢

转载自blog.csdn.net/andytian1991/article/details/81063956