背景描述
本篇文章是一個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中定義必要的數據結構和接口,以使編譯成功。
具體修改
需要改三個位置:
- Android.bp中修改,構建層面將vendor.hardware.a-V1-ndk封裝成vendor.hardware.camera.hwprocess。
- EmulatedSensor.cpp中,不直接調用A模塊接口而是改成調用AWrapper。
- AWrapper.h中定義必要的A模塊接口(必要是因為A模塊數據結構,接口等引用的比較零散,為了.cpp盡可能少改動,或者改動收斂而搬一些A.h中的數據結構或者接口定義)
- 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中:
- 注掉a_wrapper_src = ["vendor.hardware.a-V1-ndk",] 使用a_wrapper_src = []
- 注掉 "-DCAMERA_ENABLE_HW_PROCESS"
雖然實現了選擇,但是不夠靈活,后續出一個優化版本。