日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Zygote和System进程的启动过程

發布時間:2024/4/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Zygote和System进程的启动过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

##init腳本的啟動

+------------+ +-------+ +-----------+ |Linux Kernel+--> |init.rc+-> |app_process| +------------+ +-------+ +-----------+create and public server socket

linux內核加載完成后,運行init.rc腳本

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666
  • /system/bin/app_process Zygote服務啟動的進程名
  • --start-system-server 表明Zygote啟動完成之后,要啟動System進程。
  • socket zygote stream 666 在Zygote啟動時,創建一個權限為666的socket。此socket用來請求Zygote創建新進程。socket的fd保存在名稱為“ANDROID_SOCKET_zygote”的環境變量中。

##Zygote進程的啟動過程

create rumtime +-----------+ +----------+ |app_process+----------> |ZygoteInit| +-----------+ +-----+----+ | | | registerZygoteSocket()| +------+ startSystemServer() | |System| <-------+ | +------+ fork | runSelectLoopMode() | v

app_process進程

/system/bin/app_process
啟動時創建了一個AppRuntime對象。通過AppRuntime對象的start方法,通過JNI調用創建了一個虛擬機實例,然后運行com.android.internal.os.ZygoteInit類的靜態main方法,傳遞true(boolean
startSystemServer)參數。

ZygoteInit類

ZygoteInit類的main方法運行時,會通過registerZygoteSocket方法創建一個供ActivityManagerService使用的server socket。然后通過調用startSystemServer方法來啟動System進程。最后通過runSelectLoopMode來等待AMS的新建進程請求。

  • 在registerZygoteSocket方法中,通過名為ANDROID_SOCKET_zygote的環境獲取到zygote啟動時創建的socket的fd,然后以此來創建server socket。
  • 在startSystemServer方法中,通過Zygote.forkSystemServer方法創建了一個子進程,并將其用戶和用戶組的ID設置為1000。
  • 在runSelectLoopMode方法中,會將之前建立的server socket保存起來。然后進入一個無限循環,在其中通過selectReadable方法,監聽socket是否有數據可讀。有數據則說明接收到了一個請求。 selectReadable方法會返回一個整數值index。如果index為0,則說明這個是AMS發過來的連接請求。這時會與AMS建立一個新的socket連接,并包裝成ZygoteConnection對象保存起來。如果index大于0,則說明這是AMS發過來的一個創建新進程的請求。此時會取出之前保存的ZygoteConnection對象,調用其中的runOnce方法創建新進程。調用完成后將connection刪除。 這就是Zygote處理一次AMS請求的過程。
  • ##System進程的啟動

    + | | v fork() +--------------+ |System Process| +------+-------+ | | RuntimeInit.zygoteInit() commonInit, zygoteInitNative | init1() SurfaceFlinger, SensorServic... | | | init2() +------------+ +-------> |ServerThread| | +----+-------+ | | | | AMS, PMS, WMS... | | | | | | v v

    System進程是在ZygoteInit的handleSystemServerProcess中開始啟動的。

  • 首先,因為System進程是直接fork Zygote進程的,所以要先通過closeServerSocket方法關掉server socket。
  • 調用RuntimeInit.zygoteInit方法進一步啟動System進程。在zygoteInit中,通過commonInit方法設置時區和鍵盤布局等通用信息,然后通過zygoteInitNative方法啟動了一個Binder線程池。最后通過invokeStaticMain方法調用SystemServer類的靜態Main方法。
  • SystemServer類的main通過JNI調用cpp實現的init1方法。在init1方法中,會啟動各種以C++開發的系統服務(例如SurfaceFlinger和SensorService)。然后回調ServerServer類的init2方法來啟動以Java開發的系統服務。
  • 在init2方法中,首先會新建名為"android.server.ServerThread"的ServerThread線程,并調用其start方法。然后在該線程中啟動各種Service(例如AMS,PMS,WMS等)。啟動的方式是調用對應Service類的靜態main方法。
  • 首先,AMS會被創建,但未注冊到ServerManager中。然后PMS被創建,AMS這時候才注冊到ServerManager中。然后到ContentService、WMS等。 注冊到ServerManager中時會制定Service的名字,其后其他進程可以通過這個名字來獲取到Binder Proxy對象,以訪問Service提供的服務。
  • 執行到這里,System就將系統的關鍵服務啟動起來了,這時候其他進程便可利用這些Service提供的基礎服務了。
  • 最后會調用ActivityManagerService的systemReady方法,在該方法里會啟動系統界面以及Home程序。
  • ##Android進程啟動

    +----------------------+ +-------+ +----------+ +----------------+ +-----------+ |ActivityManagerService| |Process| |ZygoteInit| |ZygoteConnection| |RuntimeInit| +--------------+-------+ +---+---+ +-----+----+ +-----------+----+ +------+----+ | | | | | | | | | | startProcessLocked() | | | | +---------------> | | | | | | start() | | | | | "android.app.ActivityThread" | | | +-----------------> | | | | | | | | | | | | | | | |openZygoteSocketIfNeeded() | | | +------+ | | | | | | | | | | | <----+ | | | | | | | | | |sZygoteWriter.write(arg) | | | +------+ | | | | | | | | | | | | | | | | | <----+ | | | | | | | | | +--------------> | | | | | | | | | | |runSelectLoopMode() | | | | +-----------------+ | | | | | | | | | | | <---------------+ | | | | | acceptCommandPeer() | | | | | | | | | | | | | | runOnce() | | | | +------------------> | | | | | |forkAndSpecialize() | | | +-------------+ | | | | | | | | | | | <-----------+ | | | | | handleChildProc() | | | | | | | | | | | | | | | | | | | zygoteInit() | | | | +-------------> | | | | | | | | | | |in^okeStaticMain() | | | | +----------------> | | | | |("android.app.ActivityThread")| | | | | | | | | | + + + + +
    • AMS向Zygote發起請求(通過之前保存的socket),攜帶各種參數,包括“android.app.ActivityThread”。
    • Zygote進程fork自己,然后在新Zygote進程中調用RuntimeInit.zygoteInit方法進行一系列的初始化(commonInit、Binder線程池初始化等)。
    • 新Zygote進程中調用ActivityThread的main函數,并啟動消息循環。


    轉載于:https://www.cnblogs.com/cyf1314/p/8602978.html

    總結

    以上是生活随笔為你收集整理的Zygote和System进程的启动过程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。