Init進程是android系統起來之後啓動的第一個進程,代碼入口在 system/core/init/init.c 的 main() 函數。
關於init進程,請參考 Android Init進程分析:http://blog.csdn.net/justmantao/article/details/8751810?utm_source=tuicool
參考:Android啓動過程深入解析:blog.jobbole.com/67931/
Init進程會解析init.rc文件(system/core/rootdir/init.rc)
參考:Android init.rc腳本解析:http://blog.csdn.net/justmantao/article/details/8753862
Android init.rc文件解析過程詳解(一):http://blog.csdn.net/mk1111/article/details/16357327 init.rc文件結構介紹
init.rc文件基本組成單位是section, section分爲三種類型,分別由三個關鍵字(所謂關鍵字即每一行的第一列)來區分,這三個關鍵字是 on、service、import。
1、on類型的section表示一系列命令的組合, 例如:
on init
export PATH /sbin:/system/sbin:/system/bin
export ANDROID_ROOT /system
export ANDROID_DATA /data
這樣一個section包含了三個export命令,命令的執行是以section爲單位的,所以這三個命令是一起執行的,不會單獨執行, 那什麼時候執行呢? 這是由init.c的main()所決定的,main()裏在某個時間會調用
action_for_each_trigger("init", action_add_queue_tail);
這就把 "on init" 開始的這樣一個section裏的所有命令加入到一個執行隊列,在未來的某個時候會順序執行隊列裏的命令,所以調用action_for_each_trigger() 的先後決定了命令執行的先後。
2、service類型的section表示一個可執行程序,例如:
service surfaceflinger /system/bin/surfaceflinger
class main
user system
group graphics drmrpc
onrestart restart zygote
surfaceflinger 作爲一個名字標識了這個service,/system/bin/surfaceflinger 表示可執行文件的位置,class、user、group、onrestart這些關鍵字所對應的行都被稱爲options,options是用來描述的service一些特點,不同的service有着不同的options。
service類型的section標識了一個service(或者說可執行程序), 那這個service什麼時候被執行呢?
是在 class_start 這個命令被執行的時候,這個命令行總是存在於某個on類型的section中,
"class_start core"這樣一條命令被執行,就會啓動類型爲core的所有service。如:
on boot
...
class_start core
class_start main
所以可以看出android的啓動過程主要就是on類型的section被執行的過程。3、import類型的section表示引入另外一個.rc文件,例如:
import init.test.rc
相當包含另外一些section, 在解析完init.rc文件後繼續會調用init_parse_config_file來解析引入的.rc文件。