問題
在開發過程中發現一個問題,我們需要在開機的時候判斷硬件版本號去啟動服務,
服務的名字是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的加密功能對應用做了什么?》中解答