詳細分析Android-Zygote的啟動過程
Android系統(tǒng)中,DVM,ART,應用程序進程和運行系統(tǒng)的關(guān)鍵服務的SystemServer進程都是Zygote創(chuàng)建的。他通過fork的形式來創(chuàng)建。由于Zygote在啟動時會創(chuàng)建DVM或者ART,因此通過fork而創(chuàng)建的應用程序進程和SystemServer進程可以在內(nèi)部獲取一個DVM或者ART的實例副本。
在啟動Zygote的時候,會根據(jù)ro.zygote屬性來控制使用不同的Zygote啟動腳本。啟動腳本放在System/core/rootdir目錄中。
Zygote在啟動的時候會走到ZygoteInit的main方法,在這個方法中主要做了以下這些事:
- 創(chuàng)建一個Server端的Socket
- 預加載類和資源
- 啟動SystemServer進程
- 等待AMS請求創(chuàng)建新的應用程序進程
通過JNI調(diào)用ZygoteInit的main方法后,Zygote便進入了java層,此前的所有代碼都沒有java層,Zygote開創(chuàng)了java框架層。
Zygote創(chuàng)建的Socket的name為zygote,用于等待ActivityManagerService請求Zygote創(chuàng)建新應用程序進程。
在啟動了SystemServer進程后,系統(tǒng)的服務也會由SystemServer進程啟動起來。
最后就會調(diào)用方法,等待AMS請求創(chuàng)建新的應用程序進程。
創(chuàng)建Socket
在創(chuàng)建Socket的時候,會創(chuàng)建一個名字,名字為【ANDROID_SOCKET_zygote】,通過這個名字獲取環(huán)境變量的值,文件描符參數(shù),最后創(chuàng)建一個文件描述符,在生成LocalServerSocket的時候傳入。這個也就是服務端的Socket。Zygote將SystemServer進程啟動后,就會在這個服務端的Socket上等待AMS的信號。
啟動SystemServer
需要先創(chuàng)建一個args數(shù)組,用來保存啟動SystemServer的啟動參數(shù)。SystemServer進程的用戶id和用戶組id設置為1000,進程名字為system_server,啟動的類名為:com.android.server.SystemServer。接著會調(diào)用Zygote的forkSystemServer方法,其內(nèi)部會調(diào)用nativeForkSystemServer這個Native方法,最終通過fork函數(shù)在當前進程創(chuàng)建一個子進程,就是SystemServer進程。如果forkSystemServer方法返回的pid為0,表示當前代碼運行在新創(chuàng)建的子進程中,則會執(zhí)行handleSystemServerProcess來處理SystemServer進程。
等待AMS
獲取到前面創(chuàng)建的Socket的fd字段的值,添加到一個fds列表中。接下來就無限循環(huán)等待AMS的請求。會有一個無限循環(huán),在這個循環(huán)中會將fds的數(shù)據(jù)轉(zhuǎn)移到pollFds數(shù)組上,然后對pollFds進行遍歷,遍歷的同時會判斷當前Zygote進程是否與AMS建立了連接。如果建立了連接,調(diào)用acceptCommamdPeer方法得到ZygoteConnection類并添加到Socket連接列表peers中。然后將ZygoteConnection的fd添加到fds列表中,以便可以接收AMS發(fā)送過來的請求。如果在遍歷pollFds的時候不是與AMS建立連接,那么就是創(chuàng)建應用的請求,回調(diào)用ZygoteConnection的runOnce方法創(chuàng)建一個新的應用程序進程,創(chuàng)建成功后會將這個Socket從peers和fds中清除。
Zygote進程啟動總結(jié):
- 啟動Zygote進程
- 創(chuàng)建虛擬機,為Java虛擬機注冊JNI方法
- 通過JNI調(diào)用ZygoteInit的main函數(shù),進入Java框架層
- 通過registerZygoteSocket方法創(chuàng)建服務端Socket,通過funSelectLoop方法等待AMS請求。
- 啟動SystemServer進程
以上就是Android-Zygote啟動過程詳解的詳細內(nèi)容,更多關(guān)于Android-Zygote啟動的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IDEA打包jar-解決找不到或無法加載主類 main的問題
這篇文章主要介紹了IDEA打包jar-解決找不到或無法加載主類 main的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Android 模仿QQ側(cè)滑刪除ListView功能示例
這篇文章主要介紹了Android 模仿QQ側(cè)滑刪除ListView功能示例,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03利用libmp3lame實現(xiàn)在Android上錄音MP3文件示例
本篇文章主要介紹了利用Lame庫實現(xiàn)在Android上錄音MP3文件示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03Android黑科技之讀取用戶短信+修改系統(tǒng)短信數(shù)據(jù)庫
這篇文章主要介紹了Android黑科技之讀取用戶短信+修改系統(tǒng)短信數(shù)據(jù)庫 的相關(guān)資料,需要的朋友可以參考下2015-12-12Kotlin擴展函數(shù)及實現(xiàn)機制的深入探索
擴展函數(shù)與擴展屬性的神奇之處在于,可以在不修改原來類的條件下,使用函數(shù)和屬性,表現(xiàn)得就像是屬于這個類的一樣。下面這篇文章主要給大家介紹了關(guān)于Kotlin擴展函數(shù)及實現(xiàn)機制的相關(guān)資料,需要的朋友可以參考下2018-06-06神奇的listView實現(xiàn)自動顯示隱藏布局Android代碼
這篇文章主要介紹了神奇的listView實現(xiàn)自動顯示隱藏布局Android代碼實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09