Android之源碼閱讀

作者:魔法使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í)歡迎推薦給我。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,466評(píng)論 25 708
  • Java中的String類可以被繼承么? 答:不能,因?yàn)樗且粋€(gè)final類,同樣的還有Integer,F(xiàn)loat...
    gyymz1993閱讀 4,059評(píng)論 2 104
  • 小時(shí)候?qū)^(guò)年的印象,無(wú)外乎這么兩種,一是滿街滿眼的喜氣洋洋的紅色,一是家家飄著的好吃的好玩的味道。 新春佳節(jié)臨近...
    靖寧閱讀 249評(píng)論 1 3
  • “野生”即為夜深 對(duì)與錯(cuò) 是與非 無(wú)一幸免。 路燈之下 獨(dú)自徘徊 獨(dú)自游走 獨(dú)自彷徨… 何為我歸? 我卻不知。 心...
    顏語(yǔ)利閱讀 254評(píng)論 2 1
  • 黃昏遠(yuǎn)去的時(shí)候 變成一只 野生的人。 看一些書(shū),寫(xiě)一些字。 吃自己種的糧食和蔬菜。 靠近泥土,靠近太陽(yáng)。 再親手烘...
    支點(diǎn)輕課class閱讀 311評(píng)論 0 3