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文件位置
1 watchdogd init.manta.rc /sbin/watchdogd
2 watchdogd init.recovery.manta.rc /sbin/watchdogd
3 setup_fs init.smdk5250.rc /system/bin/setup_fs
4 ueventd init.rc /sbin/ueventd
5 logd init.rc /system/bin/logd
6 healthd init.rc /sbin/healthd
7 console init.rc /system/bin/sh
8 adbd init.rc /sbin/adbd
9 servicemanager init.rc /system/bin/servicemanager
10 vold init.rc /system/bin/vold

可以看到,core服務都是系統最基本的服務,只要core服務全部啟動,手機此時是可以運行的,但是卻看不到東西,原因是framework沒有啟動。此時啟動的都是C,C++的進程。此時是不能打電話的,因為ril-deamon沒有啟動

 

 

class main的服務如下:

 

序號 service名稱 所屬文件 命令bin文件位置
1 p2p_supplicant init.manata.rc /system/bin/wpa_supplicant
2 wpa_supplicant init.manata.rc /system/bin/wpa_supplicant
3 dhcpcd_wlan0 init.manata.rc /system/bin/dhcpcd
4 dhcpcd_p2p init.manata.rc /system/bin/dhcpcd
5 dhcpcd_eth0 init.manata.rc /system/bin/dhcpcd
6 dhcpcd_bt-pan init.manata.rc /system/bin/dhcpcd
7 dhcpcd_bt-pan init.manata.rc /system/bin/dhcpcd
8 iprenew_p2p init.manata.rc /system/bin/dhcpcd
9 iprenew_eth0 init.manata.rc /system/bin/dhcpcd
10 iprenew_bt-pan init.manata.rc /system/bin/dhcpcd
11 gpsd init.manata.rc /system/vendor/bin/gpsd
12 mobicore init.manata.rc /system/bin/mcDriverDaemon
13 bugreport init.manata.rc /system/bin/dumpstate
14 netd init.rc /system/bin/netd
15 debuggerd init.rc /system/bin/debuggerd
16 debuggerd64 init.rc /system/bin/debuggerd64
17 ril-daemon init.rc /system/bin/rild
18 surfaceflinger init.rc /system/bin/surfaceflinger
19 drm init.rc /system/bin/drmserver
20 media init.rc /system/bin/mediaserver
21 bootanim init.rc /system/bin/bootanimation
22 installd init.rc /system/bin/installd
23 flash_recovery init.rc /system/etc/install-recovery.sh
24 racoon init.rc /system/bin/racoon
25 mtpd init.rc /system/bin/mtpd
26 keystore init.rc /system/bin/keystore
27 dumpstate init.rc /system/bin/dumpstate
28 sshd init.rc /system/bin/start-ssh
29 mdnsd init.rc /system/bin/mdnsd
30 zygote init.zygote32_64.rc /system/bin/app_process
31 zygote init.zygote32.rc /system/bin/app_process
32 zygote init.zygote64.rc /system/bin/app_process64

 

 

可以看到main的服務相對多一些,看到zygote了吧,由此可見main服務大部分是建立在java層或者與java層息息相關的系統服務。

 

class late_start 的服務如下:

 

序號 service名稱 所屬文件 命令bin文件位置
1 sdcard init.manta.rc /system/bin/sdcard
2 sdcard init.msmdk5250.rc /system/bin/sdcard

 

 

在看Android手機加密的資料的時候,看到late_start服務,以為有很多呢.,但是一搜索才知道,坑爹啊,只有一個。

 

由以上的簡單分析,再來分析Kitkat手機加密功能的流程,和加密后的啟動過程,就更加清晰了。

 

其實手機加密完畢后,重啟手機,進入輸入密碼界面,此時系統的core,main服務都已經啟動,只有late_start服務沒有啟動,可以直接無視late_start。這樣說來,此時手機的系統服務和正常狀態下是一樣的。我們想利用系統服務做什么都行啊。^_^

 

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

例如可以撥打緊急呼救號碼,彈出輸入法,顯示設置中的CryptKeeper界面,可以鎖屏。但是卻玩不了游戲,無法調用我們已經設置的“百度輸入法”,而是使用很丑的Ladin輸入法。鎖屏也是系統默認的,撥號的界面也是系統原生的等等問題。這些問題,將在下一篇文章《Kitkat的加密功能對應用做了什么?》中解答

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM