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