Android 源碼分析之旅1 系統架構與分析方法、工具

本篇文章已受權微信公衆號 guolin_blog (郭霖)獨家發佈 本人小楠——一位勵志的Android開發者。html

我的公衆號:android

公衆號:Android開發進階

###《Android 源碼分析之旅》目錄面試

ape_fwk_all.png

《Android 源碼分析之旅》的所有目錄將做以下安排:設計模式

  1. 第1章節——本篇文章,將介紹一些基本的概念、方法、工具。
  2. 第2章節——着重介紹Binder IPC機制。由於Android Framework中充斥着進程間通訊的過程,所以這裏提早學習。
  3. 第3章節——介紹一些Android常見源碼分析。
  4. 第4章節——着重介紹HAL層的相關知識。
  5. 後續慢慢補充。。。

###爲何要學習Android源碼?微信

不少讀者,尤爲是初學者特別抗拒去看源碼,這裏我說明一下爲何要進行源碼分析。其中包括下面一些好處:架構

  1. 學習Android源碼有助於咱們學習其中的設計模式、思想、架構。
  2. 熟悉整個源碼的架構,有助於咱們更加正確地調用Android提供的SDK,寫出高效正確的代碼。
  3. 學習源碼有助於咱們面試,由於大公司都喜歡問這些。
  4. 學習源碼有助於咱們學習一些黑科技,好比學習插件化的從時候咱們須要學習Hook機制,可是學習Hook機制的時候咱們須要掌握Activity的啓動流程、消息機制等等機制。

我我的以爲,只懂得去調用API,跟掌握API底層的實現,這是一個碼農跟高級工程師的區別。只會用API天天只能作不少重複性的工做,可是學習了源碼之後,咱們可以作到不少原生API作不到的事情,這就是咱們所說的黑科技,這樣可以讓咱們的知識面更加普遍,由於,即便一我的天資再好也罷,若是他的見識面不夠普遍,不少東西(好比說熱更新、插件化、NDK)沒有接觸過的話,永遠只能停留在他所到達的瓶頸上面。對於像本人同樣在作系統APP、系統Framework層開發和定製來講源碼可能比較重要,可是這並不意味着作第三方APP的時候就不重要。固然,學習源碼須要有必定的耐心,也可能須要你在分析的過程當中去畫一些圖(圖片更加直觀)、花額外的時間去學習源碼用到的設計模式等等,學習源碼是一個比較痛苦的事情,由於你會發現掌握了源碼並不意味者你就可以一步登天。可是隨着親們慢慢地掌握了整個Android的系統架構的時候,相信你不會後悔當初本身的付出。由於我一直都相信,付出一定會有所收穫。框架

這裏扯個題外話,剛剛提到NDK,我以爲NDK也是一塊比較重要的模塊,它可以利用C/C++來實現Java實現不了,或者用Java去實現的時候效率很低的事情,好比說QQ的變聲功能、全民K歌的音頻混合、視頻處理、直播等等,因此有時間的話我將會寫一些關於NDK的文章。模塊化

###前言工具

最近一直在維護系統相機APP,打算研究和補充一下HAL層的相關知識。藉此契機,打算重構一下這個《Android源碼分析之旅》的文集,接下來會補充一些總體系統架構、UML(類圖、時序圖)、其餘方面的源碼分析等知識。源碼分析

###Android系統架構

談到Android系統架構,不少人第一反應可能就是這張最經典的圖片:

舊版本的Android系統架構.jpg

可是,上面這張圖已通過時了,由於Android系統架構中增長了HAL層,新的架構能夠在source.android.com中看到:

ape_fwk_all.png

根據上圖,Android系統架構從上往下分別是:

  1. 應用框架:應用框架最常被應用開發者使用。做爲硬件開發者,咱們應該很是瞭解開發者 API,由於不少此類 API 均可直接映射到底層 HAL 接口,並可提供與實現驅動程序相關的實用信息。
  2. Binder IPC:Binder 進程間通訊 (IPC) 機制容許應用框架跨越進程邊界並調用 Android 系統服務代碼,從而使得高級框架 API 能與 Android 系統服務進行交互。在應用框架級別,開發者沒法看到此類通訊的過程,但一切彷佛都在「循序漸進地運行」。
  3. 系統服務:應用框架 API 所提供的功能可與系統服務通訊,以訪問底層硬件。服務是集中的模塊化組件,例如窗口管理器、搜索服務或通知管理器。Android 包含兩組服務:「系統」(諸如窗口管理器和通知管理器之類的服務)和「媒體」(與播放和錄製媒體相關的服務)。
  4. 硬件抽象層 (HAL):硬件抽象層 (HAL) 會定義一個標準接口以供硬件供應商實現,並容許 Android 忽略較低級別的驅動程序實現。藉助 HAL,咱們能夠順利實現相關功能,而不會影響或無需更改更高級別的系統。HAL 實現會被封裝成模塊 (.so) 文件,並會由 Android 系統適時地加載。
  5. Linux 內核:開發設備驅動程序與開發典型的 Linux 設備驅動程序相似。Android 使用的 Linux 內核版本包含一些特殊的補充功能,例如:喚醒鎖(這是一種內存管理系統,可更主動地保護內存)、Binder IPC 驅動程序以及對移動嵌入式平臺很是重要的其餘功能。這些補充功能主要用於加強系統功能,不會影響驅動程序開發。咱們可使用任一版本的內核,只要它支持所需功能(如 Binder 驅動程序)。不過,建議使用 Android 內核的最新版本。

其中,HAL層常見的模塊有:

ape_fwk_hal.png

######細節

  1. Android Framework:包含了HAL層以上的全部層,指的是整個系統的框架。對應AOSP中的framework文件夾。
  2. Application Framework:更多的指是API相關的,屬於應用程序這邊的框架。好比Activity、ActivityThread等,而不包含AMS。
  3. Android Framework包含了Java實現部分以及C/C++(native)實現部分。之後在分析Camera源碼的時候會有所體現。

###源碼的下載與查看、工具介紹

須要準備的工做:

  1. Ubuntu/Mac系統下,推薦使用Android Studio進行查看。
  2. Windows系統下,推薦使用Source Insight進行查看。
  3. UML建模工具:推薦使用Start UML,用於畫類圖以及時序圖。
  4. 下載源碼,推薦下面文章中使用網盤下載的方式。

參考文章以下:

關於源碼的下載與導入查看的參考文章:

www.cnblogs.com/Napoleon-Wa…

關於Source Insight的使用:

blog.csdn.net/shulianghan…

關於UML建模的知識:

www.jianshu.com/p/a0704aa2b…

###源碼分析方法與經驗

關於源碼架構的介紹,參考下面的文章:

blog.csdn.net/itachi85/ar…

從頂層到底層,Android源碼是十分龐大與複雜的,這裏推薦一些源碼分析的經驗:

  1. 先結合官網等資料對整個Android系統作一個總體的把握,而後進行具體學習,接着持續迭代學習過程。
  2. 使用Source Insight/Android Studio等高效率的工具看源碼、進行代碼的跟蹤,必要的時候進行Debug。
  3. 結合UML建模,畫類圖/時序圖,避免思路混亂。
  4. 推薦「囫圇吞棗」式的學習,先粗略學習,而後細節深刻。囫圇吞棗在這裏並非說不求甚解,這裏的囫圇吞棗是要知道「吞了幾個」,未來本身須要的時候再進行補充。跳躍式的學習、漸進式學習相結合。
  5. 先頂層,再到底層,從經常使用的系統級API或者插件級API進行入手學習。

若是以爲個人文字對你有所幫助的話,歡迎關注個人公衆號:

公衆號:Android開發進階

個人羣歡迎你們進來探討各類技術與非技術的話題,有興趣的朋友們加我私人微信huannan88,我拉你進羣交(♂)流(♀)

相關文章
相關標籤/搜索