Camera服务之--架构浅析
一.應用層
Camera?的應用層在Android?上表現(xiàn)為直接調用SDK API?開發(fā)的一個Camera?應用APK?包。代碼在/android/packages/apps/Camera?下。主要對 android.hardware.Camera(在Framework中) 類的調用,并且實現(xiàn)Camera?應用的業(yè)務邏輯和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?服務,設置拍攝參數(shù),開始、停止預覽,拍照等。
2.android.hardware.Camera這個類是和JNI中定義的類是一個,有些方法通過JNI的方式調用本地代碼得到,有些方法自己實現(xiàn)。?
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/av/camera/下5個文件。
Camera.cpp
CameraParameters.cpp
ICamera.cpp
ICameraClient.cpp
ICameraService.cpp
它們的頭文件在/android/frameworks/av/include/camera目錄下。
這部分的內容編譯生成libcamera_client.so?。在Camera?模塊的各個庫中,libcamera_client.so 位于核心的位置,作為Camera?框架的 Client?客戶端部分,與另外一部分內容服務端?libcameraservice.so?通過進程間通訊(即Binder?機制)的方式進行通訊。
4.Camera框架的service部分:
代碼位置:/frameworks/av/services/camera/libcameraservice/。
這部分內容被編譯成庫libcameraservice.so?。CameraService?是Camera?服務,Camera?框架的中間層,用于鏈接CameraHardwareInterface?和Client部分 ,它通過調用實際的Camera?硬件接口來實現(xiàn)功能,即下層HAL層。
?
三.硬件抽象層HAL Hardware Abstraction Layer
這個層次其實就是用戶空間的驅動代碼。前面有介紹過框架層對下在CameraHardwareInterface.h(/android/frameworks/av/services/camera/libcameraservice/device1/CameraHardwareInterface.h)。 頭文件中定義了 Camera?硬件抽象層的接口,它是包含純虛函數(shù)的類,必須被實現(xiàn)類繼承才能使用。HAL?層正好繼承 CameraHardwareInterface?接口,依據(jù)V4l2?規(guī)范實例化底層硬件驅動,使用ioctl?方式調用驅動,最終生成 libcamera.so?供框架的libcameraservice.so?調用。
這層的代碼在/android/hardware/XXX?/libcamera?目錄下(也有可能在vendor?目錄中對應的 libcamera?下)。注意這里的XXX?是不同廠商為不同產(chǎn)品(板子)而建的目錄,以高通msm?平臺為例,這里XXX?用msm7k?表示,這樣 高通msm?平臺下這個HAL?的目錄即為/android/hardware/msm7k/libcamera?。不難看出,如果要在某硬件平臺上運行 Android?,也就主要在這一層進行修改,因為它是直接和底層硬件驅動相關的。上面也講過,應用框架層對上對下都定義的標準接口,這樣做的目的也就是 使上層的代碼獨立,在porting?中不受影響。所以我們現(xiàn)在可以基本確定,如果要改Camera?的硬件,框架層以上的部分都可以不動,要改就改 HAL?到內核層的部分,這也是Android?底層開發(fā)的主要工作。
四.Driver層
這一層主要是基于Linux?的設備驅動。對Camera?來說,一般是按V4l2?規(guī)范將Camera?原子功能以ioctl?的形式暴露出來供 HAL?層調用的實現(xiàn)。
主要功能的實現(xiàn)代碼在/android/kernel/drivers/media/video/XXX?下。跟HAL?層目錄一 樣,XXX?是不同廠商不同平臺的目錄,以高通msm?平臺為例,這個目錄就是/android/kernel/drivers/media/video /msm?。所以要在Android?平臺上添加硬件功能,首先考慮將它的驅動加到Android?的Linux?內核中。
原文地址:http://www.cnblogs.com/senior-engineer/p/4882456.html
總結
以上是生活随笔為你收集整理的Camera服务之--架构浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android插件化原理解析——概要
- 下一篇: Android Camera架构分析