Zygote進程自身的啟動

android源碼學(xué)習(xí)目錄

背景

從上文中我們知道Zygote進程是怎樣啟動的, 這里分析Android Zygote進程main函數(shù)都做了什么工作。

1.啟動入口

 public static void main(String argv[]) {
        .....
            
            //創(chuàng)建一個server端的socket, name為zynote
            zygoteServer.registerServerSocket(socketName);
            // In some configurations, we avoid preloading resources and classes eagerly.
            // In such cases, we will preload things prior to our first fork.
            if (!enableLazyPreload) { 
                ....
                preload(bootTimingsTraceLog);  //預(yù)加載類好資源 
                ....
            } else {
                Zygote.resetNicePriority();
            }

            ....

            if (startSystemServer) {
                startSystemServer(abiList, socketName, zygoteServer);  //啟動SystemServer進程。
            }

            Log.i(TAG, "Accepting command socket connections");
             //開始等待socket命令請求,也就是ActivityManagerService請求
            zygoteServer.runSelectLoop(abiList);  

            zygoteServer.closeServerSocket();
        } catch (Zygote.MethodAndArgsCaller caller) {
            caller.run();
        } catch (Throwable ex) {
            Log.e(TAG, "System zygote died with exception", ex);
            zygoteServer.closeServerSocket();
            throw ex;
        }
    }

zygote進程main函數(shù)比較長,但它的主要工作可以總結(jié)為

  • 創(chuàng)建一個server端socket
  • 預(yù)加載類和資源
  • 啟動SystemServer進程
  • 啟動server端socket的監(jiān)聽,等待ActivityManagerService的請求。

這里我們要了解,zygote是一個孵化器進程,作為孵化器進程它自己最主要的工作就是創(chuàng)建好自身的環(huán)境為以后孵化進程做準備,在一個就是等待孵化請求,也就是這個server的socket接受請求,來孵化需要的進程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容