需要了解android底层开发,尤其是针对厂商接口对接,我们就需要针对android的HAL层做深入理解,在android的六层架构中,其中HAL层架构在linux驱动层之上,下面我们就来以相机为列做初步了解(官方输出),福利:基础应用开源框架

Android 的相机硬件抽象层 (HAL) 可将 Camera 2 中较高级别的相机框架 API 连接到底层的相机驱动程序和硬件。相机子系统包括相机管道组件的实现,而相机 HAL 则可提供用于实现您的这些组件版本的接口。

注意:如果您要在搭载 Android 8.0 或更高版本的设备上实现相机 HAL,则必须使用 HIDL 接口。要了解旧版组件,请参阅旧版 HAL 组件。

架构

下列图表和列表说明了 HAL 组件:

图 1. 相机架构

应用框架

应用代码位于应用框架级别,它使用 Camera 2 API 与相机硬件进行交互。在内部,此代码会调用相应的 Binder 接口,以访问与该相机互动的原生代码。

AIDL

与 CameraService 关联的 Binder 接口可在 frameworks/av/camera/aidl/android/hardware 中找到。生成的代码会调用较低级别的原生代码以获取对实体相机的访问权限,并返回用于在框架级别创建 CameraDevice 并最终创建 CameraCaptureSession 对象的数据。

原生框架

此框架位于 frameworks/av/ 中,并提供相当于 CameraDevice 和 CameraCaptureSession 类的原生类。另请参阅 NDK camera2 参考。

Binder IPC 接口

IPC binder 接口用于实现跨越进程边界的通信。调用相机服务的 frameworks/av/camera/camera/aidl/android/hardware 目录中有若干个相机 binder 类。 ICameraService 是相机服务的接口;ICameraDeviceUser 是已打开的特定相机设备的接口;ICameraServiceListener 和 ICameraDeviceCallbacks 分别是对应用框架的 CameraService 和 CameraDevice 回调。

相机服务

位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp 下的相机服务是与 HAL 进行互动的实际代码。

HAL

硬件抽象层定义了由相机服务调用且您必须实现以确保相机硬件正常运行的标准接口。

实现 HAL

HAL 位于相机驱动程序和更高级别的 Android 框架之间,并可定义您必须实现的接口,以便应用可以正确地操作相机硬件。从 Android 8.0 开始,相机 HAL 接口是 Project Treble 的一部分,相应的 HIDL 接口在硬件/接口/相机中定义。

典型的绑定式 HAL 必须实现以下 HIDL 接口:

  • ICameraProvider:用于枚举单个设备并管理其状态。
  • ICameraDevice:相机设备接口。
  • ICameraDeviceSession:有效相机设备会话接口。

参考 HIDL 实现适用于 CameraProvider.cpp、CameraDevice.cpp 和 CameraDeviceSession.cpp。该实现会封装仍在使用旧版 API 的旧 HAL。从 Android 8.0 开始,相机 HAL 实现必须使用 HIDL API;不支持使用旧版接口。

要详细了解 Treble 和 HAL 开发,请参阅 Treble 资源。

旧版 HAL 组件

此部分介绍了旧版 HAL 组件的架构以及如何实现 HAL。搭载 Android 8.0 或更高版本的设备上的相机 HAL 实现必须改用 HIDL API(如上所述)。

架构(旧版)

下列图表和列表说明了旧版相机 HAL 组件:

图 1. 相机架构

应用框架

应用代码位于应用框架级别,它利用 android.hardware.Camera API 与相机硬件进行交互。在内部,此代码会调用相应的 JNI 粘合类,以访问与该相机互动的原生代码。

JNI

与 android.hardware.Camera 关联的 JNI 代码位于 frameworks/base/core/jni/android_hardware_Camera.cpp中。此代码会调用较低级别的原生代码以获取对实体相机的访问权限,并返回用于在框架级别创建 android.hardware.Camera 对象的数据。

原生框架

在 frameworks/av/camera/Camera.cpp 中定义的原生框架可提供相当于 android.hardware.Camera 类的原生类。此类会调用 IPC binder 代理,以获取对相机服务的访问权限。

Binder IPC 代理

IPC binder 代理用于促进跨越进程边界的通信。调用相机服务的 frameworks/av/camera 目录中有 3 个相机 binder 类。ICameraService 是相机服务的接口,ICamera 是已打开的特定相机设备的接口,ICameraClient 是返回应用框架的设备接口。

相机服务

位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp 下的相机服务是与 HAL 进行互动的实际代码。

HAL

硬件抽象层定义了由相机服务调用且您必须实现以确保相机硬件正常运行的标准接口。

内核驱动程序

相机的驱动程序可与实际相机硬件以及您的 HAL 实现进行互动。相机和驱动程序必须支持 YV12 和 NV21 图片格式,以便在显示和视频录制时支持预览相机图片。

实现 HAL(旧版)

HAL 位于相机驱动程序和更高级别的 Android 框架之间,并可定义您必须实现的接口,以便应用可以正确地操作相机硬件。HAL 接口在 hardware/libhardware/include/hardware/camera.h 和 hardware/libhardware/include/hardware/camera_common.h 标头文件中定义。

camera_common.h 可定义 camera_module;这是一个标准结构,可用于获取有关相机的一般信息,例如相机 ID 和所有相机通用的属性(例如,摄像头是前置摄像头还是后置摄像头)。

camera.h 包含对应于 android.hardware.Camera 的代码。此标头文件会声明一个 camera_device 结构,该结构又反过来包含一个带函数指针(可实现 HAL 接口)的 camera_device_ops 结构。有关开发者可以设置的相机参数的文档,请参阅 frameworks/av/include/camera/CameraParameters.h。通过 HAL 中的 int (*set_parameters)(struct camera_device *, const char *parms) 来设置这些参数以及指向的函数。

有关 HAL 实现的示例,请参阅 hardware/ti/omap4xxx/camera 中的 Galaxy Nexus HAL 实现。

配置共享库

设置 Android 编译系统,以将 HAL 实现正确打包到共享库中,并通过创建 Android.mk 文件将其复制到相应位置:

  1. 创建一个 device///camera 目录以包含您库的源文件。
  2. 创建一个 Android.mk 文件来编译共享库。确保 Makefile 包含以下行:
     
    LOCAL_MODULE := camera. LOCAL_MODULE_RELATIVE_PATH := hw

    您的库必须命名为 camera.(自动附加 .so),以便 Android 可以正确加载库。例如,请参阅 hardware/ti/omap4xxx/Android.mk 中的 Galaxy Nexus 相机的 Makefile。

  3. 使用您设备的 Makefile 复制 frameworks/native/data/etc 目录中的必要功能 XML 文件,以指定您的设备具有相机功能。例如,要指定您的设备具有相机闪光灯并可自动对焦,请在您设备的 ///device.mk Makefile 中添加以下行:
     
    PRODUCT_COPY_FILES := \ ... PRODUCT_COPY_FILES += \ frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \

    有关设备 Makefile 的示例,请参阅 device/samsung/tuna/device.mk

  4. 在 device///media_profiles.xml 和 device///media_codecs.xml XML 文件中声明您相机的媒体编解码器、格式和分辨率功能。如需了解详情,请参阅将编解码器展示给框架。
  5. 在您设备的 device///device.mk Makefile 中添加以下行,以将 media_profiles.xml 和 media_codecs.xml 文件复制到相应位置:
     
    # media config xml file PRODUCT_COPY_FILES += \ ///media_profiles.xml:system/etc/media_profiles.xml # media codec config xml file PRODUCT_COPY_FILES += \ ///media_codecs.xml:system/etc/media_codecs.xml
  6. 要将相机应用包含在您设备的系统映像中,请在设备的 device///device.mk Makefile 中的 PRODUCT_PACKAGES 变量中指定该应用:
     
    PRODUCT_PACKAGES := \ Gallery2 \ ...

更多相关文章

  1. Android实现伸缩弹力分布菜单效果
  2. [置顶] 我的Android进阶之旅------>Android疯狂连连看游戏的实现
  3. 2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
  4. 用android LinearLayout和RelativeLayout实现精确布局
  5. 解读Android(安卓)LOG机制的实现:(6)c/c++域使用LOG
  6. 解读Android(安卓)LOG机制的实现:(2)JAVA域输出LOG
  7. Android分享文件到微信和QQ功能的实现(兼容android 7.0以上的共享
  8. 【quickhybrid】Android端的项目实现
  9. 浅谈Java中Collections.sort对List排序的两种方法

随机推荐

  1. Android(安卓)SDK 2.2 开发环境安装
  2. android ksoap2 访问webservice,连续两次
  3. Android(安卓)滚动字幕实现
  4. [转]Android(安卓)分裂的多面性
  5. android 蓝牙搜索、配对连接通信总结
  6. React Native---手势响应系统
  7. Android(安卓)各种第三方轮子
  8. Drawable资源——BitmapDrawable
  9. Android解决大图片内存溢出
  10. 多渠道