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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Zygote和System进程的启动过程

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

##init腳本的啟動(dòng)

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

linux內(nèi)核加載完成后,運(yùn)行init.rc腳本

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote stream 666
  • /system/bin/app_process Zygote服務(wù)啟動(dòng)的進(jìn)程名
  • --start-system-server 表明Zygote啟動(dòng)完成之后,要啟動(dòng)System進(jìn)程。
  • socket zygote stream 666 在Zygote啟動(dòng)時(shí),創(chuàng)建一個(gè)權(quán)限為666的socket。此socket用來請求Zygote創(chuàng)建新進(jìn)程。socket的fd保存在名稱為“ANDROID_SOCKET_zygote”的環(huán)境變量中。

##Zygote進(jìn)程的啟動(dòng)過程

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

app_process進(jìn)程

/system/bin/app_process
啟動(dòng)時(shí)創(chuàng)建了一個(gè)AppRuntime對象。通過AppRuntime對象的start方法,通過JNI調(diào)用創(chuàng)建了一個(gè)虛擬機(jī)實(shí)例,然后運(yùn)行com.android.internal.os.ZygoteInit類的靜態(tài)main方法,傳遞true(boolean
startSystemServer)參數(shù)。

ZygoteInit類

ZygoteInit類的main方法運(yùn)行時(shí),會(huì)通過registerZygoteSocket方法創(chuàng)建一個(gè)供ActivityManagerService使用的server socket。然后通過調(diào)用startSystemServer方法來啟動(dòng)System進(jìn)程。最后通過runSelectLoopMode來等待AMS的新建進(jìn)程請求。

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

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

    System進(jìn)程是在ZygoteInit的handleSystemServerProcess中開始啟動(dòng)的。

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

    +----------------------+ +-------+ +----------+ +----------------+ +-----------+ |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發(fā)起請求(通過之前保存的socket),攜帶各種參數(shù),包括“android.app.ActivityThread”。
    • Zygote進(jìn)程fork自己,然后在新Zygote進(jìn)程中調(diào)用RuntimeInit.zygoteInit方法進(jìn)行一系列的初始化(commonInit、Binder線程池初始化等)。
    • 新Zygote進(jìn)程中調(diào)用ActivityThread的main函數(shù),并啟動(dòng)消息循環(huán)。


    轉(zhuǎn)載于:https://www.cnblogs.com/cyf1314/p/8602978.html

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。