1. 程式人生 > >閱讀Android原始碼的一些method

閱讀Android原始碼的一些method

Handler-Message-Looper
Handler被稱為“非同步提交器”,是Android開發入門教程必定談及的東西,這也是Activity等元件的工作機制需要用到的東西,是“資料驅動”框架的重要組成,作為閱讀原始碼的入門最適合不過。

\frameworks\base\core\java\android\os

Activity和Service
作為經常使用到的元件,閱讀其原始碼的花費和帶來的技術提高的價效比肯定是最高的,Service可以不看,但是Activity總不能少吧。

\frameworks\base\core\java\android\app

Fragment
還在認為Fragment是一個檢視嗎,還在認為FragmentActivity的介面有多個Fragment組成嗎,看看Fragment和FragmentManager吧,瞭解下生命週期的本質到底是什麼。

\frameworks\base\core\java\android\app

View
想自定義高階的View類嗎,那總得知道onMeasure/onLayout/onDraw這些方法是怎麼被呼叫的,瞭解LayoutParams是怎麼工作的,知道呼叫requestLayout和Invalidate的時候有什麼區別。

\frameworks\base\core\java\android\view

MotionEvent
在懂的怎麼自定義高階的View後,只能向用戶顯示介面,還得知道怎麼與使用者互動才能做出華麗的UI。所以必須知道TouchEvent的分發和攔截的工作機制,起碼也得知道其特點,才不會一直在困擾“為什麼無法監聽使用者的觸控事件”、“View之間的觸控事件衝突了”或者“View的滑動與點選事件衝突了”之類的問題。

\frameworks\base\core\java\android\view

LayoutInflator
佈局渲染器也是開發Android UI的時候經常用到的,不過LayoutInflator例項的建立方式有好幾種,你至少得知道其之間的區別。還有,LayoutInflator在渲染指定佈局的時候,有container和attachToRoot等引數,閱讀原始碼後很快能瞭解其區別。

\frameworks\base\core\java\android\view

SurfaceView和TextureView
閱讀完View的工作機制後,就能理解為什麼View在繪製複雜的UI效果時效率這麼低,這時候就需要SurfaceView和TextureView了。理解雙緩衝對UI更新效率的幫助,瞭解SurfaceView在檢視疊加的時候的缺陷,瞭解TextureView在Android Lollipop之前的內容竄臺BUG,才能用正確姿勢使用這倆。

\frameworks\base\core\java\android\view

AsyncTask
非同步任務也是Android開發經常遇到的問題,相比自己從Thread和Handler寫起,被稱為“非同步任務大師”的AsyncTask類自然更受到許多小夥伴的喜歡。不過AsyncTask在早期的Android版本中差別甚大,需要做大量的適配工作,而且特別容易引起非同步任務引用著元件的例項導致記憶體洩露從而引發OOM問題,所以不推薦直接使用AsyncTask類,不過強烈推薦閱讀AsyncTask的原始碼學習Google優秀的非同步任務設計理念。此外,如果真的要使用AsyncTask,不要直接使用系統提供的AsyncTask類,AsyncTask本身就是一個單一的Java類,沒有耦合其他系統類,推薦自己從最新的Android版本中複製一份AsyncTask類的程式碼,自己維護,在專案中當做Support包一樣使用,以規避其相容性問題。

\frameworks\base\core\java\android\os

Volley
這個強烈推薦,是Google官方的非同步任務框架,沒有隨Android釋出,需要自己在Framework裡下載程式碼。Volley的中文意思就是“併發”,閱讀其原始碼能讓你見識到原來非同步任務框架也能寫得這麼低耦合和高擴擴充套件,其用“生產者-消費者”模式來處理非同步請求的框架會讓人拍案叫絕。此外,Volley框架是用於處理Http任務和Image載入任務,但是其優秀的非同步控制思想也能運用與File、Sqlite等耗時任務的處理,當你能夠自己寫出類似Volley框架的程式碼時,說明你的Android技術已經有所突破。

\frameworks\volley

android.util.*
“android.util.*” 包名下有許多優秀的實用類,大多是作為Java自帶類的補充,比如資料結構類的SparseArray、ArrayMap、ArraySet,用於加密的Base64,用於處理螢幕解析度自適應的DisplayMetrics和TypedValue,用於時間換算的TimeUtils,以及用於記憶體快取的LruCache,熟悉這些類對Android開發非常有幫助,也會讓程式碼顯得成熟。

\frameworks\support\v4\java\android\support\v4\util

高階:

Context
閱讀Context原始碼能幫助我們瞭解其工作機制,瞭解Google是怎麼在Java程式碼上新增Android特性的,瞭解Android是怎麼儲存和獲取res資源的,瞭解ContextWrapper和Activity這些Context有什麼區別,瞭解Context設計的裝飾者模式(Description Pattern)。

\frameworks\base\core\java\android\content

ClassLoader
類載入器ClassLoader是Android虛擬機器工作的基礎,瞭解其“雙親代理模式”能讓你更好的瞭解系統的類和你寫的類是怎麼工作的。Multi-Dex和ART模式也和ClassLoader的工作機制息息相關。

\libcore\libart\src\main\java\java\lang

Binder
Binder是Android上RPC(Remote Procedure Call Protocol)的實現,Android系統許多功能就是居於Binder實現的,平時應用層對Binder的使用大多是在於和Service通訊的時候,不過,當我們需要使用AIDL功能的時候,就需要接觸到Binder了。

\frameworks\base\core\java\android\os

WMS,AMS,PMS,NMS,IMS等系統Service
SystemServer是Android的Framework層工作的核心,Android系統啟動過程包含從Linux核心載入到Home應用程式啟動的整個過程。SystemServer是Zygnote孵化的第一個程序,這個程序會啟動許多Framework層功能需要用到的執行緒,比如用於管理視窗的WindowManagerService,用於管理Activity的ActivityManagerService,用於管理APK包資訊的PackageManagerService,用於管理網路的NetworkManager,用於處理使用者觸控的InputManagerService等,這些系統Service提供了APP執行時需要的大多系統功能,大多使用“stub-server”的模式進行互動,而且有大量的JNI的呼叫。這部分的原始碼比較適合從事ROM開發的人閱讀,應用層的開發基本不會用到,但是這方面的只是能讓我們對Android Framework層的工作機制有個大抵的認識。

\frameworks\base\services\core\java\com\android\server
3-rd程式碼:

EventBus
Android上的一個“訂閱者-釋出者”模式的實現框架,非常適合業務多而且經常變動的專案,能夠有效預防“介面爆炸”,現在基本上中型以上的專案都會採用類似的框架。

\external\guava\guava\src\com\google\common\eventbus

https://github.com/greenrobot/EventBus

OTTO
同上,只不過實現的具體方案不一樣,而且OTTO相比EventBus來,比較小巧,程式碼也比較簡練,非常適合處女座的開發者食用。

http://square.github.io/otto/

RxJava
相比起上面兩個,RxJava可以說是把非同步的思想發揮到了極致,RxJava的興起代表了Android開發中響應式程式設計的崛起,同樣非常適合業務多而且經常變動的專案,只不過相比傳統的基於介面的開發方式,RxJava框架的開發方式會有點難以適應,特別是團隊開發的時候。

https://github.com/ReactiveX/RxJava 

https://github.com/ReactiveX/RxAndroid 

Guava
這個其實也是Google自己開源的,提供了許多優秀的Java工具類,比如“one to one mapping”的Bimap,有時候一些工具類Android或Java自帶的庫沒有提供,或許我們可以先參考Guava的。

\external\guava\

https://github.com/google/guava


相關推薦

閱讀Android原始碼一些method

Handler-Message-Looper Handler被稱為“非同步提交器”,是Android開發入門教程必定談及的東西,這也是Activity等元件的工作機制需要用到的東西,是“資料驅動”框架的重要組成,作為閱讀原始碼的入門最適合不過。 \frameworks\base\core\java\andr

「Do.016」AS不用編譯,閱讀Android原始碼

首發公眾號:Android程式設計師日記 作者:賢榆的榆 如果你覺得有幫助歡迎關注、讚賞、轉發 閱讀時間:2616字 6分鐘 寫在前面 很早就像自己搭一個Android原始碼閱讀環境,折騰了幾次無果,就擱置了。最近有點閒暇時間,再加上也覺得是時候更深刻的認

線上閱讀android原始碼

一直在尋找android系統的原始碼,網上有不少帖子介紹如何下載android原始碼,包括在linux系統,windows系列和mac os系統。但是本人經過測試,並沒有發現哪些帖子是切實可行的。這些帖子的內容多因連結過期或者含糊不清而不可用。同時,由於android系統程式碼量龐大,所以就萌生了線

Mac 中下載閱讀 Android 原始碼

準備工作:建立區分大小寫的 APFS 宗卷 國內使用 Android Source 官方的下載方式有點慢,所以通常建議使用國內的 AOSP 映象,一般是 中科大的映象 或者 清華大學的映象 ,本文使用的是清華大學的映象。 先下載 repo 工具:

(連載)Android系統原始碼分析--如何下載和閱讀Android原始碼

> ** 這是一個連載的博文系列,我將持續為大家提供儘可能透徹的Android原始碼分析 [github連載地址](https://github.com/foxleezh/AOSP)** ## 前言 閱讀Android原始碼的好處有很多,可以加深我們對系統的瞭解,可

android原始碼閱讀三》android原始碼編譯匯入android studio

1、安裝 Java 輸入命令 java,報以下錯誤: Command 'java' not found, but can be installed with: sudo apt insta

閱讀ArrayList原始碼一些記錄

ArrayList的底層是基於陣列實現的,但是我們知道陣列的長度一旦確定就不能夠再次變化,ArrayList的長度是可以變化的,其實就是在需要擴容的時候,重新生成一個數組,並把原陣列中的元素放到新的陣列中,用新的陣列替代就得陣列,就完成了ArrayList的擴容

閱讀Vector原始碼記錄的一些筆記

在多執行緒的情況下,ArrayList和LinkedList都是執行緒不安全的,Vector是執行緒安全的,ArrayList是基於陣列實現的,LinkedList是基於雙向連結串列實現,而Vector的實現也是基於陣列的,從資料結構來看,Vector和Arra

如何快速閱讀並分析Android原始碼

很多時候為了解決一個問題必須先理解Android系統的執行原理,這時候就得閱讀應用層框架的原始碼。學會閱讀系統原始碼或者他人的程式碼,這是研發必備的技能之一,只有瞭解別人寫的東西才能在他之上更好的行事,同時也能去學習和借鑑他人優秀的程式碼思想。那麼,如何閱讀並分析Androi

安卓學習過程、怎樣閱讀 Android 系統原始碼

問:對於想深入學習底層架構的同學,應該怎樣閱讀 Android 系統原始碼呢? 我覺得閱讀系統原始碼非常有必要遵循的一個原則就是抽絲剝繭、點到即止。應該認準一個功能點,然後去分析這個功能點是如何實現的。但只要去追尋主體的實現邏輯即可,千萬不要試圖去搞懂每一行程式碼都是什麼意思,那樣很容易會陷入到思維陷阱當中

Android原始碼:2、閱讀詳解

文章目錄 一、原始碼下載 二、閱讀原始碼 1、Android系統架構圖分析 2、閱讀哪些原始碼 3、Android原始碼閱讀工具 一、原始碼下載 有些人可能還不知道如何下載Android原始碼開源專案AOSP(Android Open Source Project

關於Android原始碼的理解以及如何閱讀原始碼

文章最早釋出於我的微信公眾號 Android_De_Home 中,歡迎大家掃描下面二維碼關注微信公眾獲取更多知識內容。 本文為sydMobile原創文章,可以隨意轉載,但請務必註明出處! 平時我們在用Android Studio開發專案的時候,

如何閱讀Android framework層原始碼

閱讀Android Framework層的原始碼可能是Android 開發者深入學習的必經之路。但在我學習的過程中看到最多的是各路大神的原始碼分析,而很少有展示如何一步一步找到相關程式碼的。直到前不久看到老羅的視訊《Android原始碼情景分析法》,很有啟發。但

使用Android Studio閱讀整個Android原始碼

之前一直在windows下用source insight閱讀android原始碼,效果非常好。 後來遠端異地伺服器,網路限制,一直用ssh + vim,現在主要還是以這種方式。 最近發現一個不錯的東西(早就有了),在android原始碼中有這麼一個目錄development/tools/idegen。 顧名

大牛們是怎麼閱讀 Android 系統原始碼的?

由於工作需要大量修改framework程式碼, 在AOSP(Android Open Source Project)原始碼上花費了不少功夫, Application端和Services端都看和改了不少. 如果只是想看看一些常用類的實現, 在Android包管理器裡把原始碼下載下來, 隨便一個IDE配好Sour

Android一些方法和屬性

註意 odin 技術 drawable button display round clas class 1.Activity常用的方法   View findViewById(int id) //根據組件的ID取得組件對象   setContentView(int

android開發一些小bug

string -m 怎麽辦 post ring oar content trac deb 1.一定要註意findViewId這種方法,尤其是含有多個同樣的R.id的名字時,debug時不會當場報錯。但隨後會報空指針錯誤 2.List轉換為Array能夠這樣處理:

android一些特殊字符(如:←↑→↓等箭頭符號)的Unicode碼值

lin gb2312 ring clu itl app lan orien lam 在項目中,有時候在一些控件(如Button、TextView)中要添加一些符號,如下圖所示: 這個時候可以使用圖片的方式來顯示,不過這

python_numpy的一些method

.com style pre 維度 dimens numpy inf ima 不同的 1.tile(A, reps):   A是一個類似list的類型,reps是重復操作的指令 ,根據reps的不同去完成不同的重復   有點像tensorflow中的shape維度操作。