Zygote(app_process)相关分析1
首先我們從Init.c中來看,當Init中解析完init.rc文件時會得到一系列的action,通過action去調(diào)用一些函數(shù)。
Zygote是在init.rc中service section中
servicezygote/system/bin/app_process-Xzygote/system/bin--zygote--start-system-server
在parse_new_section()中會解析init.rc文件,最后會添加到相應(yīng)的鏈表中。
service 關(guān)鍵字定義的服務(wù)將會添加到 service_list 鏈表中。 on 關(guān)鍵開頭的項將會被會添加到 action_list 鏈表中。
1.在init.c中執(zhí)行
action_for_each_trigger(“boot”,…); //創(chuàng)建zygote是從boot階段開始。 drain_action_queue()
以上是執(zhí)行action_list 中的命令:
從action_list 中取出 act->name ,再調(diào)用 action_add_queue_tail(act)將其插入到隊列 action_queue 尾部。
drain_action_queue() 從action_list隊列中取出隊列項 ,然后執(zhí)行act->commands列表中的所有命令。
init.rc中COMMAND:
class_start default
在添加到service_list 鏈表中時 svc->classname = "default";
default 啟動所有service 關(guān)鍵字定義的服務(wù)。
class_start 被觸發(fā)會調(diào)用do_class_start();
2.do_class_start()中會執(zhí)行
service_for_each_class(args[1],..); //從service_list 鏈表中獲取service后啟動。 service_start(svc, NULL); //service_start_if_not_disabled的被啟動。
3.接著會調(diào)用service_start()
此函數(shù)中init中fork出一個進程。
根據(jù)socketinfo創(chuàng)建socket(zygote stream 666)。
利用execve函數(shù)來執(zhí)行zygote的可執(zhí)行文件/system/bin/app_process。
這樣app_process的main函數(shù)就被啟動起來了。也就是Zygote。Zygote的啟動就這樣分析完了。
接下來分析一下zygote的onrestart。
4.重啟zygote
子進程(zygote)退出時會調(diào)用sigchld_handler(),此函數(shù)中會往signal_fd中寫數(shù)據(jù)。
這時init進程的socket會接收信息。就會從init中的poll函數(shù)中返回。(signal_fd是在init中通過socketpair創(chuàng)建的兩個socket中的一個。)
flag設(shè)置為SVC_RESTARTING后執(zhí)行service的onresatart中的COMMAND。
poll()中返回后,會進入新的循環(huán),會通過flag重啟所有RESTARTING的svc。
drain_action_queue();
restart_process();
最后又被service_start函數(shù)重啟了。
總結(jié)
以上是生活随笔為你收集整理的Zygote(app_process)相关分析1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机设备操作与讲解,计算机组成与操作系
- 下一篇: 计算机课中初中一年级学生特点分析,初中信