init可執行程序是系統運行的第一個用戶控件的程序
它已守護進程的方式運行,它是從linux啟動標準自動進入Android系統的入口
init可執行成程序的代碼路徑為:system/core/init
由于是init本身一個可執行程序,而不是庫,因此沒有給其他部分使用的頭文件。
init的目錄中的文件結構比較清晰,各個核心文件如下所示。
init.c:主入口,包含了main()函數
parser.h和parser.c:底層的解析功能
init_parser.h和init_parser.c:init腳本解析的功能。
keywords.h和builtins.c:關鍵字的定義和init腳本中命令的處理。
util.h和util.c工具函數
logo.h和logo.c:處理開始畫面
property_service.h和property_service.c屬性方面的處理
signal_handler h c :信號方面的處理
keychords.c:keychord方面的處理
ueventd.c設備管理分支的入口
devices.c:設備管理的設備和興處理功能
ueventd_parser.c:設備管理的腳本解析功能
編譯結果為可執行文件,安裝在TARGET_ROOT_OUT
靜態庫鏈接
init可執行程序將解析同樣位于根目錄中的init腳本,執行腳本中的那功能,采用這種方式的原因在于讓init可執行程序的功能基本保持固定,定制的工作通過init腳本來執行。
init腳本位于根目錄中,腳本被解析后將放入隊列執行,在較新的Android版本中,init腳本有兩個,第一個是init.rc,第二個是init.<設備>.rc,它作為額外的啟動內容,例如仿真器上使用的第二個init腳本的文件名稱為init.goldfish.rc。兩個init.rc腳本的語法和作用完全相同,知識前者用于通用的工作,后者用于設備相關的工作。
雖然理論上建議使用設備相關的init腳本中處理設備相關的工作,但是真正實現一個設備時,主init腳本還需要修改。
關于init腳本的處理,實際上init_parse_config_file()構建一個序列
真正執行的是execute_one_command()中執行
系統默認的主init腳本的路徑為system/core/rootdir/init.rc
根據rootdir中的Android.mk文件,init.rc將被安裝在根文件系統中。