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