如何學習Android的源代碼

      做了1年2年的android app開發好多人覺得自己陷入了瓶頸期,這個時候感覺自己一般的app都可以開發出來,完成領導想要的功能,各種第三方庫基本都熟練使用了,感覺沒什麼可學習的了,我也有過一段時間的迷茫,那時感覺各種app so easy,由於我做的項目對內存啊、流量啊、電量啊並不是特別關注,雖然我也會了解這方面的東西,可以感覺只要用戶能正常使用app,多費點電也無所謂,內存高點只要不崩潰就好吧,其實我覺得這些和app多定位有直接關係,app或許在中高端手機沒有問題,可在低端手機就無法使用,比如我做過一款app只要能在s7上跑就可以,因爲設計到非常複雜的計算。但是有的app就要求非常嚴格,比如微信,如果沒事就crash,流量很高,電量刷刷單跑,我想很多人就會卸載了它,然後另一個微信就誕生了,哈哈跑題了,拽回來,其實這段迷茫期我們很多人都想學習源代碼來提高自己的技術,可一看那麼龐大的代碼就蒙了,而且涉及到技術太多了,不知道從何入手,查了很多文檔和這方面的書籍,大部分都是介紹都是偏底層的,甚至要先看看linux方面的書籍,我一個app開發真的需要了解這些嗎?我想如果你是一個開發系統的,那就需要了,而我至少目前是不需要的。

      那麼對於我們一個普通的app開發者需要怎麼學習呢?我們先來看下整個Android的框架圖:
這裏寫圖片描述

從上往下看:
System Apps (系統應用)

Android本身自帶的一套核心應用,比如相機、郵件、藍牙等,這些app和我們開發的app一樣。國內很多手機廠商都做了自己的核心app,比如小米、華爲等。

Java API Fragmework

包含整個Android功能集,我們app開發就是在這個基礎上開發的,這部分包含了View、Services等。

Native C/C++ Libraries

許多核心 Android 系統組件和服務(例如 ART 和 HAL)構建自原生代碼,需要以 C 和 C++ 編寫的原生庫,我們所說的JNI(NDK)開發就是這部分。我們經常把一些核心算法這裏寫,主要有以下幾個原因:

  • 安全:相對來說這部分不容易被反編譯,畢竟懂c++的android開發者相對少一些。
  • 效率高:c++要比java效率高。
  • 很多算法庫是c++寫的,我們可以直接用。

Android Runtime

官方給的解釋是:
對於運行 Android 5.0(API 級別 21)或更高版本的設備,每個應用都在其自己的進程中運行,並且有其自己的 Android Runtime (ART) 實例。ART 編寫爲通過執行 DEX 文件在低內存設備上運行多個虛擬機,DEX 文件是一種專爲 Android 設計的字節碼格式,經過優化,使用的內存很少。編譯工具鏈(例如 Jack)將 Java 源代碼編譯爲 DEX 字節碼,使其可在 Android 平臺上運行。

ART 的部分主要功能包括:

  • 預先 (AOT) 和即時 (JIT) 編譯
  • 優化的垃圾回收 (GC)
  • 更好的調試支持,包括專用採樣分析器、詳細的診斷異常和崩潰報告,並且能夠設置監視點以監控特定字段

在 Android 版本 5.0(API 級別 21)之前,Dalvik 是 Android Runtime。如果您的應用在 ART 上運行效果很好,那麼它應該也可在 Dalvik 上運行,但反過來不一定。

Android 還包含一套核心運行時庫,可提供 Java API 框架使用的 Java 編程語言大部分功能,包括一些 Java 8 語言功能。

硬件抽象層 (HAL)

官方解釋:
硬件抽象層 (HAL) 提供標準界面,向更高級別的 Java API 框架顯示設備硬件功能。HAL 包含多個庫模塊,其中每個模塊都爲特定類型的硬件組件實現一個界面,例如相機或藍牙模塊。當框架 API 要求訪問設備硬件時,Android 系統將爲該硬件組件加載庫模塊。

Linux 內核

依靠 Linux 內核來執行底層功能,比如驅動等。

從平臺框架圖中我們不難看出一般的app開發人員只要用到的是Java API Fragmework,部分會用到Native C/C++ Libraries,系統開發人員纔會用到Linux 內核這一層,所以到底學習哪部分因人而異,比如我平時的工作就是app開發,不會涉及到底層,所以就學習Java API Fragmework,有人又說了Java API Fragmework怎麼入手呢?從哪看起呢?我個人覺得學習源代碼是爲解決我們工作中遇到的問題,而不是爲了看代碼而看代碼,那你很快就會失去興趣。所以我們看代碼時要解決以下幾個問題:

  • 目標:你看代碼的目標是什麼?你要明確你的目的。
  • 取捨:開代碼時千萬不要扎進去出不來,源代碼太複雜了,很有可能一進去就出不來了,所以要有取捨,有寫東西暫時不明白就記住,不一定非要理解原理。
  • 輸出:看了代碼有什麼問題一定要通過demo實驗出來,明白了一部分也要demo出來。多看多些才能進步更快。

舉個例子來說有一個自定義View,這個時候我們要怎麼解決這個問題呢?

  • 先到網上查找相關資料,可能解決也可能未解決。
  • 不管是否解決我們都應該瞭解自定義View的基本不住。
  • 這個時候我們在看下系統自帶View的實現。
  • 完善我們自己的View

其實總結起來就是先會用然後再瞭解基本原理。

希望這篇文章能夠幫助到大家,後面我們就會先從Android UI開始學起。