<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 功能強大 支持多語言、二開方便! 廣告
                ### Framework運行環境是怎樣的? 安卓系統啟動過程其實是建立一套系統運行需要的環境。 Framework運行環境如下: ![這里寫圖片描述](https://box.kancloud.cn/2016-03-28_56f8ee3a606e8.jpg "") 安卓系統中運行的第一個Dalvik虛擬機叫做zygote,意思是“卵”。這個“卵”還是挺有用的,因為接下來所有的Dalvik虛擬機進程都是這個“卵”孵化出來的。 zygote進程中包含兩個主要模塊,分別如下: - Socket服務端。用于接收啟動新的Dalvik進程的命令。 - Framework共享類及共享資源。當zygote進程啟動后會加載一些共享的類及資源,其中共享類是在preload-classes文件中被定義的,共享資源是在preload-resources中被定義的。其他Dalvik進程是被zygote進程孵化出來的,所以這些類和資源加載后,新的Dalvik進程就可以直接使用這些類和資源就達到了共享目的。 zygote進程對應的程序是app_process,該程序在system/bin目錄下。 zygote孵化出的第一個Dalvik進程是SystemServer,該進程對應的程序依然是app_process,因為該進程是從app_process中孵化出來的。 SystemServer中創建了一個Socket客戶端,之后所有的Dalvik進程都將通過該Socket客戶端間接被啟動,Ams負責管理這個客戶端。如果需要啟動新的APK進程時,Ams會通過該Socket客戶端向zygote進程的Socket服務端發送一個啟動命令,然后zygote會孵化出新的進程。 這樣的架構有兩個特點: - 每一個進程都是一個Dalvik虛擬機,Dalvik虛擬機是一種類似于java虛擬機的程序。 - zygote進程會預先裝載共享類和共享資源,這些類和資源其實就是SDK中定義的大部分類和資源。當通過zygote孵化出新進程后,新的APK只需要去加載APK自身包含的類和資源,這樣多個APK就可以共享Framework資源了。 ### 和Dalvik虛擬機有聯系的可執行程序有哪些? ### 1.dalvikvm java程序運行時都是由一個虛擬機來解釋java字節碼,將這些字節碼翻譯成本地CPU指令碼然后執行。dalvikvm的作用就是創建一個虛擬機并執行參數中指定的java類。 ### 2.dvz dvz的作用是從zygote進程中孵化出一個新的進程,新進程其實就是一個Dalvik虛擬機。該進程與dalvikvm啟動的虛擬機相比,區別是該進程中已經預裝了Framework的大部分類和資源。 ### 3.app_process Framework在啟動時需要加載運行兩個特定java類,一個是ZygoteInit.java,一個是SystemServer.java。為了方便使用,系統才提供了一個app_process進程,該進程會自動運行這兩個類,app_process其實就是使用dalvikvm啟動ZygoteInit.java,啟動后會加載Framework中得大部分類和資源。 ### Zygote是如何啟動的? ### 1.在init.rc中配置Zygote啟動參數 ### 2.啟動Socket服務端口 當Zygote服務從app_process開始啟動后,會啟動一個Dalvik虛擬機,虛擬機第一個執行的java類就是ZygoteInit.java,該類第一個重要的工作就是啟動一個Socket服務端口,該Socket端口用于接收啟動新進程的命令。 ### 3.加載preload-classes 在Zygote類的main()函數中,創建完Socket服務端后還不能立即孵化出新的進程,因為這個“卵”還沒有必須的“核酸”,這個“核酸”就是指預裝的Framework大部分類及資源。 ### 4.加載preload-resources preload-resources包含兩類資源,一類是drawable資源,一類是color資源。加載這些資源是在preloadResource()函數中完成的,該函數調用preloadDrawable()和preloadColorStateLists()加載這兩類資源,原理就是把這些資源讀出來放到一個全局變量中,只要該類對象不被銷毀,這些全局變量就會一直保存。 ### 5.使用fork啟動新的進程 fork是Linux系統的一個系統調用,作用就是復制當前進程產生一個新的進程。除了進程id不同,新進程將擁有和原始進程完全相同的進程信息。進程的信息包括該進程所打開的文件描述符列表、所分配的內存等。當新進程被創建后,兩個進程將共享已經分配的內存空間,如果其中一個需要向內存中寫入數據時,操作系統才復制一份目標地址空間,并將要寫的數據寫入到新的地址中。這種“僅當寫的時候才復制”的機制可以最大限度的在多個進程中共享物理內存。 #### 舉個栗子: 去烏鎮見一下習大大和去烏鎮吃一次丁磊的豬肉,這是兩個進程,但是兩個進程中的很多任務是相同的,先訂機票,做地鐵到機場,做幾小時飛機過去。到了之后不同的就是見習大大和吃豬肉。如果可以先雇一個秘書進程讓它訂機票、做地鐵、做飛機,到烏鎮。然后秘書在復制出兩個秘書,一個去見習大大,一個去吃豬肉,好處是節省了大量內存。 Zygote進程就是本例中的“秘書進程”,那些“訂機票、做地鐵、乘飛機”就是Zygote進程中加載的preload-classes類的功能。 這樣新的進程就脫離的Zygote進程的孵化成為一個真正的應用進程。 ### SystemServer 進程是如何啟動的? SystemServer進程是Zygote孵化出的第一個進程,然后再配置SystemServer進程的環境。 ### 1.啟動各種系統服務線程 SystemServer進程在Android運行環境中扮演了“神經中樞”的作用,APK應用中能夠直接交互的大部分系統服務都在該進程中運行,常見的有WindowManagerServer(Wms)、ActivityManagerService(Ams)、PackageManagerServer(Pms),這些系統服務都是以一個線程的方式存在于SystemServer進程中。 ### 2.啟動第一個Activity 當以上服務線程都啟動后,其中Ams服務是systemReady()調用完成最后啟動的,在Ams的systemReady()函數的最后一段代碼則發出了啟動任務隊列中最上面一個Activity消息。 在Ams的startHomeActivityLocked()中,系統發出了一個category字段包含CATEGORY_HOME的intent,代碼如下: ~~~ intent.setComponent(mTopComponent); if(mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL){ intent.addCategory(Intent.CATEGORY_HOME); } ~~~ 只要應用聲明自己能夠響應該Intent,那么就可以被認為是Home程序。當系統中有多個程序能夠響應該Intent時,系統會彈出一個對話框,讓用戶選擇啟動哪個程序,也允許用戶記住該選擇。 到此第一個Activity就啟動了。 如有問題請留言,轉載請注明出處。
                  <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>

                              哎呀哎呀视频在线观看