1. 程式人生 > 實用技巧 >Android Camera 架構簡析2

Android Camera 架構簡析2

>>> hot3.png

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。在瞭解了這樣的結構後,對我們開發有一定的指導意義,使我們清楚如果對已有模組的功能新增和修改一般應在哪些個層次進行,哪些程式碼不用改,哪些程式碼要改。

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

轉載於:https://my.oschina.net/jerikc/blog/76300