Zygote(app_process)相關分析1,zygoteapp_process

來源:互聯網
上載者:User

Zygote(app_process)相關分析1,zygoteapp_process

首先我們從Init.c中來看,當Init中解析完init.rc檔案時會得到一系列的action,通過action去調用一些函數。

Zygote是在init.rc中service section中

  1. 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函數重啟了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.