來源:互聯(lián)網(wǎng) 閱讀:-
感謝您的閱讀與點贊!歡迎點擊右上角關注:「大貓玩程序」
微信公眾號:大貓玩程序
前幾節(jié)已經(jīng)講完了Android10.0的Init啟動過程以及Zygote的架構。
Android 10.0系統(tǒng)源碼取經(jīng)之路——啟動篇Android系統(tǒng)架構淺析-「Android取經(jīng)之路」Android是怎么啟動的-「Android取經(jīng)之路」
Android 10.0系統(tǒng)啟動之init進程(一)-「Android取經(jīng)之路」Android 10.0系統(tǒng)啟動之init進程(二)-「Android取經(jīng)之路」Android 10.0系統(tǒng)啟動之init進程(三)-「Android取經(jīng)之路」
Android 10.0系統(tǒng)啟動之init進程(四)-「Android取經(jīng)之路」Android 10.0系統(tǒng)啟動之Zygote進程(一)-「Android取經(jīng)之路」
Android 10.0系統(tǒng)啟動之Zygote進程(二)-「Android取經(jīng)之路」
Android 10.0系統(tǒng)啟動之Zygote進程(三)-「Android取經(jīng)之路」
這一節(jié)開始針對于Zygote的一些問題進行分析。
Zygote架構
進程間通信我們常用的是binder,為什么這里要采用socket呢。
主要是為了解決fork的問題:
1.UNIX上C++程序設計守則3:多線程程序里不準使用fork
2.Binder通訊是需要多線程操作的,代理對象對Binder的調用是在Binder線程,需要再通過Handler調用主線程來操作。
比如AMS與應用進程通訊,AMS的本地代理IApplicationThread通過調用ScheduleLaunchActivity,調用到的應用進程ApplicationThread的ScheduleLaunchActivity是在Binder線程,
需要再把參數(shù)封裝為一個ActivityClientRecord,sendMessage發(fā)送給H類(主線程Handler,ActivityThread內部類)
主要原因:害怕父進程binder線程有鎖,然后子進程的主線程一直在等其子線程(從父進程拷貝過來的子進程)的資源,但是其實父進程的子進程并沒有被拷貝過來,造成死鎖,
所以fork不允許存在多線程。而非常巧的是Binder通訊偏偏就是多線程,所以干脆父進程(Zgote)這個時候就不使用binder線程
預加載是指在zygote進程啟動的時候就加載,這樣系統(tǒng)只在zygote執(zhí)行一次加載操作,所有APP用到該資源不需要再重新加載,減少資源加載時間,加快了應用啟動速度,一般情況下,系統(tǒng)中App共享的資源會被列為預加載資源。
zygote fork子進程時,根據(jù)fork的copy-on-write機制可知,有些類如果不做改變,甚至都不用復制,子進程可以和父進程共享這部分數(shù)據(jù),從而省去不少內存的占用。
應用程序都從Zygote孵化出來,應用程序都會繼承Zygote的所有內容。
如果在Zygote啟動的時候加載這些類和資源,這些孵化的應用程序就繼承Zygote的類和資源,這樣啟動引用程序的時候就不需要加載類和資源了,啟動的速度就會快很多。
開機的次數(shù)不多,但是啟動應用程序的次數(shù)非常多。
zygote進程啟動后將資源讀取出來,保存到Resources一個全局靜態(tài)變量中,下次讀取系統(tǒng)資源的時候優(yōu)先從靜態(tài)變量中查找。
至此,Zygote啟動流程結束,Zygote進程共做了如下幾件事:
推薦閱讀:蘋果xr和蘋果x哪個好