Android init.rc 服务启动不成功

问题

在开发过程中发现一个问题,我们需要在开机的时候判断硬件版本号去启动服务,

服务的名字是ledservice和ledservice4,但是发现每次烧录完固件后,服务启动不

成功,需要再复位重启一次,服务才可以正常启动。

日志如下

[ 5.328699] init: Service 'logd-reinit' (pid 257) exited with status 0
[ 5.329681] init: Starting service 'ledservice'...
[ 5.331442] init: Starting service 'exec 2 (/system/bin/vdc)'...
[ 5.353605] init: Service 'exec 2 (/system/bin/vdc)' (pid 269) exited with status 0
[ 5.355534] init: Service 'ledservice' is being killed...
[ 5.364499] init: Service 'ledservice' (pid 268) killed by signal 9
[ 5.364531] init: Service 'ledservice' (pid 268) killing any children in process group
[ 5.365442] init: Not bootcharting.

 

分析

1、我们自己刚开始修改的代码如下

service ledservice /system/bin/ledservice
    class main
    console
    disabled
    onrestart

service ledservice4 /system/bin/ledservice4
    class main
    console
    disabled
    onrestart

on property:ro.boot.wzb210_audio_hw_rev=3
    start ledservice

on property:ro.boot.wzb210_audio_hw_rev=4
    start ledservice4

on property:ro.boot.wzb210_audio_hw_rev=5
    start ledservice4

第一次实验

刚开始一直担心是因为我们服务本身有问题,所以在我们的两个服务里面不做任何操作,直接打一个Log

实验的结果还是有问题,服务启动不成功。

 

第二次试验

后面我考虑到有可能是因为增加了版本号的原因,然后我把代码修改成下面,结果还是服务启动不成功

service ledservice /system/bin/ledservice
class main
console
disabled
onrestart

start ledservice

 

最后

我考虑到android 的adbd也是刷机就要起来的,然后我参照了adbd的编写,看到了差异,修改如下,服务可以正常启动

参照adbd,把class main改成class core就可以了。 
service ledservice /system/bin/ledservice
- class main
+ class core
console
disabled
onrestart

 

class core 和class main有何不同

在分析Kitkat加密功能的时候,在一些资料上看到一句话“对于加密后的系统,重启后,进入到输入密码界面,此时并没有完全加载Android系统,仅仅加载必要的服务”

那么这个必要的服务又是指的是那些服务呢?

在解答这个问题前我们先区分一下class core ,class main, class late_start。

这三个“class”,只是标识这个服务的类型是哪一个,然后通过调用class_start, class_reset, class_stop等命令的时候,来统一操作同一类的服务。

举个例子,从system/core/rootdir/init.rc文件中搜索“class main”可以搜到许多,例如有netd, ril-deamon服务被标识为class main,那么当我们调用class_start main命令时,所有标识为main的服务都会被启动,这里的netd ril-deamon就会被启动。对于core, late_start类的服务也是这样的。

这里以源代码中三星的manta为例进行演示:

class core 的服务如下:

 

序号service名称所属文件命令bin文件位置
1watchdogdinit.manta.rc/sbin/watchdogd
2watchdogdinit.recovery.manta.rc/sbin/watchdogd
3setup_fsinit.smdk5250.rc/system/bin/setup_fs
4ueventdinit.rc/sbin/ueventd
5logdinit.rc/system/bin/logd
6healthdinit.rc/sbin/healthd
7consoleinit.rc/system/bin/sh
8adbdinit.rc/sbin/adbd
9servicemanagerinit.rc/system/bin/servicemanager
10voldinit.rc/system/bin/vold

可以看到,core服务都是系统最基本的服务,只要core服务全部启动,手机此时是可以运行的,但是却看不到东西,原因是framework没有启动。此时启动的都是C,C++的进程。此时是不能打电话的,因为ril-deamon没有启动

 

 

class main的服务如下:

 

序号service名称所属文件命令bin文件位置
1p2p_supplicantinit.manata.rc/system/bin/wpa_supplicant
2wpa_supplicantinit.manata.rc/system/bin/wpa_supplicant
3dhcpcd_wlan0init.manata.rc/system/bin/dhcpcd
4dhcpcd_p2pinit.manata.rc/system/bin/dhcpcd
5dhcpcd_eth0init.manata.rc/system/bin/dhcpcd
6dhcpcd_bt-paninit.manata.rc/system/bin/dhcpcd
7dhcpcd_bt-paninit.manata.rc/system/bin/dhcpcd
8iprenew_p2pinit.manata.rc/system/bin/dhcpcd
9iprenew_eth0init.manata.rc/system/bin/dhcpcd
10iprenew_bt-paninit.manata.rc/system/bin/dhcpcd
11gpsdinit.manata.rc/system/vendor/bin/gpsd
12mobicoreinit.manata.rc/system/bin/mcDriverDaemon
13bugreportinit.manata.rc/system/bin/dumpstate
14netdinit.rc/system/bin/netd
15debuggerdinit.rc/system/bin/debuggerd
16debuggerd64init.rc/system/bin/debuggerd64
17ril-daemoninit.rc/system/bin/rild
18surfaceflingerinit.rc/system/bin/surfaceflinger
19drminit.rc/system/bin/drmserver
20mediainit.rc/system/bin/mediaserver
21bootaniminit.rc/system/bin/bootanimation
22installdinit.rc/system/bin/installd
23flash_recoveryinit.rc/system/etc/install-recovery.sh
24racooninit.rc/system/bin/racoon
25mtpdinit.rc/system/bin/mtpd
26keystoreinit.rc/system/bin/keystore
27dumpstateinit.rc/system/bin/dumpstate
28sshdinit.rc/system/bin/start-ssh
29mdnsdinit.rc/system/bin/mdnsd
30zygoteinit.zygote32_64.rc/system/bin/app_process
31zygoteinit.zygote32.rc/system/bin/app_process
32zygoteinit.zygote64.rc/system/bin/app_process64

 

 

可以看到main的服务相对多一些,看到zygote了吧,由此可见main服务大部分是建立在java层或者与java层息息相关的系统服务。

 

class late_start 的服务如下:

 

序号service名称所属文件命令bin文件位置
1sdcardinit.manta.rc/system/bin/sdcard
2sdcardinit.msmdk5250.rc/system/bin/sdcard

 

 

在看Android手机加密的资料的时候,看到late_start服务,以为有很多呢.,但是一搜索才知道,坑爹啊,只有一个。

 

由以上的简单分析,再来分析Kitkat手机加密功能的流程,和加密后的启动过程,就更加清晰了。

 

其实手机加密完毕后,重启手机,进入输入密码界面,此时系统的core,main服务都已经启动,只有late_start服务没有启动,可以直接无视late_start。这样说来,此时手机的系统服务和正常状态下是一样的。我们想利用系统服务做什么都行啊。^_^

 

那么为什么在该界面只能做很少的事情呢?

例如可以拨打紧急呼救号码,弹出输入法,显示设置中的CryptKeeper界面,可以锁屏。但是却玩不了游戏,无法调用我们已经设置的“百度输入法”,而是使用很丑的Ladin输入法。锁屏也是系统默认的,拨号的界面也是系统原生的等等问题。这些问题,将在下一篇文章《Kitkat的加密功能对应用做了什么?》中解答

 

posted on 2018-09-21 14:39 公众号;嵌入式Linux 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值