Zygote(app_process)相關分析1,zygoteapp_process
首先我們從Init.c中來看,當Init中解析完init.rc檔案時會得到一系列的action,通過action去調用一些函數。
Zygote是在init.rc中service section中
- service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
在parse_new_section()中會解析init.rc檔案,最後會添加到相應的鏈表中。
service 關鍵字定義的服務將會添加到 service_list 鏈表中。on 關鍵開頭的項將會被會添加到 action_list 鏈表中。
1.在init.c中執行
action_for_each_trigger(“boot”,…); //建立zygote是從boot階段開始。drain_action_queue()
以上是執行action_list 中的命令:
從action_list 中取出 act->name ,再調用 action_add_queue_tail(act)將其插入到隊列 action_queue 尾部。
drain_action_queue() 從action_list隊列中取出隊列項 ,然後執行act->commands列表中的所有命令。
init.rc中COMMAND:
class_start default
在添加到service_list 鏈表中時 svc->classname = "default";
default 啟動所有service 關鍵字定義的服務。
class_start 被觸發會調用do_class_start();
2.do_class_start()中會執行
service_for_each_class(args[1],..); //從service_list 鏈表中擷取service後啟動。service_start(svc, NULL); //service_start_if_not_disabled的被啟動。
3.接著會調用service_start()
- 此函數中init中fork出一個進程。
- 根據socketinfo建立socket(zygote stream 666)。
- 利用execve函數來執行zygote的可執行檔/system/bin/app_process。
這樣app_process的main函數就被啟動起來了。也就是Zygote。Zygote的啟動就這樣分析完了。
接下來分析一下zygote的onrestart。
4.重啟zygote
drain_action_queue(); restart_process();
最後又被service_start函數重啟了。