系統進程 zygote(一)—— 概述


和藹的春光,充滿鴛鴦的池塘;快辭別寂寞的夢鄉,來和我摸一會魚兒,折一枝海棠。—— 徐志摩·醒!醒!

ilocker:關注 Android 安全(新入行,0基礎) QQ: 2597294287

先看一張圖 (android boot sequence,出處不詳):

android 的底層是 linux kernel,由 bootloader 負責加載。kernel 啟動后,首先啟動 init 進程,再由 init 進程依次啟動系統所需的其他進程,包括 zygote 進程。

由 init 啟動的進程在“system\core\rootdir\root.rc”腳本中都有描述:

 

再來看 zygote.rc (以 init.zygote32.rc 為例):

 

這段腳本要求 init 進程創建一個名為 zygote 的進程,該進程要執行的程序是“/system/bin/app_process”。並且為 zygote 進程創建一個 socket 資源 (用於進程間通信,ActivityManagerService 就是通過該 socket 請求 zygote 進程 fork 一個應用程序進程)。

后面的“--zygote”是傳給 app_process 的參數,表示啟動的是 zygote 進程。在 app_process 的 main 函數中會依據該參數決定執行 ZygoteInit 還是 Java 類,后面的筆記再繼續學習。

zygote 進程在初始化時會啟動虛擬機,並加載一些系統資源。這樣 zygote fork 出子進程后,子進程也繼承了能正常工作的虛擬機和各種系統資源,接下來只需裝載 apk 文件的字節碼就可以運行應用程序了,可以大大縮短應用的啟動時間,這就是 zygote 進程的主要作用。

Java 應用程序不能直接以本地進程的形態運行,必須在一個獨立的虛擬機中運行。如果每次都重新啟動虛擬機,將嚴重拖慢應用程序的啟動速度。

Linux 的進程都是 fork 出來的,fork 出的子進程與父進程共享內存映像。只有當子進程改寫內存時,操作系統才會為其分配一個新頁面,並將老頁面上的數據復制一份到新頁面,這就是“寫時拷貝(Copy On Write)”。

學習資料:(1)http://blog.csdn.net/luoshengyang/article/details/6768304 (2)《Android 框架揭秘》(3)《深入解析 Android 5.0 系統》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM