日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

编程问答

android6.0源码分析之Zygote进程分析

發(fā)布時(shí)間:2025/3/15 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android6.0源码分析之Zygote进程分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在android6.0源碼分析之Runtime的初始化一文中,對Zygote進(jìn)程的初期的Runtime初始化過程進(jìn)行了分析,在Runtime啟動(dòng)結(jié)束后,會(huì)對Zygote進(jìn)程進(jìn)行初始化,其它Java進(jìn)程都需要從Zygote進(jìn)程來fork,而Zygote的初始化是從ZygoteInit的main函數(shù)開始的:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//ZygoteInit.java public static void main(String argv[]) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//注冊zygote socketregisterZygoteSocket(socketName);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//加載資源以及類preload();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>// Disable tracing so that forked processes do not inherit stale tracing tags from// Zygote.Trace.setTracingEnabled(false);//啟動(dòng)system server進(jìn)程<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (startSystemServer) {startSystemServer(abiList, socketName);}Log.i(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Accepting command socket connections"</span>);//循環(huán)等待創(chuàng)建進(jìn)程的socket請求runSelectLoop(abiList);//關(guān)閉server socketcloseServerSocket();} catch (MethodAndArgsCaller caller) {//截取MethodAndArgsCaller異常//執(zhí)行新進(jìn)程的main函數(shù)caller.run();} catch (RuntimeException ex) {Log.e(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Zygote died with exception"</span>, ex);closeServerSocket();throw ex;} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li></ul>

首先它會(huì)對啟動(dòng)參數(shù)進(jìn)行解析,得到是否需要啟動(dòng)systemserver,或者得到ABI_LIST_ARG參數(shù)和socketName參數(shù)等,然后則會(huì)調(diào)用registerZygoteSocket來創(chuàng)建一個(gè)LocalServerSocket來與以后需要systemServer創(chuàng)建進(jìn)程時(shí)進(jìn)行通信,接著調(diào)用preload來對VM虛擬機(jī)中的DEX類等資源進(jìn)行加載,然后會(huì)調(diào)用runSelectLoop來進(jìn)行循環(huán)等待,最后會(huì)截取ZygoteInit中拋出的MethodAndArgsCaller異常,并在異常處理時(shí),調(diào)用新建進(jìn)程的main方法實(shí)現(xiàn)新進(jìn)程的啟動(dòng)。下面將對這四個(gè)主要的調(diào)用分別進(jìn)行分析。


1、registerZygoteSocket方法分析

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//ZygoteInit.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">registerZygoteSocket</span>(String socketName) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (sServerSocket == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//判斷Zygote socket是否已創(chuàng)建</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> fileDesc;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> String fullSocketName = ANDROID_SOCKET_PREFIX + socketName;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {String env = System.getenv(fullSocketName);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取文件描述符</span>fileDesc = Integer.parseInt(env);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (RuntimeException ex) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> RuntimeException(fullSocketName + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" unset or invalid"</span>, ex);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {FileDescriptor fd = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileDescriptor();fd.setInt$(fileDesc);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//創(chuàng)建Zygote socket,它會(huì)在runSelectLoop中進(jìn)行循環(huán)等待</span>sServerSocket = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> LocalServerSocket(fd);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (IOException ex) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> RuntimeException(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Error binding to local socket '"</span> + fileDesc + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"'"</span>, ex);}} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul>

由代碼可知,它創(chuàng)建了一個(gè)LocalServerSocket,并且它會(huì)在runSelectLoop中阻塞等待socket請求,至于runSelectLoop稍后會(huì)進(jìn)行分析。


2、preload方法分析

<code class="hljs scss has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//ZygoteInit.java</span> <span class="hljs-value" style="box-sizing: border-box;">static</span> void <span class="hljs-function" style="box-sizing: border-box;">preload()</span> {Log<span class="hljs-class" style="box-sizing: border-box;">.d</span>(TAG, "begin preload");<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加載類</span><span class="hljs-function" style="box-sizing: border-box;">preloadClasses()</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加載資源</span><span class="hljs-function" style="box-sizing: border-box;">preloadResources()</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加載OpenGL</span><span class="hljs-function" style="box-sizing: border-box;">preloadOpenGL()</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加載公共庫</span><span class="hljs-function" style="box-sizing: border-box;">preloadSharedLibraries()</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加載文本資源</span><span class="hljs-function" style="box-sizing: border-box;">preloadTextResources()</span>;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Ask the WebViewFactory to do any initialization that must run in the zygote process,</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// for memory sharing purposes.</span>WebViewFactory<span class="hljs-class" style="box-sizing: border-box;">.prepareWebViewInZygote</span>();Log<span class="hljs-class" style="box-sizing: border-box;">.d</span>(TAG, "end preload"); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul>

由代碼可知,preload方法主要就是進(jìn)行類,資源,公共庫以及相關(guān)的文本資源的加載,主要分析其中的preloadClasses以及preloadSharedLibraries方法:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//ZygoteInit.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">preloadClasses</span>() {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取虛擬機(jī)運(yùn)行時(shí)</span>final VMRuntime runtime = VMRuntime.getRuntime();InputStream <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化文件輸入流,路徑為"/system/etc/preloaded-classes"</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span> = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileInputStream(PRELOADED_CLASSES);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (FileNotFoundException e) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;}...<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Alter the target heap utilization. With explicit GCs this</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// is not likely to have any effect.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> defaultUtilization = runtime.getTargetHeapUtilization();runtime.setTargetHeapUtilization(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.8</span>f);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//通過BufferReader來讀取輸入流</span>BufferedReader br = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> BufferedReader(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> InputStreamReader(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span>), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">256</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> count = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;String line;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//逐行處理</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ((line = br.readLine()) != <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Skip comments and blank lines.</span>line = line.trim();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (line.startsWith(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"#"</span>) || line.equals(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""</span>)) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">continue</span>;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {...<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//加載并顯示地初始化給定的類</span>Class.forName(line, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>);count++;} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (ClassNotFoundException e) {...}}} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (IOException e) {Log.e(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Error reading "</span> + PRELOADED_CLASSES + <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"."</span>, e);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">finally</span> {IoUtils.closeQuietly(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">is</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Restore default.</span>runtime.setTargetHeapUtilization(defaultUtilization);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//將類,域,方法等填充到dex緩存中</span>runtime.preloadDexCaches();} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li></ul>

首先,根據(jù)”/system/etc/preloaded-classes”來,逐行解析里面的類,最后再將預(yù)加載的類填充到VM的dex緩存中,它會(huì)調(diào)用VMRuntime庫的本地方法preloadDexCaches來填充,此方法的具體實(shí)現(xiàn)在VM庫中。?
接下來看preloadSharedLibraries方法:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//ZygoteInit.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">preloadSharedLibraries</span>() {Log.i(TAG, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Preloading shared libraries..."</span>);System.loadLibrary(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"android"</span>);System.loadLibrary(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"compiler_rt"</span>);System.loadLibrary(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"jnigraphics"</span>); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

如代碼,它主要進(jìn)行shared庫Android,compiler_rt以及jnigraphics的加載。


3、 startSystemServer方法分析

System Server進(jìn)程是android系統(tǒng)的非常重要的進(jìn)程,它在Zygote的啟動(dòng)之后就必須啟動(dòng),所以startSystemServer方法也是Zygote初始化中非常重要的調(diào)用:

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//ZygoteInit.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> <span class="hljs-title" style="box-sizing: border-box;">startSystemServer</span>(String abiList, String socketName)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throws</span> MethodAndArgsCaller, RuntimeException {...ZygoteConnection.Arguments parsedArgs = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> pid;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {parsedArgs = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ZygoteConnection.Arguments(args);ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//fork一個(gè)systemServer進(jìn)程</span>pid = Zygote.forkSystemServer(parsedArgs.uid, parsedArgs.gid,parsedArgs.gids,parsedArgs.debugFlags,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>,parsedArgs.permittedCapabilities,parsedArgs.effectiveCapabilities);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (IllegalArgumentException ex) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> RuntimeException(ex);}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//處理子進(jìn)程</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (pid == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (hasSecondZygote(abiList)) {waitForSecondaryZygote(socketName);}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//處理system server進(jìn)程</span>handleSystemServerProcess(parsedArgs);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li></ul>

它首先fork一個(gè)systemserver進(jìn)程,然后再對子進(jìn)程systemserver進(jìn)行相關(guān)處理,首先來看forkSystemServer方法:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//Zygote.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> <span class="hljs-title" style="box-sizing: border-box;">forkSystemServer</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> uid, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> gid, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>[] gids, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> debugFlags,<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>[][] rlimits, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">long</span> permittedCapabilities, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">long</span> effectiveCapabilities) {VM_HOOKS.preFork();<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//調(diào)用native方法</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> pid = nativeForkSystemServer(uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Enable tracing as soon as we enter the system_server.</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (pid == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {Trace.setTracingEnabled(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>);}VM_HOOKS.postForkCommon();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> pid; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

這里將通過JNI調(diào)用,進(jìn)入Native代碼層,接著分析nativeForkSystemServer方法,它對應(yīng)的是Native方法是com_android_internal_os_Zygote_nativeForkSystemServer:

<code class="hljs objectivec has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//com_android_internal_os_Zygote.cpp</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> jint com_android_internal_os_Zygote_nativeForkSystemServer(JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,jint debug_flags, jobjectArray rlimits, jlongpermittedCapabilities,jlong effectiveCapabilities) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//fork 相應(yīng)進(jìn)程</span>pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,debug_flags, rlimits,permittedCapabilities, effectiveCapabilities,MOUNT_EXTERNAL_DEFAULT, <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>, <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>, <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">true</span>, <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>,<span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>, <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (pid > <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {gSystemServerPid = pid;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> status;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (waitpid(pid, &status, WNOHANG) == pid) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//system server進(jìn)程died,終止運(yùn)行時(shí),重啟zygote進(jìn)程</span>RuntimeAbort(env);}}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> pid; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>

它調(diào)用了ForkAndSpecializeCommon方法來進(jìn)行進(jìn)程的創(chuàng)建,最后對創(chuàng)建結(jié)果進(jìn)行了相應(yīng)的處理,這里與創(chuàng)建普通進(jìn)程的區(qū)別就是,需要對子進(jìn)程進(jìn)行檢查,判斷system server進(jìn)程是否died,如果died,則會(huì)終止runtime,并重啟Zygote進(jìn)程,接著分析ForkAndSpecializeCommon方法:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//com_android_internal_os_Zygote.cpp static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,jint debug_flags, jobjectArray javaRlimits,jlong permittedCapabilities, jlong effectiveCapabilities,jint mount_external,jstring java_se_info, jstring java_se_name,bool is_system_server, jintArray fdsToClose,jstring instructionSet, jstring dataDir) {SetSigChldHandler();//fork一個(gè)進(jìn)程pid_t pid = fork();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (pid == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {//處理子進(jìn)程// The child process.gMallocLeakZygoteChild = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>SetGids(env, javaGids);SetRLimits(env, javaRlimits);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>rc = selinux_android_setcontext(uid, is_system_server, se_info_c_str, se_name_c_str);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (se_info_c_str != <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span>) {//設(shè)置線程名稱SetThreadName(se_name_c_str);}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//此處會(huì)post一個(gè)forkChild的消息env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, debug_flags,is_system_server ? <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">NULL</span> : instructionSet);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (pid > <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {// the parent process}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> pid; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li></ul>

它首先fork一個(gè)子進(jìn)程,然后對子進(jìn)程進(jìn)行處理,最后會(huì)post一個(gè)forkChild的消息出去,而在ZygoteInit中會(huì)對forksystemserver的子進(jìn)程進(jìn)行處理,所以,接著看handleSystemServerProcess方法:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//ZygoteInit<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.java</span> private static void handleSystemServerProcess(ZygoteConnection<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Arguments</span> parsedArgs)throws ZygoteInit<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.MethodAndArgsCaller</span> {...if (parsedArgs<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.invokeWith</span> != null) {String[] args = parsedArgs<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.remainingArgs</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>if (systemServerClasspath != null) {String[] amendedArgs = new String[args<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.length</span> + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>]<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>amendedArgs[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>] = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"-cp"</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>amendedArgs[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] = systemServerClasspath<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>System<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.arraycopy</span>(parsedArgs<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.remainingArgs</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, amendedArgs, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>,parsedArgs<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.remainingArgs</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.length</span>)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>}WrapperInit<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.execApplication</span>(parsedArgs<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.invokeWith</span>,parsedArgs<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.niceName</span>,parsedArgs<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.targetSdkVersion</span>,VMRuntime<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getCurrentInstructionSet</span>(), null, args)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>} else {ClassLoader cl = null<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>if (systemServerClasspath != null) {//獲取類加載器cl = new PathClassLoader(systemServerClasspath, ClassLoader<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getSystemClassLoader</span>())<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>Thread<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.currentThread</span>()<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setContextClassLoader</span>(cl)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>}//根據(jù)參數(shù)來啟動(dòng)System server進(jìn)程RuntimeInit<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.zygoteInit</span>(parsedArgs<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.targetSdkVersion</span>, parsedArgs<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.remainingArgs</span>, cl)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li></ul>

由代碼可知,它主要會(huì)調(diào)用RuntimeInit類的zygoteInit方法來對子進(jìn)程system server進(jìn)行啟動(dòng)的處理:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//RuntimeInit.java public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)throws ZygoteInit.MethodAndArgsCaller {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>commonInit();nativeZygoteInit();applicationInit(targetSdkVersion, argv, classLoader); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

其中commonInit主要就是進(jìn)行一些系統(tǒng)屬性的初始化或者重置,這里重點(diǎn)分析nativeZygoteInit和applicationInit方法。


3.1 nativeZygoteInit方法分析

nativeZygoteInit是Native方法,通過JNI調(diào)用,它的實(shí)現(xiàn)是com_android_internal_os_RuntimeInit_nativeZygoteInit方法:

<code class="hljs scss has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//AndroidRuntime.cpp</span> <span class="hljs-value" style="box-sizing: border-box;">static</span> void <span class="hljs-function" style="box-sizing: border-box;">com_android_internal_os_RuntimeInit_nativeZygoteInit(JNIEnv* env, jobject clazz)</span> {gCurRuntime-><span class="hljs-function" style="box-sizing: border-box;">onZygoteInit()</span>; }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

由代碼可知,這里會(huì)回調(diào)App_main.cpp中的onZygoteInit方法:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//App_main.cpp</span> virtual <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">void</span> onZygoteInit(){sp<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;"><</span>ProcessState<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">></span> proc <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> ProcessState<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;">::self</span>();ALOGV(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"App process: starting thread pool.\n"</span>);proc<span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">-></span>startThreadPool(); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

這里主要就是在進(jìn)程里面啟動(dòng)線程池,該線程池,是為System server進(jìn)程創(chuàng)建的,此線程池會(huì)為Binder提供支持等,這里不做分析。


3.2 ApplicationInit方法分析

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//RuntimeInit.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">applicationInit</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> targetSdkVersion, String[] argv, ClassLoader classLoader)<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throws</span> ZygoteInit.MethodAndArgsCaller {nativeSetExitWithoutCleanup(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>);VMRuntime.getRuntime().setTargetHeapUtilization(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.75</span>f);VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> Arguments args;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {args = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Arguments(argv);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (IllegalArgumentException ex) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span>;}<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//invoke system server的main方法</span>invokeStaticMain(args.startClass, args.startArgs, classLoader); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul>

由代碼可知,它會(huì)根據(jù)啟動(dòng)的參數(shù)以及類加載器來調(diào)用InvokeStaticMain方法:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//RuntimeInit.java private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)throws ZygoteInit.MethodAndArgsCaller {Class<?> cl;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {cl = Class.forName(className, true, classLoader);} catch (ClassNotFoundException ex) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>}Method m;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {//獲取systemserver的main方法,main方法是用來開始systemserver進(jìn)程的m = cl.getMethod(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"main"</span>, new Class[] { String[].class });} catch (NoSuchMethodException ex) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>//拋出MethodAndArgsCaller異常,而此異常在ZygoteInit的main方法中會(huì)進(jìn)行撲捉,異常的處理稍后再分析throw new ZygoteInit.MethodAndArgsCaller(m, argv); }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul>

由代碼可知,首先,通過Java的反射機(jī)制,借助傳入的參數(shù)以及類加載器,從而獲取systemserver進(jìn)程的main方法,最后再拋出一個(gè)MethodAndArgsCaller的異常,而此異常在ZygoteInit的main方法的最后會(huì)進(jìn)行截取,具體的異常處理稍后在第四節(jié)最后再分析,因?yàn)槠胀ㄟM(jìn)程的創(chuàng)建也是通過拋出MethodAndArgsCaller的方法來啟動(dòng)的,至此startsystemserver方法就分析結(jié)束了。


4、runSelectLoop方法分析

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//ZygoteInit.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">runSelectLoop</span>(String abiList) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throws</span> MethodAndArgsCaller {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//初始化文件描述符組合ZygoteConnection連接組</span>ArrayList<FileDescriptor> fds = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ArrayList<FileDescriptor>();ArrayList<ZygoteConnection> peers = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ArrayList<ZygoteConnection>();fds.add(sServerSocket.getFileDescriptor());peers.add(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//循環(huán)等待ZygoteSocket請求并進(jìn)行相應(yīng)的處理</span>...<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> i = pollFds.length - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>; i >= <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; --i) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> ((pollFds[i].revents & POLLIN) == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">continue</span>;}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (i == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//這里阻塞等待創(chuàng)建進(jìn)程的Zygote socket請求</span>ZygoteConnection newPeer = acceptCommandPeer(abiList);peers.add(newPeer);fds.add(newPeer.getFileDesciptor());} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//執(zhí)行ZygoteConnection連接</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">boolean</span> done = peers.get(i).runOnce();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (done) {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//處理結(jié)束,則將此連接移除</span>peers.remove(i);fds.remove(i);}}}} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li></ul>

此方法將會(huì)永無休止的進(jìn)行執(zhí)行,因?yàn)閆ygote作為Java域的第一個(gè)進(jìn)程,所有的進(jìn)程都是由它進(jìn)行fork的,在android的生命過程中,會(huì)不斷有ZygoteConnection請求,所以,看runSelectLoop方法,它首先是調(diào)用acceptCommandPeer方法來獲取一個(gè)ZygoteConnection連接,然后再調(diào)用ZygoteConnection的runOnce方法來執(zhí)行連接處理,首先來看acceptCommandPeer方法:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//ZygoteInit.java</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> ZygoteConnection <span class="hljs-title" style="box-sizing: border-box;">acceptCommandPeer</span>(String abiList) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//創(chuàng)建ZygoteConnection連接,注意socket的accept阻塞接收請求</span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ZygoteConnection(sServerSocket.accept(), abiList);} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (IOException ex) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> RuntimeException(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"IOException during accept()"</span>, ex);} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

由代么可知,這里是阻塞的,只有在ZygoteInit的main方法中最初注冊的socket有請求時(shí),才會(huì)執(zhí)行,并會(huì)根據(jù)得到的socket連接來創(chuàng)建一個(gè)ZygoteConnection,所以,來看它的構(gòu)造函數(shù):

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// ZygoteConnection.java</span> ZygoteConnection(LocalSocket socket, <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">String</span> abiList) throws IOException {mSocket = socket;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.abiList = abiList;<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取socket輸出流</span>mSocketOutStream = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> DataOutputStream(socket.getOutputStream());<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//獲取socket輸入流</span>mSocketReader = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> BufferedReader(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> InputStreamReader(socket.getInputStream()), <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">256</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//設(shè)置超時(shí)</span>mSocket.setSoTimeout(CONNECTION_TIMEOUT_MILLIS);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {peer = mSocket.getPeerCredentials();} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (IOException ex) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> ex;} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>

此構(gòu)造函數(shù)會(huì)創(chuàng)建socket的stream通道,至此ZygoteConnection就創(chuàng)建好了,接著看它的runOnce方法,socket請求一次,runOnce會(huì)執(zhí)行一次:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">boolean runOnce() throws ZygoteInit.MethodAndArgsCaller {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>int pid = -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;FileDescriptor childPipeFd = null;FileDescriptor serverPipeFd = null;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {parsedArgs = new Arguments(args);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (parsedArgs.abiListQuery) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> handleAbiListQuery();}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>int [] fdsToClose = { -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>, -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> };FileDescriptor fd = mSocket.getFileDescriptor();<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>fd = ZygoteInit.getServerSocketFileDescriptor();//fork 進(jìn)程pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,parsedArgs.niceName, fdsToClose, parsedArgs.instructionSet,parsedArgs.appDataDir);} catch (ErrnoException ex) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>}<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (pid == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {// <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> childIoUtils.closeQuietly(serverPipeFd);serverPipeFd = null;//對子進(jìn)程做相應(yīng)處理handleChildProc(parsedArgs, descriptors, childPipeFd, newStderr);<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> true;} <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {IoUtils.closeQuietly(childPipeFd);childPipeFd = null;//對父進(jìn)程做相應(yīng)處理<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> handleParentProc(pid, descriptors, serverPipeFd, parsedArgs);}} finally {IoUtils.closeQuietly(childPipeFd);IoUtils.closeQuietly(serverPipeFd);} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li></ul>

這里,就是創(chuàng)建普通進(jìn)程的通道,它的分析類似于startSystemServer方法,它在最后同樣會(huì)進(jìn)入Java層的子進(jìn)程的處理handleChildProc方法,最后還是會(huì)獲取到創(chuàng)建進(jìn)程的main方法,并且同樣也是會(huì)拋出一個(gè)MethodAndArgsCaller的異常。?
不管是創(chuàng)建systemServer進(jìn)程還是創(chuàng)建普通進(jìn)程,在處理其子進(jìn)程時(shí),都會(huì)獲取創(chuàng)建子進(jìn)程的main方法,同時(shí)最后會(huì)拋出一個(gè)MethodAndArgsCaller異常,為什么要拋出異常呢,此異常是在ZygoteInit的main函數(shù)中調(diào)用的,而main函數(shù)位于堆棧的最頂層,如果不采用拋異常的方式,而是在invokestaticMain方法中直接執(zhí)行新建進(jìn)程的main方法,則會(huì)浪費(fèi)之前函數(shù)調(diào)用說占用的調(diào)用堆棧。接下來對MethodAndArgsCaller的run方法進(jìn)行分析:

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">//ZygoteInit.java public void run() {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {mMethod.invoke(null, new Object[] { mArgs });} catch (IllegalAccessException ex) {<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>

其中,mMethod為構(gòu)造MethodAndArgsCaller時(shí),傳入的方法,即之前startSystemServer或者runSelectLoop函數(shù)中獲得的新建進(jìn)程的main方法,所以run方法的主要作用就是執(zhí)行此main方法,即進(jìn)入新建進(jìn)程。至此,Zygote進(jìn)程分析結(jié)束,它的主要功能有初始化Runtime、fork system server進(jìn)程以及通過循環(huán)等待Zygote socket的請求,來處理普通進(jìn)行的創(chuàng)建。下面將給出時(shí)序圖:?

原文地址:http://blog.csdn.net/yangzhihuiguming/article/details/51774080

總結(jié)

以上是生活随笔為你收集整理的android6.0源码分析之Zygote进程分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

久久视频6 | av在线一级 | 国产精品毛片久久久久久 | 天天操天天射天天添 | 成人在线播放网站 | 激情动态| 久久网址 | 国产视频精选在线 | 欧洲激情在线 | 欧美精品乱码久久久久 | 黄色av网站在线观看免费 | 亚洲黄色片在线 | 国产精品一区二区三区在线看 | 天天操夜操视频 | 成人免费视频网站在线观看 | 久久久受www免费人成 | 亚洲欧美视频在线观看 | 色无五月| 99色精品视频 | 免费看片日韩 | 精品一二三四五区 | 四虎在线观看精品视频 | 免费黄色在线播放 | 人人狠狠综合久久亚洲婷 | 国产999精品 | 九九九九精品 | 精品国产1区2区 | 日韩特黄av | 天天天色 | 亚洲视频观看 | 久久久久久久久久久精 | 精品美女在线观看 | 国产精品久久久视频 | 国产精品理论片在线观看 | 69久久夜色精品国产69 | 精品日韩视频 | 8x成人免费视频 | 三级视频日韩 | 国产精品一区欧美 | 久久久麻豆精品一区二区 | 欧美天堂视频在线 | 九热在线 | 麻豆免费在线视频 | 国产精品国产三级国产 | 亚洲老妇xxxxxx | 国产精品久久久久久久久久久杏吧 | 91.dizhi永久地址最新 | 99热超碰在线 | 欧美夫妻性生活电影 | 欧美精品一区二区免费 | 婷婷在线资源 | 波多野结衣在线播放一区 | 亚洲国产美女久久久久 | 久久精品99国产 | 激情欧美xxxx | 91色蜜桃 | 婷婷中文字幕 | 网站在线观看日韩 | 亚洲一级理论片 | 久草a视频 | 国产精品久久久久久久av电影 | 狠狠操狠狠干2017 | 国产精品 国内视频 | 精品国产区在线 | 91久久黄色| 午夜av影院 | 九九精品在线观看 | 一区二区成人国产精品 | 欧美在线视频一区二区三区 | 日韩精品一区二区三区水蜜桃 | 99热在线这里只有精品 | 中文字幕4 | 夜夜天天干 | 97国产超碰在线 | 波多野结衣动态图 | 欧美精品亚州精品 | 日韩精品视频在线观看网址 | 免费亚洲电影 | 婷婷激情站| 免费69视频| 欧美一级xxxx | 伊人天堂av | 免费看片亚洲 | 成人国产精品免费观看 | 久爱综合 | 97天天干 | 久章操| 日日夜夜免费精品视频 | 81精品国产乱码久久久久久 | 日本三级不卡视频 | 丝袜av网站| 欧美久久久久久 | 奇米网777| 国产一级视频在线免费观看 | 亚洲不卡在线 | 人人干人人搞 | 欧美俄罗斯性视频 | 热久久影视| 四虎在线观看精品视频 | 久久伊人操 | 久久综合网色—综合色88 | 国产一级黄色电影 | 黄色免费网站 | 丁香视频全集免费观看 | 午夜影院一区 | 九九热免费在线观看 | 91精品国产一区二区三区 | 99精品国自产在线 | 精品亚洲男同gayvideo网站 | 天天操天天操天天操 | 黄色亚洲 | 免费欧美精品 | 97国产视频 | 久久成人高清视频 | 日韩3区| 亚洲黄色在线免费观看 | 最新av中文字幕 | 美女网站在线观看 | av在线免费网 | 在线观看一区二区视频 | 久久精品高清 | 99re6热在线精品视频 | 亚洲一区免费在线 | 久久黄色影院 | 国产高潮久久 | 日韩在线视频二区 | 精品网站999www | 日韩在线国产 | 日韩福利在线观看 | 亚洲成人家庭影院 | 国产精品久久久久久久久搜平片 | 在线国产片 | 美女网站视频久久 | 国产99久久 | 一区二区三区免费网站 | 国产 欧美 在线 | 久久伊人色综合 | 2024国产精品视频 | 久久免费一级片 | av在线影片 | 97福利| 免费一级日韩欧美性大片 | 欧美成人在线免费观看 | 欧美日性视频 | 免费精品人在线二线三线 | 日韩在线观看不卡 | 国产一级在线免费观看 | 国产尤物一区二区三区 | 欧美日韩亚洲在线观看 | 国产精品少妇 | 久久久久久久久免费视频 | 精品亚洲午夜久久久久91 | 久久99国产精品免费 | 成人免费视频视频在线观看 免费 | 西西大胆免费视频 | 久久av高清| 午夜国产福利视频 | 波多野结衣在线观看视频 | 91精品在线观看视频 | 在线免费观看亚洲视频 | www.夜夜干.com | 国产中文字幕三区 | 国产精品久久久久久超碰 | 成人福利在线 | 欧美日韩国产综合一区二区 | 97av在线视频免费播放 | 超碰97国产精品人人cao | 久久成人麻豆午夜电影 | 天堂在线一区二区 | 久久精品欧美视频 | 国内揄拍国内精品 | 黄网站免费久久 | 欧美 亚洲 另类 激情 另类 | 精品麻豆| 亚洲欧美视频在线观看 | 黄色91在线观看 | 国产成人香蕉 | 在线免费观看成人 | 国产一区二区久久久久 | 国产色小视频 | 夜夜操网 | 亚洲综合爱 | 狠狠色丁香婷婷综合 | 69国产精品视频免费观看 | 综合五月 | 麻豆成人小视频 | 在线播放一区二区三区 | 国产黄色片免费看 | 亚洲精品理论 | 亚洲第一区在线播放 | 三级性生活视频 | 草莓视频在线观看免费观看 | 黄色成人免费电影 | 久久伊人热 | 天天插天天操天天干 | 色99在线 | 在线观看国产区 | 96精品视频 | 99re国产视频 | 在线精品观看 | 五月天,com | 精品一区二区免费视频 | av一本久道久久波多野结衣 | 国产第一页在线播放 | 日韩免费不卡视频 | 亚洲激情久久 | 五月香婷 | 99热在| 97视频在线观看成人 | 免费a级观看 | 精品少妇一区二区三区在线 | 爱爱av网站 | 中文字幕观看在线 | 国产成人精品一区一区一区 | 国产一区视频免费在线观看 | 日韩在线影视 | 精品亚洲免费 | 色狠狠久久av五月综合 | 免费精品国产va自在自线 | 久久久久婷 | 国产精品mm| www.久久久.cum | 成人av中文字幕在线观看 | a黄色| 久草在线最新视频 | 国产一二区免费视频 | 国产午夜不卡 | 69绿帽绿奴3pvideos | av免费黄色 | 国产精品国产三级国产aⅴ无密码 | 日韩中文字幕网站 | 久久99热久久99精品 | 一区二区三区在线不卡 | 狠狠狠综合 | 欧美日韩网站 | 在线一二区| 欧美做受69 | 国产一区二区不卡在线 | 久久精品一区二区三 | 久久综合婷婷综合 | 精品国产一区二区三区不卡 | 99av国产精品欲麻豆 | 在线免费视频a | 国产一级免费片 | 久久免费视频在线 | 五月婷婷深开心 | 国产视频在线观看免费 | 黄色成人影院 | 色福利网 | 91视频链接 | 亚洲综合视频在线播放 | 国产精品一区二区三区电影 | 最近中文字幕 | 日韩欧美久久 | 国产亚洲精品美女久久 | 成人黄色av网站 | 日韩精品欧美专区 | 天天色天天射天天操 | 在线电影av| 91丨九色丨高潮丰满 | 黄色三级久久 | 久久人人爽人人人人片 | 中文一区二区三区在线观看 | 97视频在线免费 | 最近2019好看的中文字幕免费 | 精品久久久久久久久久 | 超碰.com| 国产精美视频 | 日日夜操 | 亚洲涩涩色 | 日韩高清免费无专码区 | 精品亚洲成a人在线观看 | 免费成人在线视频网站 | 亚洲成年人免费网站 | 99久久99久久 | 欧美激情片在线观看 | 九九热视频在线免费观看 | www黄色 | 亚洲日本va午夜在线电影 | 亚洲最新av网址 | 丁香六月色 | 久草免费在线观看 | 日韩av一区二区在线播放 | 精品成人网 | 欧美国产在线看 | 天天操天天草 | 久久综合五月天婷婷伊人 | 色综合网在线 | 在线观看视频三级 | 91在线视频免费91 | 香蕉视频18 | 国产精品18久久久久vr手机版特色 | 国产又粗又猛又黄又爽 | 色av男人的天堂免费在线 | 久久影视中文字幕 | 最新色视频 | 91在线视频在线 | 中文字幕在线播放日韩 | 婷婷激情欧美 | 日本系列中文字幕 | 日本少妇高清做爰视频 | 狠色在线 | 日韩视频一区二区在线观看 | 国产精品av免费观看 | 久久国产精品99久久久久 | 久久99精品久久久久久秒播蜜臀 | 久操伊人| 色婷婷久久久综合中文字幕 | 日韩av专区 | 久久av中文字幕片 | 热久久影视| 国产精品网红福利 | 国产精品无av码在线观看 | 国产人成看黄久久久久久久久 | 91在线观看视频 | 久久免费国产视频 | 国产一级特黄毛片在线毛片 | 精品一区精品二区高清 | 四虎永久视频 | 国产在线超碰 | 国产精品久久久久9999 | 麻豆视频免费观看 | 精品色综合 | 欧美精品久久 | 美女在线黄| 天天天天天天天天操 | 精品国产一区二区三区四 | 日韩在线 | 在线观看自拍 | 欧美了一区在线观看 | 久草在在线 | 天堂中文在线视频 | 欧美一级日韩三级 | 免费三及片| 97高清免费视频 | 美女网站在线观看 | 国产91综合一区在线观看 | 欧美成人精品三级在线观看播放 | 国产精品9999久久久久仙踪林 | www夜夜操com | www.av中文字幕.com | 亚洲理论在线观看电影 | 日韩国产欧美在线播放 | 久久久午夜电影 | 亚洲成av人片在线观看 | 香蕉视频国产在线 | 中文字幕 欧美性 | 国产视频亚洲精品 | 国产99在线免费 | 国产激情免费 | 午夜一级免费电影 | 国产成人99av超碰超爽 | www.888.av | 欧美日韩一区二区三区在线观看视频 | 国产视频每日更新 | av超碰免费在线 | 麻豆av一区二区三区在线观看 | bbw av| av成人免费在线看 | 久久久久久久久久久久久9999 | 国产精品嫩草影院99网站 | 中文电影网| 日韩丝袜在线观看 | 日韩羞羞| 欧美日韩裸体免费视频 | 2023亚洲精品国偷拍自产在线 | 激情av资源 | 日本三级全黄少妇三2023 | 久草剧场| 亚洲成人家庭影院 | 天天艹天天 | 丁香九月婷婷综合 | 日本精品视频网站 | 国产精品一区二区 91 | 免费黄色在线网站 | 国产精品 国产精品 | 91插插插网站| 手机成人在线 | 日韩成人xxxx | 九九热在线观看 | 91麻豆精品国产自产在线 | www.久久视频 | 色视频网站免费观看 | 色视频在线免费观看 | 国产又粗又猛又黄又爽 | 久久久久久免费毛片精品 | 国产在线精品视频 | 国产一级片不卡 | 国产一级视频在线 | 国产对白av| 亚洲精品色视频 | 91亚洲狠狠婷婷综合久久久 | 97视频在线观看视频免费视频 | 国产精品theporn | 超碰人人在线 | 免费看的av片 | 激情综合一区 | 国产精品毛片一区二区在线看 | 黄色一区二区在线观看 | 亚洲伦理电影在线 | 中文字幕av免费 | 亚洲精品999 | h动漫中文字幕 | 高清不卡一区二区三区 | 97香蕉久久国产在线观看 | 色在线免费 | 久久99久久99精品 | 国产精品成人国产乱一区 | 精品无人国产偷自产在线 | 色综合久久综合 | 超碰97人人干 | 91福利视频免费观看 | 久久成人亚洲欧美电影 | 色噜噜色噜噜 | 国产一区久久久 | 五月开心色 | 中文字幕在线观看不卡 | 久久成年人网站 | 特级黄色片免费看 | 日本三级香港三级人妇99 | 欧美日韩在线电影 | 青青久视频 | 免费观看www7722午夜电影 | 国产在线观看你懂的 | 国产精品福利无圣光在线一区 | 亚洲免费视频在线观看 | 久久亚洲福利 | 91精品国产成人 | 精品久久一 | 亚洲综合情 | 精品国产乱码久久久久久1区二区 | 五月婷婷电影网 | 超碰97中文 | 超黄视频网站 | 日韩二区三区 | 日韩欧美网址 | 国产精品精品国产 | 天堂av在线中文在线 | 久久久久国产一区二区三区 | 久久久久久久久久影视 | 91在线九色 | 欧美精品免费在线 | 天天干,天天射,天天操,天天摸 | 久章草在线观看 | 欧美精品一区二区性色 | 国产拍揄自揄精品视频麻豆 | 国产成人一区二区三区免费看 | 一二区av| 日韩色综合网 | 免费91在线 | 久久视频一区 | 久久精品99国产精品酒店日本 | 婷婷色在线 | 免费观看特级毛片 | 91毛片在线观看 | 日韩电影在线观看一区二区 | 国产精品毛片一区二区在线 | 狂野欧美激情性xxxx | 成人午夜电影在线 | 欧美9999| 国产一级片免费播放 | 久久成人综合 | 91爱爱网址 | 日韩精品久久久久久中文字幕8 | 亚洲天天干 | 啪啪免费试看 | 亚洲国产成人高清精品 | 免费在线观看日韩欧美 | 国产96av | 麻豆影视网站 | 天天操天天操天天操天天操天天操 | 亚洲视频资源在线 | 国产精品女视频 | 91九色在线| 久久成人视屏 | 丁香花在线视频观看免费 | 99久久9 | 一二三精品视频 | 2024av在线播放 | 五月开心六月伊人色婷婷 | 婷婷日 | 中文字幕乱码亚洲精品一区 | 免费久久99精品国产婷婷六月 | 6080yy精品一区二区三区 | 国产精品6999成人免费视频 | 中文字幕在线不卡国产视频 | 国产精品久久久久久久久久了 | av网站地址 | 欧美少妇xxx | 日韩有码在线播放 | 色91在线视频 | 99精品视频一区二区 | 日日天天 | 欧美激情精品久久久久久免费印度 | 婷婷在线五月 | 久久五月精品 | 久久 国产一区 | 午夜骚影 | 亚洲精品网站在线 | www.大网伊人| 天天干夜夜干 | 精品国产乱码久久久久久天美 | 国产精品久久久久久久免费 | 天天舔天天射天天操 | 99久久er热在这里只有精品66 | 日韩视频在线观看视频 | 婷婷五天天在线视频 | 2019精品手机国产品在线 | 国产黄色片一级三级 | 久热精品国产 | 日本韩国精品一区二区在线观看 | 又黄又爽又刺激视频 | 日韩欧美视频 | 天天草天天| 在线观看成人福利 | 在线观看一区 | 精品久久一区 | 在线免费观看黄色 | 国产精品久久久av久久久 | 一区二区丝袜 | 在线免费观看黄色小说 | 久久久精品亚洲 | 一区二区三区动漫 | 男女激情网址 | 国产精品第三页 | 亚洲精品777| 日韩中文字幕在线 | 婷婷在线色 | 精品超碰 | 亚洲日本精品视频 | 99精品一区二区 | 狠狠操精品 | 在线黄色免费av | 国产午夜精品免费一区二区三区视频 | 中文字幕在线观看第三页 | 亚洲情婷婷| 国产韩国日本高清视频 | 国产精品久久电影网 | 天天玩天天干天天操 | 91久色蝌蚪| 日日干干夜夜 | 麻豆精品视频在线 | 欧美另类z0zx | 日韩欧美视频二区 | 91久久国产露脸精品国产闺蜜 | 国产精品久久99综合免费观看尤物 | 黄色亚洲片 | 国产精品免费在线播放 | 亚洲视频 在线观看 | 久久久久久国产精品999 | 国产精品一区二区免费看 | 亚洲成成品网站 | 国产福利av | 久久在线免费视频 | 五月天视频网站 | 成人影音av| 亚洲成人999| 久热色超碰 | 日日摸日日添夜夜爽97 | 亚洲精品免费看 | 日韩欧美亚洲 | 国产麻豆电影在线观看 | 99re国产视频 | aaa免费毛片 | 亚洲午夜剧场 | 亚洲综合激情 | 精品久久久久一区二区国产 | 国产高清中文字幕 | 亚洲精品国产电影 | 免费观看久久 | 国产 中文 日韩 欧美 | 永久免费视频国产 | 91精品第一页 | 国产成人精品av在线 | 国产成人福利在线观看 | 婷婷香蕉 | 精品久久久久久久久中文字幕 | 日韩视频在线观看免费 | 超碰人人做 | 婷婷av资源 | 精品久久网 | 五月天婷婷丁香花 | 亚洲精品456在线播放 | 成人精品福利 | 久久精品久久精品久久39 | 亚洲精品91天天久久人人 | 99久久精品免费看国产免费软件 | 久久久91精品国产一区二区精品 | 色综合激情久久 | 91久久爱热色涩涩 | 91综合色 | 国产偷v国产偷∨精品视频 在线草 | 国产精品涩涩屋www在线观看 | 色网站在线免费 | 在线涩涩| 久久免费视频1 | 成人一级影视 | 日韩av不卡在线观看 | 亚洲午夜av电影 | 亚洲精品久久久久www | 亚洲欧美在线综合 | 九九久久影院 | 国产精品一区免费在线观看 | 日韩大片在线 | 天天天插 | 亚洲网站在线看 | 亚洲国产精品久久久久久 | 97电影手机| 久久精品网站视频 | 成人黄色视| 欧美做受xxx| 国产色拍| 久久只精品99品免费久23小说 | 黄色a在线| 国产精品成人在线 | 免费一级特黄录像 | 96国产在线| 99热99| 99久久国产免费,99久久国产免费大片 | www亚洲精品 | 激情欧美日韩一区二区 | www.99久久.com| 在线v片免费观看视频 | 亚洲夜夜网 | 亚洲精品电影在线 | 一区二区毛片 | 成年人黄色免费看 | 激情五月婷婷综合网 | av电影在线免费观看 | 日本在线观看中文字幕 | 五月天亚洲激情 | 日韩网页| 69av网| 国产精品第一视频 | 正在播放五月婷婷狠狠干 | 婷婷综合网 | www.色婷婷.com| 中文在线免费视频 | 最近中文字幕高清字幕在线视频 | 伊人天天色 | 99久久久久久久 | 国产精品久免费的黄网站 | 特级免费毛片 | 色国产精品 | 日本久久影视 | 国产精品igao视频网入口 | 91av电影在线 | 91精品久久香蕉国产线看观看 | 欧美国产精品一区二区 | 在线免费观看欧美日韩 | 日韩理论电影在线 | 91视频网址入口 | 欧美另类sm图片 | 精品免费视频 | 欧美国产三区 | 天堂av在线7 | 国产v亚洲v | 99精品国产成人一区二区 | 中文字幕成人在线 | 天天做日日爱夜夜爽 | 国产成人av网址 | 96看片| 精品国产乱码久久久久久三级人 | 免费高清在线观看成人 | www.天天草 | 88av网站| 色综合天 | 日韩高清精品免费观看 | 97在线观看免费高清完整版在线观看 | 青草视频免费观看 | 日韩精品视频在线免费观看 | 黄色成人91 | 欧美一区在线看 | 久久久综合 | 视频一区视频二区在线观看 | 国产一级三级 | 亚洲免费在线视频 | 91成人在线看 | 国产亚洲精品电影 | 激情伊人五月天 | 日韩av高清在线观看 | 青青草国产精品视频 | 国产二区av | 久久久久中文 | 国产成人一区三区 | 91视频网址入口 | 久久久久福利视频 | 久久久久久免费网 | 97成人免费视频 | 99视频偷窥在线精品国自产拍 | 啪啪精品 | 美女网站黄在线观看 | 三级视频片 | 欧美在线观看视频一区二区 | 欧美整片sss| 婷婷亚洲五月 | 一区二区三区高清在线观看 | 综合网在线视频 | 精品视频在线看 | 国内精品免费久久影院 | 国产精品美女www爽爽爽视频 | 99精品一区二区三区 | 欧美日韩一区二区三区在线免费观看 | 2019中文字幕第一页 | 久久久久久久久久电影 | 日本激情动作片免费看 | 成人理论电影 | 久草av在线播放 | 久久成人国产 | 成年人免费观看国产 | 色婷五月 | 99久久er热在这里只有精品15 | 91精品在线看 | 久草网免费| 在线观看网站av | 国产xxxx性hd极品 | 亚洲午夜精品久久久久久久久 | 91污在线观看 | 综合网在线视频 | 欧美激情一区不卡 | 久久久精品国产免费观看一区二区 | 亚洲一区不卡视频 | 99色婷婷 | 久久国产一区二区三区 | 久久五月精品 | 91日韩在线专区 | 国产精品中文久久久久久久 | 国产小视频在线观看免费 | 麻花豆传媒mv在线观看 | 日本精品中文字幕在线观看 | 国产精品国产三级国产aⅴ入口 | 免费网站看v片在线a | 99久久超碰中文字幕伊人 | 中文字幕视频在线播放 | 精品一区在线看 | av资源在线看 | 天天激情在线 | 麻豆小视频在线观看 | 国产精品国产三级国产aⅴ入口 | 不卡在线一区 | 爱爱一区 | 西西4444www大胆视频 | 日韩大片在线观看 | 成人av资源网站 | 亚洲人人av | 日本三级久久久 | 一级黄色片在线 | 综合五月婷婷 | 在线不卡视频 | 国产精品不卡在线播放 | 欧美久久成人 | 成人av片在线观看 | 久久成人亚洲欧美电影 | bbbb操bbbb| 亚洲乱码久久久 | 中日韩免费视频 | 五月婷婷开心 | 免费看三片 | 亚洲一区不卡视频 | 91一区二区三区久久久久国产乱 | 在线亚洲欧美日韩 | 成人h在线播放 | 五月激情丁香婷婷 | 国产精品久久久久久久久久ktv | 99视频精品免费观看, | 五月天久久 | 精品视频 | 久久久久久激情 | 波多野结衣理论片 | 人人爽人人爽 | 久久午夜网 | 久久久久影视 | 日韩区视频 | 天天干视频在线 | 国产精品精品国产婷婷这里av | 中文字幕在线视频一区 | 欧美日韩一区二区免费在线观看 | 国产精品久久久久久一二三四五 | 亚洲一二三久久 | 18性欧美xxxⅹ性满足 | 久草在线视频在线观看 | 亚洲 欧洲 国产 精品 | 久久久久久久久久久成人 | 中文字幕免费观看 | 又黄又爽又色无遮挡免费 | 日韩av视屏 | 免费看特级毛片 | 日本xxxx.com| 911久久香蕉国产线看观看 | 天天综合色| 香蕉久草| 精品久久国产一区 | 日韩免费大片 | 狠狠操狠狠干天天操 | 国产成人av福利 | 香蕉蜜桃视频 | 久久大视频 | 亚洲在线色| 日韩精品视频免费看 | 五月婷婷视频 | 中文字幕免费高清在线观看 | 国产精品久久久av | 久久久久北条麻妃免费看 | 国产一区二区视频在线播放 | 99久久婷婷国产综合亚洲 | 国产不卡在线看 | 久久dvd| 中文字幕在线观看视频免费 | 字幕网资源站中文字幕 | 奇米影视777影音先锋 | 香蕉视频导航 | 成 人 黄 色 免费播放 | 91九色在线视频观看 | 西西www4444大胆在线 | 国产资源免费在线观看 | 夜夜操网站 | 麻豆国产精品一区二区三区 | 国产成人在线免费观看 | 天堂va在线观看 | 人人干在线观看 | 日韩精品高清视频 | 一区二区不卡在线观看 | 亚洲天天摸日日摸天天欢 | 久久精品女人毛片国产 | 国产美腿白丝袜足在线av | 久久一区二区三区四区 | 日韩视频1 | av丝袜在线| 偷拍久久久 | 天天曰天天爽 | 中文字幕一区二区三区久久 | 国产综合福利在线 | 成人欧美一区二区三区黑人麻豆 | 天天干天天射天天操 | 伊人电影在线观看 | 日韩大陆欧美高清视频区 | 在线观看国产 | 亚洲国产精品免费 | 91九色在线视频观看 | 丁香五月亚洲综合在线 | 国产一区二区精品久久91 | 国产99自拍 | 91人人爱| 91热爆视频 | 国产手机av在线 | 精品视频久久久 | 国产精品都在这里 | 在线黄色免费 | 国产精品黄 | 日韩av在线不卡 | 日日夜夜精品免费 | 久久久久久蜜av免费网站 | 久久三级毛片 | 日韩av片无码一区二区不卡电影 | 欧美日韩国产精品一区二区三区 | 综合激情网... | 九九热精品视频在线观看 | 午夜精品电影 | 九月婷婷色 | 五月天亚洲综合 | 在线观影网站 | 精品国产一区二区三区久久久蜜月 | 精品一区在线 | 91精品国产自产在线观看永久 | 久久 一区 | 91香蕉国产在线观看软件 | 久草综合在线 | 国产精品毛片一区视频播 | 热re99久久精品国产66热 | 国内精品视频久久 | 国产精品婷婷午夜在线观看 | 亚洲激情六月 | 国产精品一区二区免费在线观看 | 免费在线观看黄 | 天天操狠狠操夜夜操 | 亚洲精品久久久久999中文字幕 | 亚洲乱码中文字幕综合 | 免费观看日韩av | 亚洲精品黄色在线观看 | 日韩一区二区三区免费视频 | 最新av网址在线 | 日韩,精品电影 | 人人爽人人爽 | 日本女人的性生活视频 | 国产麻豆精品免费视频 | 欧美一级免费 | 国产九九热视频 | 日本久久电影 | 免费在线观看av不卡 | 天天草av| 精品一区二区在线免费观看 | 欧美日韩一区二区三区视频 | 中文字幕乱在线伦视频中文字幕乱码在线 | 久久国产美女 | 午夜av一区二区三区 | 中文字幕日韩免费视频 | 在线影院av | 丁香六月天 | 国际精品久久 | 菠萝菠萝在线精品视频 | 碰超在线 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 一区中文字幕在线观看 | 四虎在线免费视频 | 国产又粗又长又硬免费视频 | 日韩精品免费在线观看视频 | 黄色片亚洲 | 成人超碰97| 亚洲综合在线视频 | 国产亚洲字幕 | 伊人狠狠 | 久久国产精品视频 | 亚洲黄色影院 | 中文字幕在线看 | 欧美在线久久 | 久草视频在线观 | 国产一区免费视频 | 久久视频热 | 免费观看9x视频网站在线观看 | 最新av在线免费观看 | 国产一卡二卡四卡国 | 97色婷婷 | avav99| 国产又粗又猛又爽 | 黄色一级免费电影 | 成人在线免费小视频 | 国产精品中文字幕在线播放 | 色资源中文字幕 | 色婷婷国产精品一区在线观看 | 日日夜夜精品免费视频 | 青青河边草免费观看完整版高清 | 欧美一区二区三区四区夜夜大片 | 在线观看免费观看在线91 | 久久久伦理 | 99久久精品免费 | 久久夜视频 | 狠狠天天| 激情五月婷婷综合 | a天堂一码二码专区 | 在线看欧美 | 成人黄色在线看 | 精品9999 | 亚洲最新av网站 | 国产精品热 | 日韩免费在线观看视频 | 91免费视频网站在线观看 | 久久久久久久久久伊人 | 色婷婷在线播放 | 婷婷伊人综合亚洲综合网 | 色夜影院| 久草视频国产 | 99精品免费网 | 亚洲精品免费观看 | 日本性生活免费看 | 亚洲在线视频免费 | 久久夜视频 | 久久久久国产精品一区二区 | 欧美91视频| 美女视频永久黄网站免费观看国产 | 久久美女视频 | 天天操欧美 | 国产成人高清在线 | a级国产乱理论片在线观看 特级毛片在线观看 | 亚洲欧洲视频 | 蜜臀av一区二区 | 免费在线观看日韩 | 日韩免费av片 | 五月婷婷六月丁香在线观看 | 国产麻豆精品久久 | 999久久久欧美日韩黑人 | 九九视频免费在线观看 | 国产视频2区 | 日本一区二区不卡高清 | 国产伦精品一区二区三区高清 | 国产最新91 | 欧美一级视频免费 | 亚洲视频在线观看 | 2023亚洲精品国偷拍自产在线 | 国产精品露脸在线 | 久久精品一区二区三区国产主播 | 丝袜一区在线 | 久久人人97超碰com | 欧美成年人在线观看 | 亚洲伊人av | 免费在线国产精品 | 精品在线观看一区二区三区 | 最新中文字幕在线观看视频 | 中文字幕网站视频在线 | 国产涩涩在线观看 | 夜夜骑天天操 | 最近中文字幕视频完整版 | 欧美日韩在线看 | 伊人久久av| 香蕉视频一级 | 麻豆传媒电影在线观看 | 婷婷婷国产在线视频 | 中文字幕日本电影 | 国产精品99久久久久的智能播放 |