天天看點

Android系統源碼學習步驟

  Android系統是基于Linux核心來開發的,在分析它在運作時庫層的源代碼時,我們會經常碰到諸如管道(pipe)、套接字(socket)和虛拟檔案系統(VFS)等知識。

  此外,Android系統還在Linux核心中增加了一些專用的驅動程式,例如用于日志系統的Logger驅動程式、用于程序間通信的Binder驅動程式和用于輔助記憶體管理的匿名共享記憶體Ashmem驅動程式。在分析這些Android專用驅動程式的時候,也會碰到Linux核心中與程序、記憶體管理相關的資料結構。

  是以,我們有必要掌握一些Linux核心的基礎知識,下面就介紹四本典經的Linux核心書籍。

Linux Kernel Development.

作者是Robert Love。這本書對Linux核心的設計和實作提供了一個總覽視圖,從概念上對Linux核心的各個子系統的設計目标和實作思路進行了清晰的描述,非常适合初學者閱讀。如果從軟體工程的角度來看,這本書相當于Linux核心的概要設計文檔。

Understanding the Linux Kernel.

作者是Daniel P. Bovet和Marco Cesati。這本書對Linux核心的實作提供了更多的細節,詳細地描述了核心開發中用到的重要資料結構、算法以及程式設計技巧,非常适合中進階讀者閱讀。如果從軟體工程的角度來看,這本書相當于Linux核心的詳細設計文檔。

Linux Device Drivers.

作者是Jonathan Corbet, Alessandro Rubini和Greg Kroah-Hartman。這本書更加注重實際操作,它詳細地講解了Linux核心驅動程式的實作原理和實作方法,讀者可以跟着它來實際地編寫出自己的Linux驅動程式。閱讀了這本書之後,對我們後續去分析Android的專用驅動程式是有非常大的幫助的。

Linux核心源代碼情景分析

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

  掌握了Linux核心的基礎知識之後,還不宜馬上就去分析Android系統的源代碼,因為這樣做是漫無目的的,我們應該帶着問題或者目标去分析Android系統的源代碼。要把問題或者目标挖掘出來,最好的方法就莫過于是在Android平台上編寫自己的應用程式了。通過編寫應用程式,我們可以知道Android平台都提供了哪些功能,進而我們就會想去了解這些功能是怎麼實作的,這樣就可以達到帶着問題或者目标去分析Android系統的源代碼了。這裡介紹兩個Android應用程式開發教程的書籍:

Professional Android 2 Application Development.

Google Android SDK開發範例大全.

  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硬體抽象層的學習可以參考下面的一系列文章:

<a href="http://blog.csdn.net/luoshengyang/article/details/6567257">Android硬體抽象層(HAL)概要介紹和學習計劃</a>

<a href="http://blog.csdn.net/luoshengyang/article/details/6568411">在Ubuntu上為Android系統編寫Linux核心驅動程式</a>

<a href="http://blog.csdn.net/luoshengyang/article/details/6571210">在Ubuntu上為Android系統内置C可執行程式測試Linux核心驅動程式</a>

<a href="http://blog.csdn.net/luoshengyang/article/details/6573809">在Ubuntu上為Android增加硬體抽象層(HAL)子產品通路Linux核心驅動程式</a>

<a href="http://blog.csdn.net/luoshengyang/article/details/6575988">在Ubuntu為Android硬體抽象層(HAL)子產品編寫JNI方法提供Java通路硬體服務接口</a>

<a href="http://blog.csdn.net/luoshengyang/article/details/6578352">在Ubuntu上為Android系統的Application Frameworks層增加硬體通路服務</a>

<a href="http://blog.csdn.net/luoshengyang/article/details/6580267">在Ubuntu上為Android系統内置Java應用程式測試Application Frameworks層的硬體服務</a>

  學會了編寫基本的Android應用程式并且對Android系統的整體架構有一個大概的了解之後,我們就可以去分析Android系統的源代碼了。

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

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

  開發Android應用程式可以在兩種環境下進行,一是在Android SDK環境下進行,一般是內建在Eclipse裡面進行開發,二是在Android源代碼工程環境下進行,在這種環境進行開發的好處是可以使用一些在SDK中不公開的接口。但是如果我們要修改Android系統的源代碼,或者為Android系統增加新的功能接口,那麼就隻能在Android源代碼工程環境下進行了。由于我們的目的是對Android系統源代碼進行分析,是以,我們在開發Android應用程式時,也在Android源代碼環境下進行。這樣,我們就需要搭建一套Android源代碼工程環境了。

轉自: http://www.cnblogs.com/xiaoran1129/archive/2012/11/02/2751446.html 

繼續閱讀