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

【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"

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

相关文章:

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

背景描述 本篇文章是一个Android.bp中选择性引用某个模块的实例。 如果是Android.mk编译时期,在编译阶段通过某个条件判断是不是引用某个模块A, 是比较好实现的。Android15使用Android.bp构建后,要想在Android.bp中通过自定义的一个变量或者条件实现选…...

【Canvas与诗词】醉里挑灯看剑 梦回吹角连营

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>醉里挑灯看剑梦回吹角连营 Draft1</title><style type"…...

Hue面试内容整理-Hue 架构与前后端通信

Cloudera Hue 是一个基于 Web 的 SQL 助手,旨在为数据分析师和工程师提供统一的界面,以便与 Hadoop 生态系统中的各个组件(如 Hive、Impala、HDFS 等)进行交互。其架构设计强调前后端的分离与高效通信,确保系统的可扩展性和可维护性。以下是 Hue 架构及其前后端通信机制的…...

Linux搜索

假如我们要搜索 struct sockaddr_in 我们在命令终端输入 cd/usr/include/ //进入头文件目录地址 /usr/include/ grep " struct sockaddr_in { " *-nir &#xff08;*是在当前目录&#xff0c;n 是找出来显示行数…...

Git基础原理和使用

Git 初识 一、版本管理痛点 在日常工作和学习中&#xff0c;我们经常遇到以下问题&#xff1a; - 通过不断复制文件来保存历史版本&#xff08;如报告-v1、报告-最终版等&#xff09; - 版本数量增多后无法清晰记住每个版本的修改内容 - 项目代码管理存在同样问题 二、版本控…...

实现视频分片上传 OSS

访问 OSS 有两种方式&#xff0c;本文用到的是使用临时访问凭证上传到 OSS&#xff0c;不同语言版本的代码参考&#xff1a; 使用STS临时访问凭证访问OSS_对象存储(OSS)-阿里云帮助中心 1.安装并使用 首先我们要安装 OSS&#xff1a; npm install ali-oss --save 接着我们…...

网络I/O学习(一)

一、什么是网络IO&#xff1f; 就是客户端和服务端之间的进行通信的通道(fd)。 二、网络IO通信步骤 1、建立套接字 int socketfd socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in servaddr; servaddr.sin_family AF_INET; servaddr.sin_addr.s_addr htonl(INADDR_A…...

4:OpenCV—保存图像

将图像和视频保存到文件 在许多现实世界的计算机视觉应用中&#xff0c;需要保留图像和视频以供将来参考。最常见的持久化方法是将图像或视频保存到文件中。因此&#xff0c;本教程准备解释如何使用 OpenCV C将图像和视频保存到文件中。 将图像保存到文件 可以学习如何保存从…...

Selenium-Java版(css表达式)

css表达式 前言 根据 tag名、id、class 选择元素 tag名 #id .class 选择子元素和后代元素 定义 语法 根据属性选择 验证CSS Selector 组选择 按次序选择子节点 父元素的第n个子节点 父元素的倒数第n个子节点 父元素的第几个某类型的子节点 父元素的…...

产品更新丨谷云科技 iPaaS 集成平台 V7.5 版本发布

五月&#xff0c;谷云科技 iPaaS 集成平台保持月度更新&#xff0c; V7.5 版本于近日正式发布。我们一起来看看新版本有哪些升级和优化。 核心新增功能&#xff1a;深化API治理&#xff0c;释放连接价值 API网关&#xff1a;全链路可控&#xff0c;精准管控业务状态 业务状态…...

深度学习让鱼与熊掌兼得

通常,一个大的复杂的模型的loss会低,但是拟合方面不够,小的模型在拟合方面更好,但是loss高,我们可以通过深度学习来得到一个有着低loss的小模型 我们之前学过,peacewise linear可以用常数加上一堆这个阶梯型函数得到,然后因为peacewise linear可以逼近任何function,所以理论上…...

TDuckX 2.6 正式发布|API 能力开放,核心表单逻辑重构,多项实用功能上线。

大家好&#xff0c;TDuckX 2.6 已正式发布。 本次更新以可集成性提升、数据处理能力增强和交互体验优化为核心&#xff0c;新增了包括 新增OpenAPI 模块、表单数据批量修改、字段导出分列 等多个面向开发者和实际业务落地场景的功能。 我们也重构了部分底层逻辑模块&#xff…...

LeetCode Hot100刷题——除自身以外数组的乘积

238. 除自身以外数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&a…...

JAVA EE(进阶)_进阶的开端

别放弃浸透泪水的昨天&#xff0c;晨光已为明天掀开新篇 ——陳長生. ❀主页&#xff1a;陳長生.-CSDN博客❀ &#x1f4d5;上一篇&#xff1a;JAVA EE_HTTP-CSDN博客 1.什么是Java EE Java EE&#xff08;Java Pla…...

PDF批量合并拆分+加水印转换 编辑 加密 OCR 识别

各位办公小能手们&#xff01;你们有没有遇到过被PDF文件折腾得晕头转向的时候呀&#xff1f;其实啊&#xff0c;有专门处理、编辑、管理和优化PDF文件的软件&#xff0c;那就是PDF工具。它功能老多了&#xff0c;有文档格式转换、内容编辑、页面管理、安全保护这些核心功能。下…...

Go语言交替打印问题及多种实现方法

Go语言交替打印问题及多种实现方法 在并发编程中&#xff0c;多个线程&#xff08;或 goroutine&#xff09;交替执行任务是一个经典问题。本文将以 Go 语言为例&#xff0c;介绍如何实现多个 goroutine 交替打印数字的功能&#xff0c;并展示几种不同的实现方法。 Go 语言相关…...

ArcGIS Pro调用多期历史影像

一、访问World Imagery Wayback&#xff0c;基本在我国范围 如下图&#xff1a; 二、 放大到您感兴趣的区域 三、 查看影像版本信息 点击第二步的按钮后&#xff0c;便可跳转至World Imagery (Wayback 2025-04-24)的相关信息。 四 、点击上图影像版本信息&#xff0c;页面跳转…...

10.11 LangGraph多角色Agent开发实战:生产级AI系统架构与性能优化全解析

LangGraph 项目:High-level API for Multi-actor Agents 关键词:LangGraph 多角色 Agent, 状态管理, 持久化机制, 工作流编排, 生产级 AI 系统 1. LangGraph 设计哲学与架构演进 LangGraph 是 LangChain 生态中首个面向 多角色协作 Agent 的高阶 API 框架,其核心设计思想可…...

组态王|组态王中如何添加西门子1200设备

哈喽,你好啊,我是雷工! 最近使用组态王采集设备数据,设备的控制器为西门子的1214CPU, 这里边实施边记录,以下为在组态王中添加西门子1200PLC的笔记。 1、新建 在组态王工程浏览器中选择【设备】→点击【新建】。 2、选择设备 和设备建立通讯要通过对应的设备驱动。 在…...

发布时将多个bpl 打包成一个bpl的方法,或者说:不需要vcl60.bpl情况下 18.5K的exe 照常可以运行。

其实这种方式 就是把项目的逻辑和业务 和 依赖分开。 控件和IDE 相对来说一段时间内不会改变。 更新只是更新一些项目的逻辑&#xff0c;例如你在代码里多写了一个 if &#xff0c;这样就可以只更新这个极小的exe。 题&#xff1a;关于bpl发布时将vcl60.bpl&#xff0c;vcld…...

6.2.2邻接表法-图的存储

知识总览&#xff1a; 为什么要用邻接表 因为邻接矩阵的空间复杂度高(O(n))&#xff0c;且不适合边少的稀疏图&#xff0c;所以有了邻接表 用代码表示顶点、图 声明顶点图信息 声明顶点用一维数组存储各个顶点的信息&#xff0c;一维数组字段包括2个&#xff0c;每个顶点的…...

C++23 放宽范围适配器以允许仅移动类型(P2494R2)

文章目录 引言背景与动机提案内容与实现细节提案 P2494R2实现细节编译器支持 对开发者的影响提高灵活性简化代码向后兼容性 示例代码总结 引言 C23 标准中引入了许多重要的改进&#xff0c;其中一项值得关注的特性是放宽范围适配器&#xff08;range adaptors&#xff09;以允…...

【技海登峰】Kafka漫谈系列(十一)SpringBoot整合Kafka之消费者Consumer

【技海登峰】Kafka漫谈系列(十一)SpringBoot整合Kafka之消费者Consumer spring-kafka官方文档: https://docs.spring.io/spring-kafka/docs/2.8.10/reference/pdf/spring-kafka-reference.pdf KafkaTemplate API: https://docs.spring.io/spring-kafka/api/org/springframe…...

Spring Boot三层架构设计模式

Spring Boot 的三层架构设计模式是一种经典的软件分层设计模式&#xff0c;旨在将应用程序划分为 表现层&#xff08;Controller&#xff09;、业务逻辑层&#xff08;Service&#xff09;、数据访问层&#xff08;Repository/DAO&#xff09;&#xff0c;通过清晰的职责划分提…...

在Java中调用Ant命令

在Java中调用Ant命令 在Java程序中调用Ant命令有几种方法&#xff0c;下面介绍两种常用的方式&#xff1a; 1. 使用Runtime.exec()方法 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class AntRunner {public stat…...

WebRTC技术下的EasyRTC音视频实时通话SDK,助力车载通信打造安全高效的智能出行体验

一、方案背景​ 随着智能交通与车联网技术的飞速发展&#xff0c;车载通信在提升行车安全、优化驾驶体验以及实现智能交通管理等方面发挥着越来越重要的作用。传统的车载通信方式在实时性、稳定性以及多媒体交互能力上存在一定局限&#xff0c;难以满足现代车载场景日益复杂的…...

数据科学和机器学习的“看家兵器”——pandas模块 之二

目录 pandas 模块介绍 4.2 pandas 数据读取 4.2.1 课程目标 4.2.2 读取 Excel 文件中的数据 (一)读取某个工作表中的数据 (二)读取指定数据列的标签内容 (三)读取指定数据行的标签内容 (四)读取指定行或者列 4.2.3、读取 CSV 文件数据 4.2.4、课程总结回顾 4.2.5、课后…...

本地部署Firecrawl+Dify调用踩坑记录

最近自己研究Dify&#xff0c;使用到Firecrawl这个比较好用的工具。用Firecrawl官网的不知道为什么总是卡住得不到结果&#xff0c;于是我打算自己去本地部署一个。好家伙真给我人搞麻了&#xff0c;太多问题了。 我是在京东云上面租的一台服务器。 首先就是docker的安装&…...

MySQL--day2--基本的select语句

&#xff08;以下内容全部来自上述课程&#xff09; SQL概述 结构化查询语句 1. SQL分类 DDL&#xff1a;数据定义&#xff08;definition&#xff09;语言&#xff1a;create、drop、alter… DML&#xff1a;数据操作&#xff08;manipulation&#xff09;语言&#xff…...

什么是dom?作用是什么

DOM 的定义 DOM&#xff08;Document Object Model&#xff0c;文档对象模型&#xff09;是 HTML 和 XML 文档的编程接口。它将文档解析为一个由节点和对象组成的树状结构&#xff0c;允许开发者通过编程方式动态访问和操作文档的内容、结构和样式。 DOM 的作用 DOM 的主要作…...