Android Init程序詳解

2021-06-29 13:43:40 字數 3508 閱讀 9724

init是乙個由核心啟動的使用者級程序
init是linux系統中使用者空間的第乙個程序。由於android是基於linux核心的,所以init也是android系統中使用者空間的第乙個程序。
adb shell ps中init的pid為1,ppid為0
1.解析指令碼init.rc

2.根據init.rc配置資訊,觸發action及啟動service

3.解析系統property檔案並初始化property資訊

4.提供系統property服務管理及完成對應的觸發事件

5.維護系統級service

init程序從system/core/init/init.c中的int main(int argc, char **argv)方法開始執行

解析init.rc是在main函式中的init_parse_config_file("/init.rc");中進行的,依次會執行如下操作:

1.掃瞄init.rc中的token,找到其中的檔案結束eof/文字text/新行newline,

其中的空格『 』、『\t』、『\r』會被忽略,#開頭的行也被忽略掉;

而對於text,空格『 』、『\t』、『\r』、『\n』都是text的結束標誌。

2.對每乙個text token,都加入到args陣列中

3.當遇到新一行(『\n』)的時候,用lookup_keyword(args[0]);檢索匹配關鍵字

1) 對section(on和service),呼叫parse_new_section() 解析;

- 對on section,呼叫parse_action(),並設定解析函式parse_line為parse_line_action()

- 對service section,呼叫parse_service(),並設定解析函式parse_line為parse_line_service()

2) 對其他關鍵字的行(非on或service開頭的地方,也就是沒有切換section)呼叫parse_line()

4.將解析出的action command新增到action_list中,將service新增到service_list

5.執行action_for_each_trigger時,會把佇列action_list裡所匹配的action,追加到action_queue的隊尾;

static list_declare(service_list);

static list_declare(action_list);

static list_declare(action_queue);

init動作四個階段包括early-init,init,early-boot,boot;

//action_for_each_trigger方法會根據這四個階段來將action_list裡所匹配的action,新增到action_queue中;例如:action_for_each_trigger("early-init", action_add_queue_tail);

1.early-init

wait_for_coldboot_done

keychord_init

console_init

2.init

early-fs

fspost-fs

post-fs-data

property_service_init

signal_init

check_startup

3.early-boot

4.boot

init.c(system/core/init/init.c)中的int main(int argc, char **argv)

for(;;)
1.action_remove_queue_head函式獲取action_queue鍊錶中的第乙個action節點

2.通過action節點呼叫get_next_command函式獲取它的下乙個command

3.執行command

void execute_one_command(void)

else

if (!cur_command)

return;

ret = cur_command->func(cur_command->nargs, cur_command->args); //執行command

info("command '%s' r=%d\n", cur_command->args[0], ret);

}

1.迴圈獲取service_list中的service節點

2.呼叫service_for_each_flags函式,通過service節點中的flags、 time_started判斷是否啟動該service

3.呼叫service_start函式,fork子程序,建立socket、執行啟動service等操作

service_start函式來解釋init.rc檔案中的service命令

static void restart_processes()

1.首先,屬性服務也會有對於的action:property_service_init,queue_builtin_action會根據action去呼叫相應的處理方法:property_service_init_action

2.初始化呼叫過程:property_service_init_action-> start_property_service-> load_properties_from_file(如build prop,system prop檔案)& create_socket & listen & set property_set_fd(等待應用傳送請求

3.多路切換監聽過程

for(;;)

......

nr = poll(ufds, fd_count, timeout);

}

當執行setprop時就會執行toolbox中的main函式

toolbox是乙個工具

init程序將屬性服務啟動後,屬性服務執行在init程序裡,並管理屬性服務,當setprop時,toolbox就會與init程序進行互動;(個人理解)

1.在init.c的main函式中,會呼叫handle_signal方法,用於等待接收子程序退出時傳送的signal訊號;

2.當子程序退出時,會呼叫sigchld_handler方法,傳送乙個signal訊號(往socket中寫資料)

3.handle_signal中的wait_for_one_process方法接收到該訊號後,會根據傳過來的pid找到相應的service,並根據該service的flags執行相應操作(如,重啟等),完成程序的維護。

android init 程序分析 (1 簡介)

init是核心 kernel 初始化完成後啟動的第乙個程序。程序id為1。init的源 在system core init 目錄。參考 android的init過程分析 android的init過程詳解 一 android的init過程 二 初始化語言 init.rc 解析 android研究 an...

android init 程序原始碼除錯探索

android 系統native程序有很多,其中比較重要的有init,zygote,installd,dex2oat等,native程序的除錯是困難的,尤其是除錯其初始化過程,原因是沒有整合化除錯環境,雖然gdb是可能的,但是對使用者不具有易用性。android studio 隨能除錯so,但對na...

殭屍程序詳解

xk 鋪墊1 fork 和exec unix中派生乙個新的程序的唯一方法是fork 函式 有些系統可能提供它的各種變體 父程序中開啟的所有描述符在fork 之後由子程序分享。存放在硬碟上的程式檔案能夠被unix執行的唯一途徑是 由乙個現有程序呼叫exec函式中的某乙個 exec函式有6個,作用相同,...