在Android开发中,常常需要开机自动启动一些服务,有的希望早点启动,有的需要晚一点启动。如何控制服务的启动时间呢?
首先了解下init.rc的启动流程
1) early-init
a) wait_for_coldboot_done
b) property_init
c) keychord_int
d) console_init
e) set_init_properties
2) init
3) late-init
4) early-fs
5) fs
6) post-fs
f) property_service_init
g) signal_init
h) check_startup
7) early-boot
8) boot
9) service
init.rc中的程序大致会按照这个顺序执行,靠前的(early-init init)是在init.cpp中触发启动的,后面的是在这些命令靠
trigger来触发的。
service有class core、main、hal 、default 、late_start等这些service也是通过on boot 中class_start来统一启动的。
还有一种就是on property: 例如on property:sys.boot_completed=1,是通过设置系统属性来触发启动的
基本上通过以上几种方法就可以实现service或command的启动时间了,但是有时我们的程序需要在一个特定时间启动,但我们又没有合适的属性来用(on boot 、class main 、on property:sys.boot_completed=1等)。
例如:我们希望我们的程序越早启动越好,但又不能太早,太早有些资源未就绪,太晚影响用户体验,假设我们需要在进入桌面前启动程序,程序完成工作需要4s时间左右,但程序所需资源在9s时才就绪。以下是记录的各属性触发的数据,
#5s
#on boot
# start ril-daemon
#6s
#class core
#7s
#class main
#17s
#on property:sys.boot_completed=1
# start ril-daemon
#17s
#on property:dev.bootcomplete=1
# start ril-daemon
#16s
#on property:init.svc.bootanim=stopped
# start ril-daemon
我们知道当bootcomplete=1时,也就进入桌面了,我们程序希望在9s~13s(17-4)之间启动,但是我们找不到一个合适的属性
通过抓log看在9s~13s之间启动了哪些service,就找到一个webview_zygote32。但是我们找不到这个webview_zygote32是如何触发的(或者在代码内触发,而我们又不想改动代码)。而我们又想依赖这个webview_zygote32一起启动,该如何做呢?
init.rc提供了一种监测服务状态的属性,on property:init.svc.webview_zygote32=running,通过这个就可以当webview_zygote32启动时来启动我们自己的程序。
除了这个,还有init.action 表示正在执行的action init.command 表示正在执行的命令
一种监听设备节点创建后再启动service的方法:
on device-added-/dev/compass
start akmd
参考:https://blog.csdn.net/eliot_shao/article/details/53163522
init.rc文件语法:https://www.docin.com/p-709168996.html