1.android系統啓動第一個進程是init。
2.init會fork出一個叫zygote的進程。(所有的應用進程都是由zygote fork出來的)
zygote進程實際上是個jvm上的進程,啓動jvm,打開監聽端口(registerZygoteSocket),預加載類和資源。
3.zygote啓動過程中,會fork一個system_server,因爲是完全複製的zygote,所以需要關閉運行到現在爲止的一些東西,比如監聽端口。
4.system_server裏面會啓動ActivityManagerService等服務,來監聽創建activity的請求。
5.ActivityManagerService收到需要啓動activity的請求時,先看看有沒有相對應的已經註冊過的進程,如果沒有,通知zygote,讓它fork一個進程,然後註冊。如果有,直接發消息通知進程啓動activity。
爲什麼要這麼費勁呢?主要是快,android上都是java程序,每個進程都是一個jvm,啓動時要初始化加載很多類,而且這部分都是重複的,重新創建當然沒有複製來的快,另外linux上的fork遵循copy-on-write,所以還是可以共享父進程很多資源地。