init是乙個由核心啟動的使用者級程序
init是linux系統中使用者空間的第乙個程序。由於android是基於linux核心的,所以init也是android系統中使用者空間的第乙個程序。
adb shell ps中init的pid為1,ppid為0
1.解析指令碼init.rc2.根據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;init.c(system/core/init/init.c)中的int main(int argc, char **argv)//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
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_action2.初始化呼叫過程: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個,作用相同,...