【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.pswp.cn/bicheng/81859.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81859.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81859.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【OneNET】_01_使用微信小程序通過新版OneNET平臺獲取STM32設備信息并進行控制

【OneNET】_01_使用微信小程序通過新版OneNET平臺獲取STM32設備信息并進行控制 一、 前言1.1 OntNET硬件方面: STM32F103C8T6 ESP01S教程 1.2 微信小程序方面 二、STM32代碼部分修改三、微信小程序修改的部分四、小筆記(個人雜記)4.1 OneNETOneNET物聯網…

用 python 編寫的一個圖片自動分類小程序(三)

圖片自動分類識別小程序記錄 2025/5/18 0:38修改程序界面,增加一些功能 用 python 編寫的一個圖片自動識別分類小程序。 操作系統平臺:Microsoft Windows 11 編程語言和 IDE:python 3.10 Visual studio code 一:圖片自動分…

嵌入式硬件篇---SGP30 氣體傳感器

文章目錄 前言一、SGP30 氣體傳感器詳解(一)基本概述(二)工作原理傳感器結構檢測機制自校準功能(三)主要特性(四)應用場景智能家居空氣質量檢測儀汽車行業商業建筑二、TVOC 與 eCO2 的含義(一)TVOC(總揮發性有機化合物)定義危害健康標準(二)eCO2(等效二氧化碳)…

【原創】ubuntu22.04下載編譯AOSP 15

安裝依賴的庫,順便把vim 也安裝一下 sudo apt-get install vim sudo apt-get install git gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip font…

防止勒索病毒的兜底方案——備份

勒索病毒入侵會對您的業務數據進行加密勒索,導致業務中斷、數據泄露、數據丟失等,從而帶來嚴重的業務風險。 防止勒索病毒有三個方向: 1)實時防御已知勒索病毒 各個云廠商的云安全中心實現了對大量已知勒索病毒的實時防御。在服務…

es在已有歷史數據的文檔新增加字段操作

新增字段設置默認值 場景 在已經有大量數據的索引文檔上,增加新字段 技術實現 一.更新索引映射 通過PUT請求顯式定義新字段類型,確保后續寫入的文檔能被正確解析 PUT /文檔名/_mapping {"properties": {"字段名1": {"type…

留給王小川的時間不多了

王小川,這位頭頂“天才少年”光環的清華學霸、搜狗輸入法創始人、中國互聯網初代技術偶像,正迎來人生中最難啃的硬骨頭。 他在2023年創立的百川智能,被稱為“大模型六小虎”之一。今年4月,王小川在全員信中罕見地反思過去兩年工作…

深入掌握MyBatis:連接池、動態SQL、多表查詢與緩存

文章目錄 一、MyBatis連接池1.1 連接池的作用1.2 MyBatis連接池分類 二、動態SQL2.1 if標簽2.2 where標簽2.3 foreach標簽2.4 SQL片段復用 三、多表查詢3.1 多對一查詢(一對一)3.2 一對多查詢 四、延遲加載4.1 立即加載 vs 延遲加載4.2 配置延遲加載 五、…

TDesign AI Chat - Vue3.x 可用!騰訊出品的 AIGC 交互對話組件,免費開源、包含設計資源

各位前端開發者有遇到做 AI Chat 項目的聊天交互界面需求了嗎?TDesign 出品的這個組件很不錯,推薦給大家。 TDesign AI Chat 是 TDesign 為 AIGC 場景開發的 UI 系列組件中的一部分,主要用于開發目前非常流行的 ChatBot 對話交互場景。最近 …

spring -MVC-02

SpringMVC-11 - 響應 在 SpringMVC 中,響應是服務器對客戶端請求的反饋,它可以以多種形式呈現,包括視圖名稱、ModelAndView 對象、JSON 數據以及重定向等。以下是對 SpringMVC 中不同響應類型的詳細介紹: 1. 視圖名稱 通過返回…

老舊設備升級利器:Modbus TCP轉 Profinet讓能效監控更智能

在工業自動化領域,ModbusTCP和Profinet是兩種常見的通訊協議。Profinet是西門子公司推出的基于以太網的實時工業以太網標準,而Modbus則是由施耐德電氣提出的全球首個真正開放的、應用于電子控制器上的現場總線協議。這兩種協議各有各的優點,但…

ubuntu下docker安裝mongodb-支持單副本集

1.mogodb支持事務的前提 1) MongoDB 版本:確保 MongoDB 版本大于或等于 4.0,因為事務支持是在 4.0 版本中引入的。 2) 副本集配置:MongoDB 必須以副本集(Replica Set)模式運行,即使是單節點副本集&#x…

【前端開發】Uniapp日期時間選擇器:實現分鐘動態步長設置

技術棧 Uniapp + Vue3 + uView年份顯示前后一年,分鐘動態設置間隔效果圖 主體顯示<view class="uni-row-between selector"><view class="uni-flex-1 left" @click="!props.disabled && openPicker()"><uni-iconscolor=…

iOS 藍牙開發中的 BT 與 BLE

在 iOS 開發者的語境里&#xff0c;大家把 BT 和 BLE 當成兩種不同的藍牙技術在談——它們來自同一個 Bluetooth 規范&#xff0c;但面向的場景、協議棧乃至 Apple 提供的 API 都截然不同。 縮寫全稱 / 技術名稱規范層叫法iOS 支持現狀典型用途BTBluetooth Classic&#xff08…

Flink CEP是什么?

Apache Flink 的 CEP&#xff08;Complex Event Processing&#xff0c;復雜事件處理&#xff09; 是 Flink 提供的一個庫&#xff0c;用于在無界數據流中檢測符合特定模式的事件組合。 &#x1f3af; 一、什么是 CEP&#xff1f; ? 定義&#xff1a; CEP 是一種從連續的數據…

ARM (Attention Refinement Module)

ARM模塊【來源于BiSeNet】&#xff1a;細化特征圖的注意力&#xff0c;增強重要特征并抑制不重要的特征。 Attention Refinement Module (ARM) 詳解 ARM (Attention Refinement Module) 是 BiSeNet 中用于增強特征表示的關鍵模塊&#xff0c;它通過注意力機制來細化特征圖&…

AR0144CSSC20SUKA0-CRBR——1/4英寸 1.0 MP 高性能CMOS圖像傳感器解析

產品概述&#xff1a; AR0144CSSC20SUKA0-CRBR 是一款1/4 英寸&#xff0c;1.0 Mp CMOS 數字圖像傳感器&#xff0c;帶有 1280H x 800V 有效像素陣列 全局快門CMOS數字圖像傳感器&#xff0c;它結合了新型的創新全局快門像素設計&#xff0c;適用于準確快速的移動場景捕捉。該…

深入理解遞歸算法:Go語言實現指南

深入理解遞歸算法&#xff1a;Go語言實現指南 引言 遞歸是編程中一種優雅而強大的算法思想&#xff0c;通過函數自我調用的方式解決復雜問題。本文將使用Go語言演示遞歸的核心原理&#xff0c;并通過典型示例幫助開發者掌握這一重要技術。 一、遞歸基礎概念 1.1 遞歸定義 遞歸…

vue2實現【瀑布流布局】

瀑布流 1. 解釋2. 形成結構和樣式3. 自定義指令 1. 解釋 瀑布流特征&#xff1a; 等寬不等高&#xff1a;元素寬度固定&#xff0c;高度根據內容自適應。錯落排列&#xff1a;元素像瀑布一樣從上到下依次填充&#xff0c;自動尋找最短列插入 體現&#xff1a;圖中第一排1&…

CSS display有幾種屬性值

在 CSS 中&#xff0c;display 屬性是控制元素布局和渲染方式的核心屬性之一。它有多種屬性值&#xff0c;每個值都決定了元素在文檔流中的表現形式。以下是 display 的主要屬性值分類及說明&#xff1a; 1. 塊級和行內布局 塊級元素 (block) 特性&#xff1a;獨占一行&…