Context實(shí)現(xiàn)類創(chuàng)建過程源碼分析記錄

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

image.png

小技巧:在看安卓源碼的時候,看到使用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來做。


Application和其內(nèi)部ContextImpl創(chuàng)建過程.png

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)程的大佬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容