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

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

前幾節已經講完了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 架構圖

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

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進程能夠重啟的時機:

  1. inputflinger 進程被殺 (onrestart)
  2. servicemanager 進程被殺 (onrestart)
  3. surfaceflinger 進程被殺 (onrestart)
  4. netd 進程被殺 (onrestart)
  5. zygote進程被殺 (oneshot=false)
  6. system_server進程被殺(waitpid)

3.3 Zygote 啟動後做了什麼

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

  1. init進程通過init.zygote64_32.rc來調用/system/bin/app_process64 來啟動zygote進程,入口app_main.cpp
  2. 調用AndroidRuntime的startVM()方法創建虛擬機,再調用startReg()註冊JNI函數;
  3. 通過JNI方式調用ZygoteInit.main(),第一次進入Java世界;
  4. registerZygoteSocket()建立socket通道,zygote作為通信的服務端,用於響應客戶端請求;
  5. preload()預加載通用類、drawable和color資源、openGL以及共享庫以及WebView,用於提高app啟動效率;
  6. zygote完畢大部分工作,接下來再通過startSystemServer(),fork得力幫手system_server進程,也是上層framework的運行載體。
  7. 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

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


分享到:


相關文章: