Zygote(app_process)相关分析1
首先我們從Init.c中來看,當Init中解析完init.rc文件時會得到一系列的action,通過action去調用一些函數。
Zygote是在init.rc中service section中
servicezygote/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
子進程(zygote)退出時會調用sigchld_handler(),此函數中會往signal_fd中寫數據。
這時init進程的socket會接收信息。就會從init中的poll函數中返回。(signal_fd是在init中通過socketpair創建的兩個socket中的一個。)
flag設置為SVC_RESTARTING后執行service的onresatart中的COMMAND。
poll()中返回后,會進入新的循環,會通過flag重啟所有RESTARTING的svc。
drain_action_queue();
restart_process();
最后又被service_start函數重啟了。
總結
以上是生活随笔為你收集整理的Zygote(app_process)相关分析1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机设备操作与讲解,计算机组成与操作系
- 下一篇: 人生首卡选择哪家银行信用卡好批?这些申卡