Android 通过initrc控制命令、服务启动时间

在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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Free飝Fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值