作者:魔法使Kaede
鏈接:https://zhuanlan.zhihu.com/p/20564614
來(lái)源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
推薦閱讀的源碼
AOSP項(xiàng)目這么龐大,就算是Framework部分也有夠看上一陣子的,所以推薦從常用的看起,由淺及深,同時(shí)向橫向和縱向深入閱讀。
開(kāi)始
Handler-Message-Looper
Handler被稱為“異步提交器”,是Android開(kāi)發(fā)入門(mén)教程必定談及的東西,這也是Activity等組件的工作機(jī)制需要用到的東西,是“數(shù)據(jù)驅(qū)動(dòng)”框架的重要組成,作為閱讀源碼的入門(mén)最適合不過(guò)。
Activity和Service
作為經(jīng)常使用到的組件,閱讀其源碼的花費(fèi)和帶來(lái)的技術(shù)提高的性價(jià)比肯定是最高的,Service可以不看,但是Activity總不能少吧。
Fragment
還在認(rèn)為Fragment是一個(gè)視圖嗎,還在認(rèn)為FragmentActivity的界面有多個(gè)Fragment組成嗎,看看Fragment和FragmentManager吧,了解下生命周期的本質(zhì)到底是什么。
View
想自定義高級(jí)的View類嗎,那總得知道onMeasure/onLayout/onDraw這些方法是怎么被調(diào)用的,了解LayoutParams是怎么工作的,知道調(diào)用requestLayout和Invalidate的時(shí)候有什么區(qū)別。
MotionEvent
在懂的怎么自定義高級(jí)的View后,只能向用戶顯示界面,還得知道怎么與用戶交互才能做出華麗的UI。所以必須知道TouchEvent的分發(fā)和攔截的工作機(jī)制,起碼也得知道其特點(diǎn),才不會(huì)一直在困擾“為什么無(wú)法監(jiān)聽(tīng)用戶的觸摸事件”、“View之間的觸摸事件沖突了”或者“View的滑動(dòng)與點(diǎn)擊事件沖突了”之類的問(wèn)題。
LayoutInflator
布局渲染器也是開(kāi)發(fā)Android UI的時(shí)候經(jīng)常用到的,不過(guò)LayoutInflator實(shí)例的創(chuàng)建方式有好幾種,你至少得知道其之間的區(qū)別。還有,LayoutInflator在渲染指定布局的時(shí)候,有container和attachToRoot等參數(shù),閱讀源碼后很快能了解其區(qū)別。
SurfaceView和TextureView
閱讀完View的工作機(jī)制后,就能理解為什么View在繪制復(fù)雜的UI效果時(shí)效率這么低,這時(shí)候就需要SurfaceView和TextureView了。理解雙緩沖對(duì)UI更新效率的幫助,了解SurfaceView在視圖疊加的時(shí)候的缺陷,了解TextureView在Android Lollipop之前的內(nèi)容竄臺(tái)BUG,才能用正確姿勢(shì)使用這倆。
AsyncTask
異步任務(wù)也是Android開(kāi)發(fā)經(jīng)常遇到的問(wèn)題,相比自己從Thread和Handler寫(xiě)起,被稱為“異步任務(wù)大師”的AsyncTask類自然更受到許多小伙伴的喜歡。不過(guò)AsyncTask在早期的Android版本中差別甚大,需要做大量的適配工作,而且特別容易引起異步任務(wù)引用著組件的實(shí)例導(dǎo)致內(nèi)存泄露從而引發(fā)OOM問(wèn)題,所以不推薦直接使用AsyncTask類,不過(guò)強(qiáng)烈推薦閱讀AsyncTask的源碼學(xué)習(xí)Google優(yōu)秀的異步任務(wù)設(shè)計(jì)理念。此外,如果真的要使用AsyncTask,不要直接使用系統(tǒng)提供的AsyncTask類,AsyncTask本身就是一個(gè)單一的Java類,沒(méi)有耦合其他系統(tǒng)類,推薦自己從最新的Android版本中復(fù)制一份AsyncTask類的代碼,自己維護(hù),在項(xiàng)目中當(dāng)做Support包一樣使用,以規(guī)避其兼容性問(wèn)題。
Volley
這個(gè)強(qiáng)烈推薦,是Google官方的異步任務(wù)框架,沒(méi)有隨Android發(fā)布,需要自己在Framework里下載代碼。Volley的中文意思就是“并發(fā)”,閱讀其源碼能讓你見(jiàn)識(shí)到原來(lái)異步任務(wù)框架也能寫(xiě)得這么低耦合和高擴(kuò)擴(kuò)展,其用“生產(chǎn)者-消費(fèi)者”模式來(lái)處理異步請(qǐng)求的框架會(huì)讓人拍案叫絕。此外,Volley框架是用于處理Http任務(wù)和Image加載任務(wù),但是其優(yōu)秀的異步控制思想也能運(yùn)用與File、Sqlite等耗時(shí)任務(wù)的處理,當(dāng)你能夠自己寫(xiě)出類似Volley框架的代碼時(shí),說(shuō)明你的Android技術(shù)已經(jīng)有所突破。
android.util.*
“android.util.*” 包名下有許多優(yōu)秀的實(shí)用類,大多是作為Java自帶類的補(bǔ)充,比如數(shù)據(jù)結(jié)構(gòu)類的SparseArray、ArrayMap、ArraySet,用于加密的Base64,用于處理屏幕分辨率自適應(yīng)的DisplayMetrics和TypedValue,用于時(shí)間換算的TimeUtils,以及用于內(nèi)存緩存的LruCache,熟悉這些類對(duì)Android開(kāi)發(fā)非常有幫助,也會(huì)讓代碼顯得成熟。
進(jìn)階
Context
閱讀Context源碼能幫助我們了解其工作機(jī)制,了解Google是怎么在Java代碼上添加Android特性的,了解Android是怎么保存和獲取res資源的,了解ContextWrapper和Activity這些Context有什么區(qū)別,了解Context設(shè)計(jì)的裝飾者模式(Description Pattern)。
ClassLoader
類加載器ClassLoader是Android虛擬機(jī)工作的基礎(chǔ),了解其“雙親代理模式”能讓你更好的了解系統(tǒng)的類和你寫(xiě)的類是怎么工作的。Multi-Dex和ART模式也和ClassLoader的工作機(jī)制息息相關(guān)。
Binder
Binder是Android上RPC(Remote Procedure Call Protocol)的實(shí)現(xiàn),Android系統(tǒng)許多功能就是居于Binder實(shí)現(xiàn)的,平時(shí)應(yīng)用層對(duì)Binder的使用大多是在于和Service通訊的時(shí)候,不過(guò),當(dāng)我們需要使用AIDL功能的時(shí)候,就需要接觸到Binder了。(推薦閱讀原理即可,反正C++驅(qū)動(dòng)層我是看不下去了)
WMS,AMS,PMS,NMS,IMS等系統(tǒng)Service
SystemServer是Android的Framework層工作的核心,Android系統(tǒng)啟動(dòng)過(guò)程包含從Linux內(nèi)核加載到Home應(yīng)用程序啟動(dòng)的整個(gè)過(guò)程。SystemServer是Zygnote孵化的第一個(gè)進(jìn)程,這個(gè)進(jìn)程會(huì)啟動(dòng)許多Framework層功能需要用到的線程,比如用于管理窗口的WindowManagerService,用于管理Activity的ActivityManagerService,用于管理APK包信息的PackageManagerService,用于管理網(wǎng)絡(luò)的NetworkManager,用于處理用戶觸摸的InputManagerService等,這些系統(tǒng)Service提供了APP運(yùn)行時(shí)需要的大多系統(tǒng)功能,大多使用“stub-server”的模式進(jìn)行交互,而且有大量的JNI的調(diào)用。這部分的源碼比較適合從事ROM開(kāi)發(fā)的人閱讀,應(yīng)用層的開(kāi)發(fā)基本不會(huì)用到,但是這方面的只是能讓我們對(duì)Android Framework層的工作機(jī)制有個(gè)大抵的認(rèn)識(shí)。(非常慚愧,這部分我自己看了幾次,還是沒(méi)能產(chǎn)生融會(huì)貫通的感覺(jué),整體的認(rèn)識(shí)還是比較模糊,希望繼續(xù)跟著老羅的博客,撿撿肉吃)
第三方開(kāi)源項(xiàng)目
EventBus
Android上的一個(gè)“訂閱者-發(fā)布者”模式的實(shí)現(xiàn)框架,非常適合業(yè)務(wù)多而且經(jīng)常變動(dòng)的項(xiàng)目,能夠有效預(yù)防“接口爆炸”,現(xiàn)在基本上中型以上的項(xiàng)目都會(huì)采用類似的框架。
OTTO
同上,只不過(guò)實(shí)現(xiàn)的具體方案不一樣,而且OTTO相比EventBus來(lái),比較小巧,代碼也比較簡(jiǎn)練,非常適合處女座的開(kāi)發(fā)者食用。
RxJava
相比起上面兩個(gè),RxJava可以說(shuō)是把異步的思想發(fā)揮到了極致,RxJava的興起代表了Android開(kāi)發(fā)中響應(yīng)式編程的崛起,同樣非常適合業(yè)務(wù)多而且經(jīng)常變動(dòng)的項(xiàng)目,只不過(guò)相比傳統(tǒng)的基于接口的開(kāi)發(fā)方式,RxJava框架的開(kāi)發(fā)方式會(huì)有點(diǎn)難以適應(yīng),特別是團(tuán)隊(duì)開(kāi)發(fā)的時(shí)候。
Guava
這個(gè)其實(shí)也是Google自己開(kāi)源的,提供了許多優(yōu)秀的Java工具類,比如“one to one mapping”的Bimap,有時(shí)候一些工具類Android或Java自帶的庫(kù)沒(méi)有提供,或許我們可以先參考Guava的。
以上是我自己個(gè)人推薦閱讀的源碼,不過(guò)每個(gè)開(kāi)發(fā)者自身的興趣和側(cè)重點(diǎn)都不一樣,有興趣的參考著看就是。同時(shí),如果有一些有趣的系統(tǒng)類,隨時(shí)歡迎推薦給我。