Zygote啟動分析

2021-06-21 06:56:10 字數 1103 閱讀 9630

基於效能的考慮,dalvik虛擬機器只啟動一次,新的例項將從第一次啟動的dalvik中拷貝。這個功能是通過系統服務zygote來實現的。

zygote的啟動過程簡述如下:首先,它預初始化和預載入通用的android類到它的堆中。然後,它監聽在socket埠上,等待啟動乙個新的android應用程式的命令。當接收到乙個啟動應用程式命令,它將利用已經載入的應用程式fork出乙個新的程序。該程序就是被啟動的應用程式,且與原始的zygote程序共享同乙個寫時複製(copy-on-write)對映的堆。因此,zygote的堆被鏈結到該新程序。如果該應用程式只從堆中讀取資料,那麼就一直與zygote共享堆。但是,一旦應用程式在堆上執行寫操作,那麼堆對應的記憶體頁被會被複製且會鏈結到新頁上。這樣,應用程式就可以修改過堆中的資料而不用擔心會影響zygote程序的堆了。

當乙個新的android應用程式產生時,它使用zygote的記憶體布局,因此,對每個應用程式來說,它們的記憶體布局是一樣的。

下面分析一下**的流程:

while (i < argc) else if (strcmp(arg, "--zygote") == 0) else if (strcmp(arg, "--start-system-server") == 0) else if (strncmp(arg, "--nice-name=", 12) == 0) else else if (classname) else else else if (!argv[1].equals("")) catch (methodandargscaller caller) catch (runtimeexception ex) {

log.e(tag, "zygote died with exception", ex);

closeserversocket();

throw ex;

4. 最後我們看一下,如何啟動systemserver。

5. systemserver會開啟乙個serverthread執行緒,在該執行緒中啟動一系列服務後,最後會通過activitymanagerservice.self().systemready(…) -> resumetopactivitylocked->starthomeactivitylocked啟動home activity,即launcher。

啟動故障分析

最近看到好多帖子是關於啟動故障的,找了些資料,結合本人拙建,希望對大家有所幫助 電腦的啟動過程是乙個非常複雜的過程,它有乙個非常完善的自檢體系,在你按下電源開關的幾秒之內,要經歷大約100多個檢測步驟,以下是啟動過程以及常見的問題和大致的判斷 一 電源,主機板,cpu 當按下電源開關時,電源開始供電...

Android DHCP 啟動分析

一 dhcp client 和 dhcpcd server直接的資訊互動 client 和server 通過property get set 共享記憶體來共享資訊。property get set key,value 儲存在共享記憶體中,系統中的各個程序可以通過property service訪問。...

Mycat 啟動分析

mycat版本 1.4.1 dev mycat啟動類 org.opencloudb.mycatstartup mycat home org.opencloudb.config.model.systemconfig mycat系統基礎配置項。mycat啟動時,首先會檢查mycat home是否設定。如...