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,解压后:
- ant编译bootchart.jar
- 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