此文章純粹個人看源碼時的記錄,所以只關(guān)注我需要的東西,如果讀者觀看時涉及到不了解的知識點(diǎn),建議自己看源碼或者評論中提問

小技巧:在看安卓源碼的時候,看到使用IActivityManager就知道這是應(yīng)用進(jìn)程在跨進(jìn)程找AMS”辦事“了,AMS給應(yīng)用進(jìn)程跨進(jìn)程”回復(fù)“會用IApplicationThread,而IApplicationThread的操作都會通過handler發(fā)給ActivityThread來做。
所以對application、activity等的啟動無從入手的話,可以直接去ActivityThread去看各種handle開頭的方法。
1、Application和其內(nèi)部ContextImpl創(chuàng)建過程
從ActivityThread的main()方法開始
IActivityManger和IApplicationThread這兩個binder機(jī)制類相當(dāng)于兩國交流的外交官,屬于溝通的橋梁,并不是真正做事的人,就不單獨(dú)畫出來了。比如IApplicationThread中各種操作最終都是發(fā)消息讓ActivityThread來做。

2、Activity和其內(nèi)部ContextImpl創(chuàng)建過程
在看這塊源碼過程中產(chǎn)生了一個疑問,AMS對application和activity的創(chuàng)建是沒有直接代碼上的先后順序的,那么到底一個app啟動時是先創(chuàng)建根activity還是application呢?
查閱一些文章和啟動相關(guān)源碼,發(fā)現(xiàn)四大組件任意一個在啟動時會先檢查程序進(jìn)程是否創(chuàng)建,如果沒有會先請求zygote創(chuàng)建,zygote 會fork出一個新進(jìn)程并分配pid,進(jìn)程創(chuàng)建完就會走ActivityThread的main方法(文中第一張圖),此時算是進(jìn)入這個應(yīng)用程序的大門。
舉個例子,activity的創(chuàng)建檢查并創(chuàng)建進(jìn)程的地方在:com.android.server.am.ActivityStackSupervisor#startSpecificActivityLocked-----AMS.startProcessLocked
至此,對四大組件為什么能叫四大組件的原因更明白了幾分,它們不止是擁有context這個訪問系統(tǒng)的權(quán)限憑證,更是能向系統(tǒng)請求創(chuàng)建進(jìn)程的大佬。