此文章純粹個(gè)人看源碼時(shí)的記錄酸纲,所以只關(guān)注我需要的東西,如果讀者觀看時(shí)涉及到不了解的知識(shí)點(diǎn)栽惶,建議自己看源碼或者評(píng)論中提問
小技巧:在看安卓源碼的時(shí)候疾嗅,看到使用IActivityManager就知道這是應(yīng)用進(jìn)程在跨進(jìn)程找AMS”辦事“了,AMS給應(yīng)用進(jìn)程跨進(jìn)程”回復(fù)“會(huì)用IApplicationThread汁蝶,而IApplicationThread的操作都會(huì)通過handler發(fā)給ActivityThread來做。
所以對(duì)application墓律、activity等的啟動(dòng)無從入手的話幔亥,可以直接去ActivityThread去看各種handle開頭的方法。
1帕棉、Application和其內(nèi)部ContextImpl創(chuàng)建過程
從ActivityThread的main()方法開始
IActivityManger和IApplicationThread這兩個(gè)binder機(jī)制類相當(dāng)于兩國(guó)交流的外交官香伴,屬于溝通的橋梁,并不是真正做事的人瞒窒,就不單獨(dú)畫出來了乡洼。比如IApplicationThread中各種操作最終都是發(fā)消息讓ActivityThread來做。
2拔稳、Activity和其內(nèi)部ContextImpl創(chuàng)建過程
在看這塊源碼過程中產(chǎn)生了一個(gè)疑問锹雏,AMS對(duì)application和activity的創(chuàng)建是沒有直接代碼上的先后順序的礁遵,那么到底一個(gè)app啟動(dòng)時(shí)是先創(chuàng)建根activity還是application呢?
查閱一些文章和啟動(dòng)相關(guān)源碼佣耐,發(fā)現(xiàn)四大組件任意一個(gè)在啟動(dòng)時(shí)會(huì)先檢查程序進(jìn)程是否創(chuàng)建,如果沒有會(huì)先請(qǐng)求zygote創(chuàng)建奸远,zygote 會(huì)fork出一個(gè)新進(jìn)程并分配pid讽挟,進(jìn)程創(chuàng)建完就會(huì)走ActivityThread的main方法(文中第一張圖),此時(shí)算是進(jìn)入這個(gè)應(yīng)用程序的大門薛窥。
舉個(gè)例子褐墅,activity的創(chuàng)建檢查并創(chuàng)建進(jìn)程的地方在:com.android.server.am.ActivityStackSupervisor#startSpecificActivityLocked-----AMS.startProcessLocked
至此洪己,對(duì)四大組件為什么能叫四大組件的原因更明白了幾分竟贯,它們不止是擁有context這個(gè)訪問系統(tǒng)的權(quán)限憑證,更是能向系統(tǒng)請(qǐng)求創(chuàng)建進(jìn)程的大佬拱镐。