l 應用框架層java
Camera框架層將應用與底層的實現隔離開來,實現了一套Android定義的對上對下接口規範,方便應用及底層硬件的開發和移植。這一層對上以Java類的形式包裝出android.hardware.Camera,提供給應用層調用;對下在CameraHardwareInterface.h頭文件中定義了Camera硬件抽象層的接口,這是一個包含純虛函數的類,必須被實現類繼承才能使用。這個實現類也便是下層中將講到的用戶庫層,它繼承CameraHardwareInterface接口,實例化對底層硬件驅動的封裝,最終生成libcamera.so供框架的libcameraservice.so調用。這樣作的好處是讓Camera的應用框架代碼獨立,不受底層硬件驅動改變的影響,方便在不一樣平臺上porting 驅動代碼,而保持上層的代碼不用變化。
android
從代碼上看,這一層包含Java到JNI到C++的代碼。源代碼主要在如下路徑:
框架
\android\frameworks\base\core\java\android\hardware\Camera.javaide
這個類做爲Android SDK Camera部分提供給上層應用,並經過JNI的方式調用本地C++代碼。
函數
\android\frameworks\base\core\jni\android_hardware_Camera.cppui
Camera 的JAVA本地調用部分,是承接JAVA代碼到C++代碼的橋樑。編譯生成libandroid_runtime.so。
spa
\android\frameworks\base\libs\ui 包含文件:server
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
CameraService是Camera服務,Camera框架的中間層,用於連接CameraHardwareInterface 和 Client,它經過調用實際的Camera硬件接口來實現功能。這部份內容被編譯成庫libcameraservice.so。
libandroid_runtime.so和libui.so兩個庫是公用的,其中除了Camera還有其餘方面的功能。整個Camera在運行的時候,能夠大體上分紅Client和Server兩個部分,它們分別在兩個進程中運行,它們之間使用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平臺爲例,這裏XXX用msm7k表示,這樣高通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平臺上添加硬件功能,首先考慮將它的驅動加到Android的Linux內核中。
後記
至此,已將Camera各層在Android中的分佈作了簡單介紹。依此類推,Android上其餘模塊也跟Camera同樣有相似的結構分層,如MediaPlayer。在瞭解了這樣的結構後,對咱們開發有必定的指導意義,使咱們清楚若是對已有模塊的功能添加和修改通常應在哪些個層次進行,哪些代碼不用改,哪些代碼要改。
鑑於本人水平有限,若有寫的錯誤或不周全的地方,請包含。