一、Zygote是什麼
Zygote是Android系統啟動過程中的一個進程,它是用來孵化新應用進程的。Zygote進程會先載入Android Framework,並執行一些初始化操作,然後等待系統創建新應用進程的請求。當一個新應用進程需要創建時,Zygote進程就會fork出一個子進程,並為新進程執行一些初始化操作,包括載入應用的類、資源等。
二、Zygote的啟動流程
Zygote的啟動流程可以分為三步:
1、系統啟動時,init進程會調用/system/bin/start
“`
/system/bin/start
class_start /system/bin/app_process /system/bin –zygote –start-system-server
…
“`
2、start腳本會調用app_process可執行文件,並將–zygote和–start-system-server兩個參數傳遞給它。
“`
app_process /system/bin –zygote –start-system-server
“`
3、app_process根據–zygote參數,判斷當前進程是否是Zygote進程,如果是,則執行Zygote的初始化操作,否則,app_process會根據傳遞給它的類名參數啟動對應的應用進程。
三、Zygote的初始化操作
Zygote進程的初始化操作包括:
1、載入Android Framework
“`
/**
* @param systemServer 是否啟動系統服務進程
*/
void com_android_internal_os_Zygote_nativeInit(JNIEnv* env, jclass clazz, jboolean systemServer) {
…
if (systemServer) {
zygote_init();
} else {
child_init();
}
…
}
“`
2、創建Zygote Socket
“`
int createZygoteSocket(const char* socketName) {
int fd;
union {
sockaddr addr;
sockaddr_un unixAddr;
} sockAddr;
/**
* 初始化socket地址
*/
memset(&sockAddr, 0, sizeof(sockAddr));
sockAddr.unixAddr.sun_family = AF_UNIX;
strcpy(sockAddr.unixAddr.sun_path, socketName);
/**
* 創建socket
*/
fd = socket(AF_UNIX, SOCK_STREAM, 0);
/**
* 綁定socket到地址
*/
if (bind(fd, &sockAddr.addr, sizeof(sockAddr.unixAddr)) == -1) {
ALOGE(“bind(‘%s’) failed: %s”, socketName, strerror(errno));
return -1;
}
/**
* 監聽socket
*/
if (listen(fd, 5) == -1) {
ALOGE(“listen() failed: %s”, strerror(errno));
return -1;
}
/**
* 授權socket文件路徑和進程UID之間的訪問許可權
*/
if (chmod(socketName, 0777) == -1) {
ALOGE(“chmod(‘%s’, 0777) failed: %s”, socketName, strerror(errno));
return -1;
}
return fd;
}
“`
四、Zygote的通信協議
Zygote進程在創建新應用進程時,會通過Zygote Socket接收來自System Server進程的請求。請求數據格式如下:
“`
struct {
int32_t pid; // 請求進程的PID
uid_t uid; // 請求進程的UID
char* cmd; // 啟動應用的命令,例如am start …
int32_t argc; // argv數組的長度
char** argv; // 傳遞給應用進程的參數列表
int32_t envc; // envp數組的長度
char** envp; // 傳遞給應用進程的環境變數列表
int32_t w, h; // 應用進程窗口的寬和高
int32_t sdkVersion; // 應用所用的SDK版本號
} StartArgs;
“`
在接收到請求後,Zygote進程會fork出一個子進程,並傳遞請求的參數給子進程(argv數組、envp數組等)。新應用進程會繼承與Zygote進程相同的類、資源、環境等,從而減少啟動時間和內存消耗。
五、Zygote的優化
Zygote進程會在啟動時預載入常用的類和資源,以便在孵化新應用進程時能夠更快地初始化應用。此外,Zygote進程還會採用Copy on write(COW)技術,在fork出子進程時,共享與父進程相同的內存頁面,以減少內存使用和啟動時間。
六、總結
本文主要講解了Android系統啟動過程中的Zygote進程,介紹了Zygote的啟動流程、初始化操作、通信協議以及優化措施。Zygote進程的孵化方式,充分利用系統資源,減少了應用啟動時間和內存消耗,對提高系統性能起到一定的作用。
原創文章,作者:JNCBI,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333211.html