關(guān)于zygote的梳理20230202

背景

在前面的文章“安卓系統(tǒng)啟動”http://www.reibang.com/p/747bdfe1b055
我們簡單梳理過系統(tǒng)啟動的流程查乒,但是zygote部分我們沒有細講,今天我們來看一下它到底做了什么

流程

1纹蝴、我們簡單回顧一下zygote從哪里來的娄涩,在系統(tǒng)啟動的init進程的時候捷雕,會加載一個init.rc文件

  service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    socket zygote stream 666
    onrestart write /sys/android_power/request_state wake
    onrestart write /sys/power/state on
    onrestart restart media
    onrestart restart netd

2际跪、zygote進程是一個app_main.cpp 宪睹,在main方法里面徊哑,調(diào)用AppRuntime方法啟動虛擬機

// /frameworks/base/cmds/app_process64/app_main.cpp
int main(int argc, char* const argv[]){
    ......
    // startVm啟動虛擬機
    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
    ......
    while (i < argc) {
        const char* arg = argv[i++];
        if (strcmp(arg, "--zygote") == 0) {
            zygote = true;
            niceName = ZYGOTE_NICE_NAME;
        } else if (strcmp(arg, "--start-system-server") == 0) {
            startSystemServer = true;
        } else if (strcmp(arg, "--application") == 0) {
            application = true;
        } else if (strncmp(arg, "--nice-name=", 12) == 0) {
            niceName.setTo(arg + 12);
        } else if (strncmp(arg, "--", 2) != 0) {
            className.setTo(arg);
            break;
        } else {
            --i;
            break;
        }
    }
    ......
    // 啟動ZygoteInit的main方法
    if (zygote) {
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } else if (className) {
        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
    } else {
        ……
    }
}

3笛钝、然后我們來java層ZygoteInit類的main方法

  • 創(chuàng)建ZygoteServer质况,創(chuàng)建Server端的Socket
  • 預(yù)加載了資源
  • 啟動gc
  • 啟動SystemServer進程
  • 等待創(chuàng)建應(yīng)用進程的消息
public static void main(String argv[]) {
        ZygoteServer zygoteServer = new ZygoteServer();
             ...
            注冊socket監(jiān)聽
            zygoteServer.registerServerSocket(socketName);
            ... 
            預(yù)加載資源
            preload(bootTimingsTraceLog);
            ...
             啟動gc
            gcAndFinalize();
            fork SystemServer進程
            if (startSystemServer) {
                Runnable r = forkSystemServer(abiList, socketName, zygoteServer);

                // {@code r == null} in the parent (zygote) process, and {@code r != null} in the
                // child (system_server) process.
                if (r != null) {
                    r.run();
                    return;
                }
            }
            等待創(chuàng)建應(yīng)用進程的消息
           caller = zygoteServer.runSelectLoop(abiList);
 
 
    }

總結(jié)

zygote到底干嘛用的?
1玻靡、孵化SytemServer進程
2结榄、孵化應(yīng)用進程

預(yù)加載的圖

image.png

問題

1、為什么用zygote孵化進程囤捻?
zygote是安卓系統(tǒng)的native進程臼朗,是所有進程的父進程,它是init進程fork出來的蝎土,因為zygote預(yù)加載了資源视哑,在孵化進程的時候更加高效,還有就是systemServer進程上的進程摻雜了很多東西誊涯,不如一個進程做fork來的專一

2挡毅、zygote為什么不用binder通信?
個人理解暴构,涉及到了交互流程復(fù)雜度跪呈,還有就是zygote進程和systemServer進程是父子關(guān)系段磨,如果使用binder做了mmap,就會同用一套數(shù)據(jù)耗绿。
binder是安卓層的跨進程通信苹支,socket是SystemServer和zygote之間的通信。

3误阻、zygote和systemServer债蜜、ActivityThread他們的模式都是在進行必要的native初始化后,隨即調(diào)用Java層某個類的main函數(shù)究反,從而進入Java的世界寻定,主要邏輯都是在Java層完成

4、SystemServer進程上面跑了ams奴紧,pms特姐,wms等系統(tǒng)服務(wù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市黍氮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浅浮,老刑警劉巖沫浆,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異滚秩,居然都是意外死亡专执,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門郁油,熙熙樓的掌柜王于貴愁眉苦臉地迎上來本股,“玉大人,你說我怎么就攤上這事桐腌≈粝裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵案站,是天一觀的道長躬审。 經(jīng)常有香客問我,道長蟆盐,這世上最難降的妖魔是什么承边? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮石挂,結(jié)果婚禮上博助,老公的妹妹穿的比我還像新娘。我一直安慰自己痹愚,他們只是感情好富岳,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布蛔糯。 她就那樣靜靜地躺著,像睡著了一般城瞎。 火紅的嫁衣襯著肌膚如雪渤闷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天脖镀,我揣著相機與錄音飒箭,去河邊找鬼。 笑死蜒灰,一個胖子當著我的面吹牛弦蹂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播强窖,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凸椿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翅溺?” 一聲冷哼從身側(cè)響起脑漫,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咙崎,沒想到半個月后优幸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡褪猛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年网杆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伊滋。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡碳却,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笑旺,到底是詐尸還是另有隱情昼浦,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布燥撞,位于F島的核電站座柱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏物舒。R本人自食惡果不足惜色洞,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冠胯。 院中可真熱鬧火诸,春花似錦、人聲如沸荠察。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盯荤,卻和暖如春馋吗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秋秤。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工宏粤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灼卢。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓绍哎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鞋真。 傳聞我的和親對象是個殘疾皇子崇堰,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容