Camera服務之--架構淺析

一.應用層

Camera 的應用層在Android 上表現爲直接調用SDK API 開發的一個Camera 應用APK 包。代碼在/android/packages/apps/Camera 下。主要對 android.hardware.Camera(在Framework中) 類的調用,並且實現Camera 應用的業務邏輯和UI 顯示。一個Android 應用中若要使用這個android.hardware.Camera類,需要在Manifest 文件聲明Camera 的權限,另外還 需要添加一些<uses-feature> 元素來聲明應用中的Camera 特性,如自動對焦等。 具體做法可如下:

<uses-permission android:name = "android.permission.CAMERA" />

<uses-feature android:name = "android.hardware.camera" />

<uses-feature android:name = "android.hardware.camera.autofocus" />

二.Framework層

1.android.hardware.Camera:代碼位置/android/frameworks/base/core/java/android/hardware/Camera.java

這部分目標是framework.jar。這是是Android 提供給app層調用的java接口。這個類用來連接或斷開一個Camera 服務,設置拍攝參數,開始、停止預覽,拍照等。

2.android.hardware.Camera這個類是和JNI中定義的類是一個,有些方法通過JNI的方式調用本地代碼得到,有些方法自己實現。 
Camera的JAVA native調用部分(JNI):/android/frameworks/base/core/jni/android_hardware_Camera.cpp。Camera.java 承接JAVA 代碼到C++ 代碼的橋樑。編譯生成libandroid_runtime.so 。libandroid_runtime.so庫是公用的, 其中除了Camera 還有其他方面的功能。

3.Camera框架的client部分:

代碼位置:/android/frameworks/base/libs/camera/下5個文件。

Camera.cpp

CameraParameters.cpp

ICamera.cpp

ICameraClient.cpp

ICameraService.cpp

它們的頭文件在/android/frameworks/base/include/camera目錄下。

這部分的內容編譯生成libcamera_client.so 。在Camera 模塊的各個庫中,libcamera_client.so 位於核心的位置,作爲Camera 框架的 Client 客戶端部分,與另外一部分內容服務端 libcameraservice.so 通過進程間通訊(即Binder 機制)的方式進行通訊。

4.Camera框架的service部分:

代碼位置:/android/frameworks/base/services/camera/libcameraservice。

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



三.硬件抽象層HAL Hardware Abstraction Layer

這個層次其實就是用戶空間的驅動代碼。前面有介紹過框架層對下在CameraHardwareInterface.h(/android/frameworks/base/include/camera/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 底層開發的主要工作。

四.Driver層

這一層主要是基於Linux 的設備驅動。對Camera 來說,一般是按V4l2 規範將Camera 原子功能以ioctl 的形式暴露出來供 HAL 層調用的實現。

主要功能的實現代碼在/android/kernel/drivers/media/video/XXX 下。跟HAL 層目錄一 樣,XXX 是不同廠商不同平臺的目錄,以高通msm 平臺爲例,這個目錄就是/android/kernel/drivers/media/video /msm 。所以要在Android 平臺上添加硬件功能,首先考慮將它的驅動加到Android 的Linux 內核中。

發佈了53 篇原創文章 · 獲贊 12 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章