天天看點

Android Framework實戰視訊--Zygote的fork程序篇

直接上代碼體驗fork桌面建立新的子程序

​​//fork.c​​

因為屬于linux的代碼,隻需要在ubuntu上運作既可以:

gcc fork.c -o fork

然後執行:./fork

輸出如下:

可以看出調用fork以前隻有一個程序 pid = 5319

但是在fork執行後:多了一個程序号 5320

就會有2個程序的列印,即代碼中的if和else都執行了,因為fork執行後就有兩個程序分别執行了。

其中fork的傳回值如果為:0說明目前就是子程序執行,為子程序的pid就說明是原來的父程序

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java中main方法裡面的如下代碼

核心就是forkSystemServer方法

分析發現主要調用:

這個從名字看相對也貼近剛開始學的fork了。繼續看Zygote.forkSystemServer

這裡調用的又是nativeForkSystemServer,nativeForkSystemServer屬于jni調用:

代碼路徑:

frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

調用到了ForkAndSpecializeCommon方法:

ForkAndSpecializeCommon方法本身非常長,但是看到這裡有一個 pid_t pid = fork();

大家心裡有沒有非常非常激動啊

這裡就是真正建立子程序的地方,和剛開始一樣講解實戰的fork程式是不是一樣啊

好了,那到這裡相信大家已經清楚了zygote怎麼一步步的建立出新的程序