當前位置: 車展網首頁 > 金融 > 正文

Android 10.0系統啟動之Zygote進程(四)-「Android取經之路」

Android 10.0系統啟動之Zygote進程(四)-「Android取經之路」

感謝您的閱讀與點贊!歡迎點擊右上角關注:「大貓玩程序」微信公眾號:大貓玩程序前幾節已經講完了Android10.0的Init啟動過程以及Zygote的架構。Android 10.

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

微信公眾號:大貓玩程序

前幾節已經講完了Android10.0的Init啟動過程以及Zygote的架構。

Android 10.0系統源碼取經之路——啟動篇Android系統架構淺析-「Android取經之路」Android是怎么啟動的-「Android取經之路」

Android 10.0系統啟動之init進程(一)-「Android取經之路」Android 10.0系統啟動之init進程(二)-「Android取經之路」Android 10.0系統啟動之init進程(三)-「Android取經之路」

Android 10.0系統啟動之init進程(四)-「Android取經之路」Android 10.0系統啟動之Zygote進程(一)-「Android取經之路」

Android 10.0系統啟動之Zygote進程(二)-「Android取經之路」

Android 10.0系統啟動之Zygote進程(三)-「Android取經之路」

這一節開始針對于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線程,

需要再把參數封裝為一個ActivityClientRecord,sendMessage發送給H類(主線程Handler,ActivityThread內部類)

主要原因:害怕父進程binder線程有鎖,然后子進程的主線程一直在等其子線程(從父進程拷貝過來的子進程)的資源,但是其實父進程的子進程并沒有被拷貝過來,造成死鎖,

所以fork不允許存在多線程。而非常巧的是Binder通訊偏偏就是多線程,所以干脆父進程(Zgote)這個時候就不使用binder線程

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

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

5.3 什么是Zygote資源預加載

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

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

5.4 Zygote為什么要預加載

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

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

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

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

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

6.總結

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

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

推薦閱讀:高通驍龍850

[責任編輯:無]
末平分野50手电子游戏 新疆25选7 温州麻将怎么算分 北京11选5玩法及奖金 真人麻将赢钱红包平台 国内原油期货双边 乐乐安徽安庆麻将下载 广东快乐10分龙虎 不懂股票的人怎么玩 四川麻将血战到底下载四人 大发快三有规律吗 黑龙江p62彩票 韩国a片电影 山西11选5软件 娱乐棋牌官网 青海快3走势图今天 15选5基本走势图带连线走势图