![Android應用程序啟動邏輯-Zygote篇](http://p2.ttnews.xyz/loading.gif)
上一篇文章《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篇](http://p2.ttnews.xyz/loading.gif)
下面會逐一進行展開,閱讀分析每個步驟裡面的邏輯,依次是:ZygoteServer初始化、註冊socket server、loop邏輯、客戶端連接響應邏輯。
ZygoteServer初始化
ZygoteServer是被Zygote進程使用的socket server類。這個類提供等待UNIX domain socket命令並創建子進程的功能。
構造方法是空的,ZygoteServer初始化不做任何動作:
註冊socket server
這裡涉及到一個知識點,環境變量ANDROID_SOCKET_zygote是init進程在解析init.zygote32.rc文件時,根據socket行,設置的。
loop邏輯
zygote進程從這裡開始進入無限循環邏輯。這裡涉及到一個知識點,Linux內核中的一種IO事件處理機制epoll。在整個Android系統中,這個機制被大量使用。簡單來說,通過epoll機制,監控文件描述符,當文件發生讀寫事件時,會立刻通知相應的應用程序去執行讀寫操作。epoll是同步IO,會阻塞當前進程。
客戶端連接處理邏輯
繼續上一節ZygoteConnection.processOneCommand()。這裡涉及到fork()的知識點,fork()返回的pid值在父進程和子進程是不一樣的。父進程返回的pid是子進程的pid值(大於0),子進程返回的pid值是0。
至此,如果是主進程zygote,會返回null,繼續loop循環,分析到此為止。如果是子進程,執行完handleChildProc()方法,會跳出loop循環,繼續子進程後面的邏輯。下面繼續子進程的處理邏輯。
子進程處理程序
繼續上一節的ZygoteConnection.handleChildProc()
ZygoteInit.zygoteInit()
寫在結尾的話
至此,zygote進程如何註冊zygote socket server,如何監聽處理system_server進程的應用程序啟動請求,以及應用程序進程的前置邏輯,就分析完了。
接下來,會繼續分析應用程序進程的啟動邏輯(實際邏輯)。
閱讀更多 做事情的幻想家 的文章