首頁>技術>

前幾節已經講完了Android10.0的Init啟動過程。

這一節主要來講解Android10.0 的Zygote程序啟動流程。

1.概述

上一節接講解了InIt程序的整個啟動流程。Init程序啟動後,最重要的一個程序就是Zygote程序,Zygote是所有應用的鼻祖。SystemServer和其他所有Dalivik虛擬機器程序都是由Zygote fork而來。

Zygote程序由app_process啟動,Zygote是一個C/S模型,Zygote程序作為服務端,其他程序作為客戶端向它發出“孵化-fork”請求,而Zygote接收到這個請求後就“孵化-fork”出一個新的程序。

由於Zygote程序在啟動時會建立Java虛擬機器,因此通過fork而建立的應用程式程序和SystemServer程序可以在內部獲取一個Java虛擬機器的例項拷貝。

2.核心原始碼
/system/core/rootdir/init.rc/system/core/init/main.cpp/system/core/init/init.cpp/system/core/rootdir/init.zygote64_32.rc/frameworks/base/cmds/app_process/app_main.cpp/frameworks/base/core/jni/AndroidRuntime.cpp/libnativehelper/JniInvocation.cpp/frameworks/base/core/java/com/android/internal/os/Zygote.java/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java/frameworks/base/core/java/com/android/internal/os/ZygoteServer.java/frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java/frameworks/base/core/java/com/android/internal/os/RuntimeInit.java/frameworks/base/core/java/android/net/LocalServerSocket.java/system/core/libutils/Threads.cpp
3.架構

3.1 架構圖

3.2 Zygote 是如何被啟動的

 rc解析和程序呼叫: Init程序啟動後,會解析init.rc檔案,然後建立和載入service欄位指定的程序。zygote程序就是以這種方式,被init程序載入的。

3.2.1 init.zygote64_32.rc

第一個Zygote程序:

程序名為:zygote

程序通過 /system/bin/app_process64來啟動

 啟動引數:-Xzygote /system/bin --zygote --start-system-server --socket-name=zygote

socket的名稱:zygote

 service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote class main priority -20 user root //使用者為root group root readproc reserved_disk //訪問組支援 root readproc reserved_disk socket zygote stream 660 root system //建立一個socket,名字叫zygote,以tcp形式 ,可以在/dev/socket 中看到一個 zygote的socket socket usap_pool_primary stream 660 root system onrestart write /sys/android_power/request_state wake // onrestart 指當程序重啟時執行後面的命令 onrestart write /sys/power/state on onrestart restart audioserver onrestart restart cameraserver onrestart restart media onrestart restart netd onrestart restart wificond onrestart restart vendor.servicetracker-1-1 writepid /dev/cpuset/foreground/tasks // 建立子程序時,向 /dev/cpuset/foreground/tasks 寫入pid

第二個Zygote程序:zygote_secondary

程序通過 /system/bin/app_process32來啟動

啟動引數:-Xzygote /system/bin --zygote --socket-name=zygote_secondary --enable-lazy-preload

socket的名稱:zygote_secondary

service zygote_secondary /system/bin/app_process32 -Xzygote /system/bin --zygote --socket-name=zygote_secondary --enable-lazy-preload class main priority -20 user root group root readproc reserved_disk socket zygote_secondary stream 660 root system //建立一個socket,名字叫zygote_secondary,以tcp形式 ,可以在/dev/socket 中看到一個 zygote_secondary的socket socket usap_pool_secondary stream 660 root system onrestart restart zygote writepid /dev/cpuset/foreground/tasks

從上面我們可以看出,zygote是通過程序檔案 /system/bin/app_process64 和/system/bin/app_process32 來啟動的。

對應的程式碼入口為:frameworks/base/cmds/app_process/app_main.cpp

3.2.2 Zygote程序在什麼時候會被重啟

Zygote程序重啟,主要檢視rc檔案中有沒有 “restart zygote” 這句話。在整個Android系統工程中搜索“restart zygote”,會發現以下檔案:

 /frameworks/native/services/inputflinger/host/inputflinger.rc 對應程序: inputflinger /frameworks/native/cmds/servicemanager/servicemanager.rc 對應程序: servicemanager /frameworks/native/services/surfaceflinger/surfaceflinger.rc 對應程序: surfaceflinger /system/netd/server/netd.rc 對應程序: netd

通過上面的檔案可知,zygote程序能夠重啟的時機:

inputflinger 程序被殺 (onrestart)servicemanager 程序被殺 (onrestart)surfaceflinger 程序被殺 (onrestart)netd 程序被殺 (onrestart)zygote程序被殺 (oneshot=false)system_server程序被殺(waitpid)

3.3 Zygote 啟動後做了什麼

init程序通過init.zygote64_32.rc來呼叫/system/bin/app_process64 來啟動zygote程序,入口app_main.cpp呼叫AndroidRuntime的startVM()方法建立虛擬機器,再呼叫startReg()註冊JNI函式;通過JNI方式呼叫ZygoteInit.main(),第一次進入Java世界;registerZygoteSocket()建立socket通道,zygote作為通訊的服務端,用於響應客戶端請求;preload()預載入通用類、drawable和color資源、openGL以及共享庫以及WebView,用於提高app啟動效率;zygote完畢大部分工作,接下來再通過startSystemServer(),fork得力幫手system_server程序,也是上層framework的執行載體。zygote任務完成,呼叫runSelectLoop(),隨時待命,當接收到請求建立新程序請求時立即喚醒並執行相應工作。

3.4 Zygote啟動相關主要函式:

C空間:

 [app_main.cpp] main()[AndroidRuntime.cpp] start() [JniInvocation.cpp] Init() [AndroidRuntime.cpp] startVm() [AndroidRuntime.cpp] startReg() [Threads.cpp] androidSetCreateThreadFunc [AndroidRuntime.cpp] register_jni_procs() --> gRegJNI.mProc

Java空間:

 [ZygoteInit.java] main() [ZygoteInit.java] preload() [ZygoteServer.java] ZygoteServer [ZygoteInit.java] forkSystemServer [Zygote.java] forkSystemServer [Zygote.java] nativeForkSystemServer [ZygoteServer.java] runSelectLoop

下一節我們會對程式碼細節進行詳細的講解

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • flask!何方神聖