android init進程 init.rc

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文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章