Android Camera 架構簡析2

Android Camera 架構簡析2

      接上一節Android Camera 架構簡析1談到的Android Camera結構,下面繼續分析。

l        應用框架層

Camera框架層將應用與底層的實現隔離開來,實現了一套Android定義的對上對下接口規範,方便應用及底層硬件的開發和移植。這一層對上以Java類的形式包裝出android.hardware.Camera,提供給應用層調用;對下在CameraHardwareInterface.h頭文件中定義了Camera硬件抽象層的接口,這是一個包含純虛函數的類,必須被實現類繼承才能使用。這個實現類也即是下層中將講到的用戶庫層,它繼承CameraHardwareInterface接口,實例化對底層硬件驅動的封裝,最終生成libcamera.so供框架的libcameraservice.so調用。這樣做的好處是讓Camera的應用框架代碼獨立,不受底層硬件驅動改變的影響,方便在不同平臺上porting 驅動代碼,而保持上層的代碼不用變化。

從代碼上看,這一層包含JavaJNIC++的代碼。源代碼主要在以下路徑:

\android\frameworks\base\core\java\android\hardware\Camera.java

這個類作爲Android SDK Camera部分提供給上層應用,並通過JNI的方式調用本地C++代碼。

\android\frameworks\base\core\jni\android_hardware_Camera.cpp

Camera JAVA本地調用部分,是承接JAVA代碼到C++代碼的橋樑。編譯生成libandroid_runtime.so

\android\frameworks\base\libs\ui 包含文件:

Camera.cpp

CameraParameters.cpp

ICamera.cpp

ICameraClient.cpp

ICameraService.cpp

它們的頭文件在\android\frameworks\base\include\ui目錄下。

這部分的內容編譯生成libui.so。在Camera模塊的各個庫中,libui.so位於核心的位置,作爲Camera框架的Client客戶端部分,與另外一部分內容服務端

libcameraservice.so通過進程間通訊(即Binder機制)的方式進行通訊。

\android\frameworks\base\camera\libcameraservice

CameraServiceCamera服務,Camera框架的中間層,用於鏈接CameraHardwareInterface Client,它通過調用實際的Camera硬件接口來實現功能。這部分內容被編譯成庫libcameraservice.so

libandroid_runtime.solibui.so兩個庫是公用的,其中除了Camera還有其他方面的功能。整個Camera在運行的時候,可以大致上分成ClientServer兩個部分,它們分別在兩個進程中運行,它們之間使用Binder機制實現進程間通訊。這樣在client調用接口,功能則在server中實現,但是在client中調用就好像直接調用server中的功能,進程間通訊的部分對上層程序不可見。

以上應用層到框架層的分析可以用下圖來表示調用流程。

3. Camera調用流程圖

Camera Client端通過Binder機制與Camera Server端通訊,Server端的實現傳遞到Client端。而Server端的實現又是調用硬件接口來實現。這就延伸到我們要介紹的Camera的下一個層次――庫層。

l        庫層(硬件抽象層HAL Hardware Abstraction Layer

這個層次其實就是用戶空間的驅動代碼。前面有介紹過框架層對下在CameraHardwareInterface.h頭文件中定義了Camera硬件抽象層的接口,它是包含純虛函數的類,必須被實現類繼承才能使用。HAL層正好繼承CameraHardwareInterface接口,依據V4l2規範實例化底層硬件驅動,使用ioctl方式調用驅動,最終生成libcamera.so供框架的libcameraservice.so調用。

這層的代碼在\android\hardware\XXX\libcamera目錄下(也有可能在vendor目錄中對應的libcamera下)。注意這裏的XXX是不同廠商爲不同產品(板子)而建的目錄,以高通msm平臺爲例,這裏XXXmsm7k表示,這樣高通msm平臺下這個HAL的目錄即爲\android\hardware\msm7k\libcamera。不難看出,如果要在某硬件平臺上運行Android,也就主要在這一層進行修改,因爲它是直接和底層硬件驅動相關的。上面也講過,應用框架層對上對下都定義的標準接口,這樣做的目的也就是使上層的代碼獨立,在porting中不受影響。所以我們現在可以基本確定,如果要改Camera的硬件,框架層以上的部分都可以不動,要改就改HAL到內核層的部分,這也是Android底層開發的主要工作。這個在後續的文章中會具體介紹。

l        內核層

          這一層主要是基於Linux的設備驅動。對Camera來說,一般是按V4l2規範將Camera原子功能以ioctl的形式暴露出來供HAL層調用的實現。主要功能的實現代碼在\android\kernel\drivers\media\video\XXX下。跟HAL層目錄一樣,XXX是不同廠商不同平臺的目錄,以高通msm平臺爲例,這個目錄就是\android\kernel\drivers\media\video\msm。所以要在Android平臺上添加硬件功能,首先考慮將它的驅動加到AndroidLinux內核中。

後記

      至此,已將Camera各層在Android中的分佈做了簡單介紹。依此類推,Android上其他模塊也跟Camera一樣有類似的結構分層,如MediaPlayer。在瞭解了這樣的結構後,對我們開發有一定的指導意義,使我們清楚如果對已有模塊的功能添加和修改一般應在哪些個層次進行,哪些代碼不用改,哪些代碼要改。

      鑑於本人水平有限,如有寫的錯誤或不周全的地方,請包含。

參考:
http://blog.csdn.net/BonderWu/archive/2010/08/15/5814278.aspx
http://wenku.baidu.com/view/c45c1b4e852458fb770b568c.html
http://www.360doc.com/content/11/0106/16/4915724_84479344.shtml#

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章