<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                #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的新建進程請求。 1. 在registerZygoteSocket方法中,通過名為ANDROID_SOCKET_zygote的環境獲取到zygote啟動時創建的socket的fd,然后以此來創建server socket。 2. 在startSystemServer方法中,通過Zygote.forkSystemServer方法創建了一個子進程,并將其用戶和用戶組的ID設置為1000。 3. 在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中開始啟動的。 1. 首先,因為System進程是直接fork Zygote進程的,所以要先通過closeServerSocket方法關掉server socket。 2. 調用RuntimeInit.zygoteInit方法進一步啟動System進程。在zygoteInit中,通過commonInit方法設置時區和鍵盤布局等通用信息,然后通過zygoteInitNative方法啟動了一個Binder線程池。最后通過invokeStaticMain方法調用SystemServer類的靜態Main方法。 3. SystemServer類的main通過JNI調用cpp實現的init1方法。在init1方法中,會啟動各種以C++開發的系統服務(例如SurfaceFlinger和SensorService)。然后回調ServerServer類的init2方法來啟動以Java開發的系統服務。 4. 在init2方法中,首先會新建名為"android.server.ServerThread"的ServerThread線程,并調用其start方法。然后在該線程中啟動各種Service(例如AMS,PMS,WMS等)。啟動的方式是調用對應Service類的靜態main方法。 5. 首先,AMS會被創建,但未注冊到ServerManager中。然后PMS被創建,AMS這時候才注冊到ServerManager中。然后到ContentService、WMS等。 注冊到ServerManager中時會制定Service的名字,其后其他進程可以通過這個名字來獲取到Binder Proxy對象,以訪問Service提供的服務。 6. 執行到這里,System就將系統的關鍵服務啟動起來了,這時候其他進程便可利用這些Service提供的基礎服務了。 7. 最后會調用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函數,并啟動消息循環。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看