Android系統源代碼分析步驟

目前,互聯網行業正在朝着移動互聯網方向強勁地發展,而移動互聯網的發展離不開背後的移動平臺的支撐。衆所周知,現在在移動平臺市場上,蘋果的iOS、谷歌的Android和微軟的Windows Phone系統已經造成了三足鼎立的形勢,而Android系統的市場佔有率是最高的。Android系統之因此可以在市場上佔據着第一的位置,一來是由於它依託着谷歌的品德效應和技術實力,二來是由於它是開放的,任何人均可以獲得它的源代碼,而且可以自由地使用它。既然Android系統是開放的,做爲一個移動平臺開發人員來講,固然但願可以深刻地去分析和研究它的源代碼了,然而,Android系統的源代碼很是龐大,咱們須要按部就班地去學習。 html

工欲善其事,必先利其器。爲了全面、深刻地理解Android系統的源代碼,在正式進入Android系統源代碼的世界前,咱們手頭上須要準備好一些參考資料以及實驗環境,此外,還須要瞭解Android系統的架構知識。 android

參考資料

Android系統的源代碼很是龐大和複雜,咱們不能貿然進入,不然很容易在裏面迷入方向,進而失去研究它的信心。咱們應該在分析它的源代碼以前學習好一些理論知識,下面就介紹一些與Android系統相關的資料。 算法

咱們知道,Android系統是基於Linux內核來開發的,在分析它在運行時庫層的源代碼時,咱們會常常碰到諸如管道(pipe)、套接字(socket)和虛擬文件系統(VFS)等知識。此外,Android系統還在Linux內核中增長了一些專用的驅動程序,例如用於日誌系統的Logger驅動程序、用於進程間通訊的Binder驅動程序和用於輔助內存管理的匿名共享內存Ashmem驅動程序。在分析這些Android專用驅動程序的時候,也會碰到Linux內核中與進程、內存管理相關的數據結構。所以,咱們有必要掌握一些Linux內核的基礎知識,下面就介紹四本典經的Linux內核書籍。 編程

這本書的做者是Robert Love,目前最新的版本是第3版。這本書對Linux內核的設計和實現提供了一個總覽視圖,從概念上對Linux內核的各個子系統的設計目標和實現思路進行了清晰的描述,很是適合初學者閱讀。若是從軟件工程的角度來看,這本書就至關因而Linux內核的概要設計文檔。 ubuntu

這本書的做者是Daniel P. Bovet和Marco Cesati,目前最新的版本是第3版。這本書對Linux內核的實現提供了更多的細節,詳細地描述了內核開發中用到的重要數據結構、算法以及編程技巧,很是適合中高級讀者閱讀。若是從軟件工程的角度來看,這本書就至關因而Linux內核的詳細設計文檔。 數據結構

這本書的做者是Jonathan Corbet, Alessandro Rubini和Greg Kroah-Hartman,目前最新的版本是第3版。這本書更加註重實際操做,它詳細地講解了Linux內核驅動程序的實現原理和實現方法,讀者能夠跟着它來實際地編寫出本身的Linux驅動程序。閱讀了這本書以後,對咱們後續去分析Android的專用驅動程序是有很是大的幫助的。 架構

這本書的做者是毛德操和胡希明,是中國人本身編寫的一本經典的Linux內核書籍。這本書最大的特色是從使用情景出發,對Linux內核的源代碼做了詳細的分析,幫助讀者把枯燥無味的源代碼給理順了。 框架

  1. Linux Kernel Development.
  2. Understanding the Linux Kernel.
  3. Linux Device Drivers.
  4. Linux內核源代碼情景分析

掌握了Linux內核的基礎知識以後,還不宜立刻就去分析Android系統的源代碼,由於這樣作是漫無目的的,咱們應該帶着問題或者目標去分析Android系統的源代碼。要把問題或者目標挖掘出來,最好的方法就莫過因而在Android平臺上編寫本身的應用程序了。經過編寫應用程序,咱們能夠知道Android平臺都提供了哪些功能,進而咱們就會想去了解這些功能是怎麼實現的,這樣就能夠達到帶着問題或者目標去分析Android系統的源代碼了。這裏介紹兩個Android應用程序開發教程的書籍: less

  1. Professional Android 2 Application Development.
  2. Google Android SDK開發範例大全.

這兩本書都使用了大量的例子來講明如何使用Android SDK來開發Android應用程序。讀者能夠根據實際狀況來練習一下,主要掌握Android應用程序四大組件(Activity、Service、Broadcast Receiver和Content Provider)的用法,由於Android系統的整個架構和實現就是爲了向開發者提供這四大組件來實現各類各樣的應用程序的。在學習的過程當中,若是遇到其它問題,還能夠參考官方文檔,其網址爲:http://developer.android.com/index.html socket

環境搭建

開發Android應用程序能夠在兩種環境下進行,一是在Android SDK環境下進行,通常是集成在Eclipse裏面進行開發,二是在Android源代碼工程環境下進行,在這種環境進行開發的好處是可使用一些在SDK中不公開的接口。可是若是咱們要修改Android系統的源代碼,或者爲Android系統增長新的功能接口,那麼就只能在Android源代碼工程環境下進行了。因爲咱們的目的是對Android系統源代碼進行分析,所以,咱們在開發Android應用程序時,也在Android源代碼環境下進行。這樣,咱們就須要搭建一套Android源代碼工程環境了。

目前,Android源代碼工程環境只能在Linux平臺上使用,而Linux系統的發行版本比較多,這裏咱們推薦Ubuntu系統。Ubuntu系統是免費的,並且很是易於使用,安裝和更新應用程序也很是方便,它的官方下載地址爲:http://www.ubuntu.com/

安裝好Ubuntu系統以後,咱們就能夠在上面下載、編譯和安裝Android源代碼了,具體方法和步驟能夠參考下面這篇文章:在Ubuntu上下載、編譯和安裝Android最新源代碼

Android系統的源代碼工程默認是不包含Linux內核源代碼的,若是咱們須要修改Android系統的內核或者在裏面增長新的模塊,那麼就要把Android內核源代碼一塊兒下載、編譯和安裝了,具體方法和步驟能夠參考下面這篇文章:在Ubuntu上下載、編譯和安裝Android最新內核源代碼(Linux Kernel)

Android源代碼工程環境搭建好了以後,咱們就能夠在裏面開發新的應用程序或者修改系統代碼了。增長了新的應用程序或者修改了系統的代碼以後,不須要從新編譯整個源代碼工程,只要單獨編譯有改動的模塊就能夠了,具體方法能夠參考下面這篇文章:如何單獨編譯Android源代碼中的模塊

對於已經開發好的應用程序或者系統功能,若是想把看成Demo展現給客戶來體驗時,咱們既能夠在真機上面運行,也能夠在模擬器(Android源代碼工程環境或者Android SDK環境都集成了模擬器)上面運行。當咱們手頭上沒有真機,並且咱們又不想把整個Android源代碼工程環境或者Android SDK環境帶去展現咱們的Demo時,就能夠考慮把模擬器這兩個環境中獨立出來了,具體方法能夠參考下面這篇文章:製做可獨立分發的Android模擬器

系統架構

Android系統是按層次、分模塊來設計的。在咱們着手對Android系統的源代碼進行分析前,須要對Android系統的架構有一個整體的認識,這樣咱們就可以快速地知道哪些代碼位於哪一個層次上的哪一個模塊中,節省搜索代碼的時間,把更多的精力投入在源代碼的分析上去。

整個系統劃份內核空間和用戶空間兩部分。內核空間包含了進程管理、內存管理以及設備驅動程序模塊等,其中Android專用驅動Binder、Logger和Ashmem就是在內核空間實現的。用戶空間包含了硬件抽象層(HAL)、外部庫和運行時庫層(External Libraries & Android Runtime)、應用程序框架層(Application Framework)和應用程序層(Applications)四個層次。咱們應該如何去掌握這個層次結構呢?最好的方法就是從學習Android的硬件抽象層做爲切入點了。

可能讀者會以爲比較奇怪,爲何要把Android系統的硬件抽象層做爲學習Android系統架構的切入點呢?這個層次由於涉及到硬件,看起來這是一個比較複雜和深奧的知識點。其實否則,Android系統的硬件抽象層在實現和使用上,層次都是很是清晰的,它從上到下涵蓋了Android系統的用戶空間和內核空間。內核空間主要就是涉及到硬件驅動程序,而用戶空間就涉及到了Android系統應用程序層、應用程序框架層和系統運行時庫層的相關知識。所以,學習Android系統的硬件抽象層,可使讀者快速地認識整個Android系統,從而對Android系統獲得一個感性的認識,爲後面深刻分析Android系統的源代碼打下良好的基礎。

Android硬件抽象層的學習能夠參考下面的一系列文章:

學會了編寫基本的Android應用程序而且對Android系統的總體架構有一個大概的瞭解以後,咱們就能夠去分析Android系統的源代碼了。

在分析Android源代碼的過程當中,咱們常常進入到應用程序框架層去分析它的源代碼,而在應用程序框架層中,有一部分代碼是使用C++來實現的,這時候就會常常碰到智能指針,所以,咱們把Android系統中的智能指針也做爲一個基礎知識點來學習。相信使用過C++語言來作開發的讀者對智能指針不會感到陌生。用C++來寫代碼最容易出錯的地方就是指針了,一旦使用不當,輕則形成內存泄漏,重則形成系統崩潰,所以,系統爲咱們提供了智能指針,避免出現上述問題。

在Android系統中,提供了三種類型的智能指針,分別是輕量級指針、強指針和弱指針,它們都是基於對象引用計數技術來實現的。輕量級指針的計數技術比較簡單,只要對象的引用計數值爲0,它就會被釋放。強指針和弱指針的計數技術相對比較複雜,一個對象能夠同時被強指針和弱指針引用,可是這個對象的生命週期通常只受強指針的控制,即當這個對象的強引用計數爲0的時候,這個對象就被釋放了,即便這時候這個對象的弱引用計數不爲0。引進強指針和弱指針這種複雜的引用計數技術是爲了解決垃圾收集(Garbage Collection)問題而提出的。考慮這樣的一個場景,系統中有兩個對象A和B,在對象A的內部引用了對象B,而在對象B的內部也引用了對象A。當兩個對象A和B都再也不使用時,垃圾收集系統會發現沒法回收這兩個對象的所佔據的內存的,由於系統一次只能收集一個對象,而不管系統決定要收回對象A仍是要收回對象B時,都會發現這個對象被其它的對象所引用,於是就都回收不了,這樣就形成了內存泄漏。若是採用強指針和弱指針技術,這個問題就迎刃而解了,即A和B都用弱指針來引用對方。Android智能指針的學習,能夠參考下面這篇文章: Android系統的智能指針(輕量級指針、強指針和弱指針)的實現原理分析

掌握了本文所介紹的這些基礎知識後,咱們就能夠正式開始分析Android系統的源代碼了。

相關文章
相關標籤/搜索