1. 程式人生 > >Camera服務之--架構淺析

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 核心中。