当前位置: 首页 > news >正文

【Android构建系统】如何在Camera Hal的Android.bp中选择性引用某个模块

背景描述

本篇文章是一个Android.bp中选择性引用某个模块的实例。

如果是Android.mk编译时期,在编译阶段通过某个条件判断是不是引用某个模块A, 是比较好实现的。Android15使用Android.bp构建后,要想在Android.bp中通过自定义的一个变量或者条件实现选择构建有点难,主要是因为soong构建系统将构建逻辑交由go实现,Android.bp中静态配置构建目标。

接下来以一个简单的例子说明如何修改Android.bp达到简单的条件编译效果。

具体描述下问题背景

1.Camera Hal引用一个硬件相关模块A做图像的后处理.

2.A模块是有对应的vendor hal的ndk层库

3.当前要做Android系统升级,A模块仓库还没ready,想用纯软件替代方案开始Camera Hal升级。

4.Camera Hal对这个A模块引用的头文件是,soong根据aidl接口编译生成的,当前A仓库还没加到系统集成中,所以引用的头文件,库文件,Android.bp中导出的模块都没有。

5.后续A模块ready后,Camera Hal要引用,软件替代方案只是临时替补。

实现思路

1.将A模块封装一层(称为A_wrapper),然后引用A_wrapper。A_wrapper通过enabled属性控制。

2.Android.bp中传一个宏到.cpp中,.cpp使用这个宏预编译A模块相关数据结构和接口

3.Camera Hal代码实现中对A模块接口进行封装(称为AWrapper),并在AWrapper.h中定义必要的数据结构和接口,以使编译成功。

具体修改

需要改三个位置:

  1. Android.bp中修改,构建层面将vendor.hardware.a-V1-ndk封装成vendor.hardware.camera.hwprocess。
  2. EmulatedSensor.cpp中,不直接调用A模块接口而是改成调用AWrapper。
  3. AWrapper.h中定义必要的A模块接口(必要是因为A模块数据结构,接口等引用的比较零散,为了.cpp尽可能少改动,或者改动收敛而搬一些A.h中的数据结构或者接口定义)
  4. AWrapper.cpp中实现对A模块接口的封装,同时使用#ifdef CAMERA_ENABLE_HW_PROCESS &#endif预编译将A模块接口(和步骤3呼应)处理下,以保证能编译过。

Android.bp中修改如下,

//aosp15/hardware/google/camera/devices/EmulatedCamera/hwl/Android.bp//添加a wrapper层
+a_wrapper_src = ["vendor.hardware.a-V1-ndk",]
+//a_wrapper_src = []  //用于兼容不引用a模块
+cc_library_static {
+    name: "vendor.hardware.camera.hwprocess",
+    whole_static_libs: a_wrapper_src,           //注意这里要用whole_static_libs不能用static_libs,因为后者可能会优化导致封装出来的vendor.hardware.camera.hwprocess中找不到某些符号
+    export_static_lib_headers: a_wrapper_src,   //这里导出a模块的头文件
+    vendor:true,
+    shared_libs: [                              //这里使a模块依赖的库
+        "libbase",
+        "libutils",
+        "libhardware",
+        "libbinder_ndk",
+    ],
+}//修改引用a wrapper
static_libs: ["android.hardware.camera.common@1.0-helper","libgooglecamerahwl_sensor_impl",
-    "vendor.hardware.a-V1-ndk",
+    "vendor.hardware.camera.hwprocess","libgooglecamera_process",
],cc_library_static {name: "libgooglecamera_process",owner: "google",proprietary: true,host_supported: false,srcs: ["a_wrapper.cpp",         //代码中对a模块接口的封装"image_processor.cpp",],header_libs: ["libgui_aidl_headers","arm_gralloc_headers",],static_libs: [
-        "vendor.hardware.a-V1-ndk",
+		 "vendor.hardware.camera.hwprocess",],shared_libs: ["libui","libdmabufheap",],include_dirs: ["system/media/private/camera/include","frameworks/native/libs/ui/include/","frameworks/native/include/","vendor/google/hardware/modules/gralloc/android/src","system/memory/libdmabufheap/include","external/libyuv/include",],export_include_dirs: ["."],cflags: ["-Werror","-Wextra","-Wall",
+        "-DCAMERA_ENABLE_HW_PROCESS",            //这里实现Makefile中的-DSymbel效果],target: {android_arm64: {enabled: true,},android_x86_64: {enabled: false,},},
}

如上,Android.bp是按引用A模块构建google camera hal。如果不引用A模块修改上述Android.bp中:

  1. 注掉a_wrapper_src = ["vendor.hardware.a-V1-ndk",] 使用a_wrapper_src = []
  2. 注掉 "-DCAMERA_ENABLE_HW_PROCESS"

虽然实现了选择,但是不够灵活,后续出一个优化版本。

http://www.xdnf.cn/news/476065.html

相关文章:

  • Springboot 异步场景 使用注解 @Async 及 自定义线程池分模块使用
  • 一分钟了解机器学习
  • 专业版降重指南:如何用Python批量替换同义词?自动化操作不香嘛?
  • STM32 ADC+DMA+TIM触发采样实战:避坑指南与源码解析
  • 宇宙中是否存在量子现象?
  • Jenkins的流水线执行shell脚本执行jar命令后项目未启动未输出日志问题处理
  • #跟着若城学鸿蒙# web篇-运动和方向传感器监测
  • 【愚公系列】《Manus极简入门》042-投资策略分析师:“投资智慧导航”
  • 武汉火影数字全息剧秀制作:科技与艺术的梦幻联动
  • RabbitMQ 消息模式实战:从简单队列到复杂路由(三)
  • 通信安全堡垒:profinet转ethernet ip主网关提升冶炼安全与连接
  • PCL PolygonMesh 与 TextureMesh 源码阅读与简单测试
  • 数据结构进阶:AVL树与红黑树
  • SRS流媒体服务器(5)源码分析之RTMP握手
  • Python中in和is关键字详解和使用
  • C语言实现简单的--队列
  • Redis解析
  • C#将1GB大图裁剪为8张图片
  • 100G QSFP28 BIDI光模块一览:100G单纤高速传输方案|易天光通信
  • 组件导航 (Navigation)+flutter项目搭建-混合开发+分栏
  • Android 中 权限分类及申请方式
  • HNU工训--计算机串口数据收发与测量
  • 安科瑞AcrelEMS3.0企业微电网智慧能源平台-安科瑞 蒋静
  • .NET Core liunx二进制文件安装
  • 22、能源监控与优化 - 数据中心模拟 - /能源管理组件/data-center-energy-monitoring
  • CSS面试题汇总
  • 中文分词与数据可视化02
  • 接触感知 钳位电路分析
  • [模型部署] 3. 性能优化
  • 我的 PDF 工具箱:CodeBuddy 打造 PDFMagician 的全过程记录