亚洲精品自拍aⅴ在线_福利一区在线视频播放_五月天婷婷亚洲熟女一区_h片 AV 在线免费观看

广告加载失败 www.qilongs.com

Android 10.0系統(tǒng)啟動之Zygote進程(四)-「Android取經(jīng)之路」

來源:互聯(lián)網(wǎng)   閱讀:-

娛樂
2020
03/28
07:04

感謝您的閱讀與點贊!歡迎點擊右上角關注:「大貓玩程序」

微信公眾號:大貓玩程序

前幾節(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架構

5.問題分析

5.1 為什么SystemServer和Zygote之間通信要采用Socket

進程間通信我們常用的是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線程

5.2為什么一個java應用一個虛擬機?

  1. android的VM(vm==Virtual Machine )也是類似JRE的東西,當然,各方面都截然不同,不過有一個作用都是一樣的,為app提供了運行環(huán)境
  2. android為每個程序提供一個vm,可以使每個app都運行在獨立的運行環(huán)境,使穩(wěn)定性提高。
  3. vm的設計可以有更好的兼容性。android apk都被編譯成字節(jié)碼(bytecode),在運行的時候,vm是先將字節(jié)碼編譯真正可執(zhí)行的代碼,否則不同硬件設備的兼容是很大的麻煩。
  4. android(非ROOT)沒有windows下鍵盤鉤子之類的東西,每個程序一個虛擬機,各個程序之間也不可以隨意訪問內存,所以此類木馬病毒幾乎沒有。

5.3 什么是Zygote資源預加載

預加載是指在zygote進程啟動的時候就加載,這樣系統(tǒng)只在zygote執(zhí)行一次加載操作,所有APP用到該資源不需要再重新加載,減少資源加載時間,加快了應用啟動速度,一般情況下,系統(tǒng)中App共享的資源會被列為預加載資源。

zygote fork子進程時,根據(jù)fork的copy-on-write機制可知,有些類如果不做改變,甚至都不用復制,子進程可以和父進程共享這部分數(shù)據(jù),從而省去不少內存的占用。

5.4 Zygote為什么要預加載

應用程序都從Zygote孵化出來,應用程序都會繼承Zygote的所有內容。

如果在Zygote啟動的時候加載這些類和資源,這些孵化的應用程序就繼承Zygote的類和資源,這樣啟動引用程序的時候就不需要加載類和資源了,啟動的速度就會快很多。

開機的次數(shù)不多,但是啟動應用程序的次數(shù)非常多。

5.5 Zygote 預加載的原理是什么?

zygote進程啟動后將資源讀取出來,保存到Resources一個全局靜態(tài)變量中,下次讀取系統(tǒng)資源的時候優(yōu)先從靜態(tài)變量中查找。

6.總結

至此,Zygote啟動流程結束,Zygote進程共做了如下幾件事:

  1. 解析init.zygote64_32.rc,創(chuàng)建AppRuntime并調用其start方法,啟動Zygote進程。
  2. 創(chuàng)建JavaVM并為JavaVM注冊JNI.
  3. 通過JNI調用ZygoteInit的main函數(shù)進入Zygote的Java框架層。
  4. 通過ZygoteServer創(chuàng)建服務端Socket,預加載類和資源,并通過runSelectLoop函數(shù)等待如ActivityManagerService等的請求。
  5. 啟動SystemServer進程。

推薦閱讀:蘋果xr和蘋果x哪個好

 

THE END
本文系轉載,版權歸原作者所有;旨在傳遞信息,不代表烏魯木齊熱線的觀點和立場。

相關熱點

广告加载失败 www.qilongs.com

相關推薦