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

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

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

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

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

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

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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                我們先回顧一下SS是怎么創建的。 ~~~ String args[] = { "--setuid=1000", "--setgid=1000", "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010, 3001,3002,3003", "--capabilities=130104352,130104352", "--runtime-init", "--nice-name=system_server", "com.android.server.SystemServer", }; ZygoteConnection.Arguments parsedArgs = null; int pid; parsedArgs = new ZygoteConnection.Arguments(args); intdebugFlags = parsedArgs.debugFlags; pid = Zygote.forkSystemServer( //調用forkSystemServer parsedArgs.uid,parsedArgs.gid, parsedArgs.gids,debugFlags, null); ~~~ 從上面的代碼中可以看出,SS是由Zygote通過Zygote.forkSystemServer函數fork誕生出來的。這里會有什么玄機嗎?先來一起看看forkSystemServer的實現。它是一個native函數,實現在dalvik_system_Zygote.c中,如下所示: **dalvik_system_Zygote.c** ~~~ static voidDalvik_dalvik_system_Zygote_forkSystemServer( const u4* args, JValue* pResult) { pid_tpid; //根據參數,fork一個子進程 pid =forkAndSpecializeCommon(args); if (pid > 0) { int status; gDvm.systemServerPid = pid;//保存system_server的進程id //函數退出前須先檢查剛創建的子進程是否退出了。 if(waitpid(pid, &status, WNOHANG) == pid) { //如果system_server退出了,Zygote直接干掉了自己 //看來Zygote和SS的關系異常緊密,簡直是生死與共! kill(getpid(), SIGKILL); } } RETURN_INT(pid); } ~~~ 下面,再看看forkAndSpecializeCommon,代碼如下所示: **dalvik_system_Zygote.c** ~~~ static pid_t forkAndSpecializeCommon(const u4*args) { pid_tpid; uid_tuid = (uid_t) args[0]; gid_tgid = (gid_t) args[1]; ArrayObject* gids = (ArrayObject *)args[2]; u4debugFlags = args[3]; ArrayObject *rlimits = (ArrayObject *)args[4]; //設置信號處理,待會兒要看看這個函數。 setSignalHandler(); pid =fork(); //fork子進程 if (pid== 0) { //對子進程要根據傳入的參數做一些處理,例如設置進程名,設置各種id(用戶id,組id等) } ...... } ~~~ 最后看看setSignalHandler函數,它由Zygote在fork子進程前調用,代碼如下所示: **dalvik_system_Zygote.c** ~~~ static void setSignalHandler() { interr; structsigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_handler = sigchldHandler; err =sigaction (SIGCHLD, &sa, NULL);//設置信號處理函數,該信號是子進程死亡的信號 } //我們直接看這個信號處理函數sigchldHandler static void sigchldHandler(int s) { pid_tpid; intstatus; while((pid = waitpid(-1, &status, WNOHANG)) > 0) { } else if (WIFSIGNALED(status)) { } } //如果死去的子進程是SS,則Zygote把自己也干掉了,這樣就做到了生死與共! if(pid == gDvm.systemServerPid) { kill(getpid(), SIGKILL); } } ~~~ OK,做為Zygote的嫡長子,SS確實具有非常高的地位,竟然到了與Zygote生死與共的地步!它為什么這么重要呢?我們現在就從forkSystemServer來分析SS究竟承擔了怎樣的工作使命。 關于源代碼定位的問題,不少人當面對浩瀚的代碼時,常常不知道具體函數是在哪個文件中定義的。這里,就Source insight的使用提幾點建議: - 1)加入工程的時候,不要把所有目錄全部加進去,否則會導致解析速度異常緩慢。我們可以先加入framework目錄,如以后另有需要時,再加入其他目錄。 - 2)除了Sourceinsight的工具外,還需要有一個能搜索文件中特定字符串的工具,我用的是coolfind。forkSystemServer這個函數,就是通過它在源碼中搜索到的,并且找到了實現文件dalvik_system_Zygote.c。在Linux下也有對應工具,但工作速度比coolfind緩慢。 - 3) 在Linux下,可通過wine(一個支持Linux平臺安裝Windows軟件的工具)安裝Source insight。
                  <ruby id="bdb3f"></ruby>

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

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

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

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

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

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

                              哎呀哎呀视频在线观看