【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中定义必要的数据结构和接口,以使编译成功。
具体修改
需要改三个位置:
- 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"
虽然实现了选择,但是不够灵活,后续出一个优化版本。