当前位置: 首页 > 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"

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

相关文章:

  • 使用哈希表封装myunordered_set和myunordered_map
  • leetcode:58. 最后一个单词的长度(python3解法)
  • Centos7 中 Docker运行配置Apache
  • 【Shell的基本操作】
  • 第九天——贪心算法——非递减数组
  • Promise.all 详解
  • ch10 题目参考思路
  • 突围“百机大战”,云轴科技ZStack智塔获IDC中国AI大模型一体机推荐品牌
  • 文章记单词 | 第87篇(六级)
  • Android App CAN通信测试
  • elementUI源码学习
  • OpenCV CUDA模块中矩阵操作------归一化与变换操作
  • 反射机制详细说明
  • 2025年渗透测试面试题总结-安恒[实习]安全服务工程师(题目+回答)
  • 遥感图像露天矿区检测数据集VOC+YOLO格式1542张1类别
  • 智能裂变引擎 商业增长利器 —— 专业推客系统耀世而来
  • Sprnig MVC 如何统一异常处理 (Exception Handling)?
  • Java—— 方法引用 : :
  • HANA数据库死锁
  • 2025年渗透测试面试题总结-安恒[社招]售前工程师(题目+回答)
  • 机器人为啥热衷“搞体育”,经济日报:是向加速融入日常生活发起的冲锋
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯今日执行死刑
  • 独家 |《苏州河》上海上演,编剧海飞:上海的风能吹透我
  • 创同期历史新高!1至4月全国铁路发送旅客14.6亿人次
  • 证券日报:降准今日正式落地,年内或还有降准空间
  • 河南省委常委会会议:坚持以案为鉴,深刻汲取教训