1. 程式人生 > >如何學習Android的原始碼

如何學習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開始學起。