Android Camera--hw_get_module获取camx模块接口

58 篇文章

已下架不支持订阅

我们知道,google为了保护硬件厂商的信息,在Android中添加了一层,也就是大名鼎鼎的HAL

层。

在看HAL的编写方法的过程中,会发现整个模块貌似没有一个入口。一般说来模块都要有个入口,

比如应用程序有main函数,可以为加载器进行加载执行,dll文件有dllmain,而对于我们自己写的

动态链接库,我们可以对库中导出的任何符号进行调用。

问题来了,Android中的HAL是比较具有通用性的,需要上层的函数对其进行加载调用,Android的

HAL加载器是如何实现对不同的Hardware Module进行通用性的调用的呢?

带着这个疑问查看Android源码,会发现Android中实现调用HAL是通过hw_get_module实现的。

1.Camera 服务启动流程概览

cameraserver 与 provider 这两个进程启动、初始化的调用逻辑,如下图

总体逻辑顺序:
 
provider 进程启动,注册;

cameraserver 进程启动,注册,初始化;

cameraserver 获取远端 provider(此时实例化 CameraProvider 并初始化)。

上图中,实线箭头是调用关系。左边是 cameraserver 进程中的动

已下架不支持订阅

ifeq ($(OEM_LAYER_PATH),) LOCAL_PATH := $(abspath $(call my-dir)/../..) OEM_LAYER_PATH := $(abspath $(LOCAL_PATH)/../../../..) else LOCAL_PATH := $(OEM_LAYER_PATH)/oem/sun/multicamera/chimcxlinearmapper endif include $(CLEAR_VARS) # Module supports function call tracing via ENABLE_FUNCTION_CALL_TRACE # Required before including common.mk SUPPORT_FUNCTION_CALL_TRACE := 1 # Get definitions common to the CHI-CDK project here include $(CAMX_CHICDK_PATH)/core/build/android/common.mk MVG_SAT_NODE_PATH_ABS := $(OEM_LAYER_PATH)/oem/sun/node/oplusmvgsat/wrapper/mvgsatengine QCOM_LINEAARMAP_PATH_ABS := $(CAMX_CHICDK_PATH)/oem/qcom/multicamera/chimcxlinearmapper MVG_SAT_NODE_PATH_REL := ../../node/oplusmvgsat/wrapper/mvgsatengine LOCAL_SRC_FILES := \ mvgmcxlinearmapper.cpp \ chxzoomtranslator_proxy_mvg.cpp LOCAL_SRC_FILES += \ $(MVG_SAT_NODE_PATH_REL)/mvgsat/sdk/MvgSatEngine.cpp \ $(MVG_SAT_NODE_PATH_REL)/mvgsat/sdk/sat_cfg_load.cpp \ $(MVG_SAT_NODE_PATH_REL)/mvgcalib/sdk/src/lib_calibr.cpp LOCAL_INC_FILES += \ mvgmcxlinearmapper.h \ chimcxlinearmapperinterface.h \ chxzoomtranslator_proxy_mvg.h \ LOCAL_C_LIBS := $(CAMX_C_LIBS) LOCAL_C_INCLUDES := \ $(CAMX_C_INCLUDES) \ $(CAMX_CHICDK_PATH)/core/chifeature2 \ $(CAMX_CHICDK_PATH)/oem/qcom/feature2/chiframework \ $(CAMX_CHICDK_PATH)/oem/qcom/feature2/chiusecase \ $(CAMX_CHICDK_PATH)/oem/qcom/feature2/chiutils LOCAL_C_INCLUDES += \ $(QCOM_LINEAARMAP_PATH_ABS) LOCAL_C_INCLUDES += \ $(MVG_SAT_NODE_PATH_ABS) \ $(MVG_SAT_NODE_PATH_ABS)/mvgsat/include \ $(MVG_SAT_NODE_PATH_ABS)/mvgsat/sdk \ $(MVG_SAT_NODE_PATH_ABS)/mvgcalib/sdk/inc \ $(MVG_SAT_NODE_PATH_ABS)/mvgcalib/sdk/src \ $(MVG_SAT_NODE_PATH_ABS)/rapidjson/include # Compiler flags LOCAL_CFLAGS := $(CAMX_CFLAGS) LOCAL_CPPFLAGS := $(CAMX_CPPFLAGS) LOCAL_CPPFLAGS += \ -DUSING_ARCSODT_ZOOM_CTRL \ -DUSING_MVGSAT_ZOOM_CTRL # CamX Stripout Flags LOCAL_CFLAGS := $(filter-out $(CAMXSTRIPOUT),$(LOCAL_CFLAGS)) LOCAL_CFLAGS += -Wno-error LOCAL_SHARED_LIBRARIES += \ com.qti.chi.override \ libcamera_metadata \ libchilog \ libcutils \ libhardware \ libhidlbase \ libhidltransport \ liblog \ libsync \ libutils \ libextensionlayer \ libhwconfigurationutil \ # Binary name LOCAL_MODULE := com.oplus.mcx.linearmapper LOCAL_MULTILIB := first LOCAL_LDLIBS := -lz LOCAL_MODULE_PATH_64 := $(TARGET_OUT_ODM)/lib64 include $(CHICDK_BUILD_SHARED_LIBRARY) -include $(CAMX_CHECK_WHINER)
最新发布
07-23
<think>好的,我现在需要分析用户提供的这段Android.mk构建脚本,并解释其主要功能和关键部分。首先,我需要回忆一下Android.mk的基本结构和常用变量的作用。 首先看开头的条件判断:`ifeq ($(OEM_LAYER_PATH),)`,这里检查OEM_LAYER_PATH是否为空。如果为空,设置LOCAL_PATH为当前目录的上上级目录,并将OEM_LAYER_PATH设置为更上一级的目录;否则,LOCAL_PATH设置为OEM_LAYER_PATH下的特定路径。这部分是在配置项目的本地路径,根据是否已定义OEM_LAYER_PATH来调整路径,可能是为了支持不同的构建环境或OEM定制。 接下来,`include $(CLEAR_VARS)`,这是Android.mk的标准操作,用于清除当前模块的变量(除了LOCAL_PATH),准备开始新模块的构建。 然后,设置`SUPPORT_FUNCTION_CALL_TRACE := 1`,这可能是启用函数调用跟踪的宏定义,用于调试。 接下来`include $(CAMX_CHICDK_PATH)/core/build/android/common.mk`,这里包含了CHI-CDK项目的公共配置,可能定义了一些通用的变量、库路径或编译选项。 然后定义了几个路径变量,如MVG_SAT_NODE_PATH_ABS和QCOM_LINEAARMAP_PATH_ABS,分别指向MVG SAT节点和QCOM线性映射的绝对路径,以及MVG_SAT_NODE_PATH_REL的相对路径。这些路径用于后续的源文件和头文件包含。 `LOCAL_SRC_FILES`列出了需要编译的源文件,包括当前目录下的`.cpp`文件,以及通过相对路径引用的MVG SAT和校准相关的源文件。这部分指定了模块的源代码。 `LOCAL_INC_FILES`可能是指需要安装的头文件,但更常见的是`LOCAL_C_INCLUDES`,这里可能用户输入有误或有特定用途,通常头文件包含路径使用`LOCAL_C_INCLUDES`。 `LOCAL_C_LIBS`指定了需要链接的C库,这里继承了CAMX_C_LIBS的配置。 `LOCAL_C_INCLUDES`定义了头文件的包含路径,包括CAMX的公共路径、CHI-CDK的功能模块路径,以及前面定义的QCOM和MVG SAT相关路径。这些路径确保编译器能找到所需的头文件。 `LOCAL_CFLAGS`和`LOCAL_CPPFLAGS`设置编译标志,继承了CAMX的标志,并添加了特定的宏定义(如-DUSING_ARCSODT_ZOOM_CTRL和-DUSING_MVGSAT_ZOOM_CTRL),这些宏可能用于启用特定功能。 `LOCAL_SHARED_LIBRARIES`列出了需要链接的共享库,包括相机元数据、日志、系统工具库等,这些库在运行时需要存在,确保模块能正确链接和运行。 `LOCAL_MODULE`定义了模块的名称,即生成的共享库文件名(com.oplus.mcx.linearmapper)。`LOCAL_MULTILIB := first`表示优先构建64位版本。 `LOCAL_MODULE_PATH_64`指定了64位库的输出路径为$(TARGET_OUT_ODM)/lib64,这通常是ODM(原始设计制造商)的目录,用于存放定制的库。 最后,`include $(CHICDK_BUILD_SHARED_LIBRARY)`,这会根据前面的变量设置编译生成共享库。`-include $(CAMX_CHECK_WHINER)`可能用于包含代码检查工具的配置,处理警告或错误。 总结,这段脚本的主要功能是配置一个名为com.oplus.mcx.linearmapper的共享库(.so)的构建,包含特定的源文件、头文件路径、编译标志和依赖库,输出到ODM的64位库目录,用于支持相机相关的线性映射功能,可能涉及MVG(多视角几何)和SAT(可能是某种算法或校准)模块的集成。 </think>这段代码是Android构建系统中的`Android.mk`脚本,主要用于定义一个**共享库(Shared Library)的编译规则**,目标是为相机模块(可能涉及多摄像头或线性映射功能)生成名为`com.oplus.mcx.linearmapper.so`的动态库。以下是关键部分的详细解析: ### 一、路径配置与条件判断 ```makefile ifeq ($(OEM_LAYER_PATH),) LOCAL_PATH := $(abspath $(call my-dir)/../..) OEM_LAYER_PATH := $(abspath $(LOCAL_PATH)/../../../..) else LOCAL_PATH := $(OEM_LAYER_PATH)/oem/sun/multicamera/chimcxlinearmapper endif ``` - **功能**:根据`OEM_LAYER_PATH`是否已定义,动态设置项目根路径(`LOCAL_PATH`)和OEM层路径(`OEM_LAYER_PATH`)。 - 若`OEM_LAYER_PATH`未定义(首次构建),则`LOCAL_PATH`指向当前目录的上上级(`my-dir`返回当前mk文件所在目录),并将`OEM_LAYER_PATH`进一步向上扩展四级。 - 若已定义(如其他模块调用),则直接使用预定义的`OEM_LAYER_PATH`拼接具体路径。 ### 二、公共配置引入 ```makefile include $(CLEAR_VARS) SUPPORT_FUNCTION_CALL_TRACE := 1 include $(CAMX_CHICDK_PATH)/core/build/android/common.mk ``` - `CLEAR_VARS`:清除`LOCAL_*`变量(除`LOCAL_PATH`),初始化新模块的构建环境。 - `SUPPORT_FUNCTION_CALL_TRACE`:启用函数调用跟踪(可能用于调试,需配合`common.mk`中的宏定义)。 - 引入`common.mk`:加载CHI-CDK(相机硬件抽象层开发工具包)的公共配置(如通用编译标志、库路径)。 ### 三、源文件与头文件配置 ```makefile LOCAL_SRC_FILES := \ mvgmcxlinearmapper.cpp \ chxzoomtranslator_proxy_mvg.cpp \ $(MVG_SAT_NODE_PATH_REL)/mvgsat/sdk/MvgSatEngine.cpp \ ...(其他源文件) ``` - **源文件**:指定需要编译的`.cpp`文件,包括当前目录下的业务逻辑文件(如`mvgmcxlinearmapper.cpp`)和外部模块的源文件(如通过相对路径`MVG_SAT_NODE_PATH_REL`引入的`MvgSatEngine.cpp`)。 ```makefile LOCAL_C_INCLUDES := \ $(CAMX_C_INCLUDES) \ $(CAMX_CHICDK_PATH)/core/chifeature2 \ $(CAMX_CHICDK_PATH)/oem/qcom/feature2/chiframework \ ...(其他头文件路径) ``` - **头文件路径**:通过`LOCAL_C_INCLUDES`指定编译器搜索头文件的路径,覆盖CHI-CDK核心模块、QCOM(高通)定制功能模块,以及MVG SAT算法相关的头文件目录(如`$(MVG_SAT_NODE_PATH_ABS)/mvgsat/include`)。 ### 四、编译与链接配置 ```makefile LOCAL_CPPFLAGS += \ -DUSING_ARCSODT_ZOOM_CTRL \ -DUSING_MVGSAT_ZOOM_CTRL ``` - **宏定义**:通过`-D`参数定义编译期宏(如`USING_MVGSAT_ZOOM_CTRL`),控制代码中条件编译逻辑(例如启用MVG SAT算法的变焦控制功能)。 ```makefile LOCAL_SHARED_LIBRARIES += \ com.qti.chi.override \ libcamera_metadata \ libchilog \ ...(其他系统库) ``` - **共享库依赖**:指定运行时需要链接的共享库(如`liblog`用于日志,`libcamera_metadata`用于相机元数据处理),确保动态库运行时能找到依赖的符号。 ### 五、输出配置 ```makefile LOCAL_MODULE := com.oplus.mcx.linearmapper LOCAL_MULTILIB := first LOCAL_MODULE_PATH_64 := $(TARGET_OUT_ODM)/lib64 include $(CHICDK_BUILD_SHARED_LIBRARY) ``` - **模块名称**:`LOCAL_MODULE`定义生成的动态库名称(最终输出为`libcom.oplus.mcx.linearmapper.so`)。 - **多架构支持**:`LOCAL_MULTILIB := first`表示优先构建64位版本(`arm64-v8a`)。 - **输出路径**:`LOCAL_MODULE_PATH_64`指定64位库的输出目录为`$(TARGET_OUT_ODM)/lib64`(`ODM`目录用于存放原始设计制造商的定制库)。 ### 总结 该脚本的核心目标是**编译一个依赖CHI-CDK和MVG SAT算法的相机线性映射动态库**,通过路径配置、源文件管理、编译标志和依赖链接,最终生成适用于Android系统的共享库,用于多摄像头场景下的变焦控制或线性映射功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式_笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值