Android應用程序啟動邏輯-Zygote篇


Android應用程序啟動邏輯-Zygote篇

上一篇文章《Android應用程序的啟動邏輯-中間層》,從源碼的角度分析了客戶端的邏輯。主要是socket連接,應用啟動參數發送,以及狀態讀取。

本文承接上文,從源碼的角度分析服務端的socket創建、監聽和執行應用啟動等邏輯。主要涉及文件:

Frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

Frameworks/base/core/java/com/android/internal/os/ZygoteServer.java

Frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java

Frameworks/base/core/java/android/net/LocalServerSocket.java

Frameworks/base/core/java/android/net/LocalSocketImpl.java

在前面的文章中,已經分析過zygote進程的啟動邏輯,zygote進程啟動過程中會執行到ZygoteInit的main()方法。本文以此為切入點,zygote進程的main()方法,會創建socket server,然後進入loop等待客戶端進程發起連接。主要是下面三行代碼,表示主流程:

Frameworks/base/core/java/com/android/internal/os/ZygoteInit.java : main()

Android應用程序啟動邏輯-Zygote篇

下面會逐一進行展開,閱讀分析每個步驟裡面的邏輯,依次是:ZygoteServer初始化、註冊socket server、loop邏輯、客戶端連接響應邏輯。

ZygoteServer初始化

ZygoteServer是被Zygote進程使用的socket server類。這個類提供等待UNIX domain socket命令並創建子進程的功能。

構造方法是空的,ZygoteServer初始化不做任何動作:

Android應用程序啟動邏輯-Zygote篇

註冊socket server

Android應用程序啟動邏輯-Zygote篇

這裡涉及到一個知識點,環境變量ANDROID_SOCKET_zygote是init進程在解析init.zygote32.rc文件時,根據socket行,設置的。

Android應用程序啟動邏輯-Zygote篇

loop邏輯

zygote進程從這裡開始進入無限循環邏輯。這裡涉及到一個知識點,Linux內核中的一種IO事件處理機制epoll。在整個Android系統中,這個機制被大量使用。簡單來說,通過epoll機制,監控文件描述符,當文件發生讀寫事件時,會立刻通知相應的應用程序去執行讀寫操作。epoll是同步IO,會阻塞當前進程。

Android應用程序啟動邏輯-Zygote篇

Android應用程序啟動邏輯-Zygote篇

客戶端連接處理邏輯

繼續上一節ZygoteConnection.processOneCommand()。這裡涉及到fork()的知識點,fork()返回的pid值在父進程和子進程是不一樣的。父進程返回的pid是子進程的pid值(大於0),子進程返回的pid值是0。

Android應用程序啟動邏輯-Zygote篇

至此,如果是主進程zygote,會返回null,繼續loop循環,分析到此為止。如果是子進程,執行完handleChildProc()方法,會跳出loop循環,繼續子進程後面的邏輯。下面繼續子進程的處理邏輯。

子進程處理程序

繼續上一節的ZygoteConnection.handleChildProc()

Android應用程序啟動邏輯-Zygote篇

ZygoteInit.zygoteInit()

Android應用程序啟動邏輯-Zygote篇

寫在結尾的話

至此,zygote進程如何註冊zygote socket server,如何監聽處理system_server進程的應用程序啟動請求,以及應用程序進程的前置邏輯,就分析完了。

接下來,會繼續分析應用程序進程的啟動邏輯(實際邏輯)。


分享到:


相關文章: