背景描述
Android15 Camera HAL使用Android.bp脚本来构建系统。假设Camera HAL中引用了另外一个HAL实现的so (例如VPU HAL), 恰巧被引用的这个VPU HAL so是用Android.mk构建的,那Camera HAL Android.bp在直接引用这个Android.mk编译出来的so时很可能会出现链接问题。
那么这时候有啥曲线救国方法能让Camera HAL Android.bp成功引用这个VPU HAL so吗?
先说第一个方案:
- VPU HAL so改Android.mk编译为Android.bp,然后生成lib/libvpu_pv.so和lib64/libvpu_pv.so。
- Camera HAL路径下建一个目录放要引用的so和头文件。
- Camera HAL Android.bp中添加vpu so的预编译目标。
- Camera HAL Android.bp中添加对vpu引用。
注意:VPU HAL Android.mk和Android.bp编译出来的so符号要避免冲突。
VPU HAL Android.bp构建so
cc_library_shared {name: "libarm_vpu_jpegenc_wr",vendor: true,srcs: [vpu_wrapper/encoder/jpeg_encoder_wrap/arm_jpeg_encoder.c",],include_dirs: ["vendor/qc/hardware/modules/vpu/libs/inc","vendor/qc/hardware/modules/vpu/wrapper/encoder/jpeg_enc",],static_libs: ["libh2enc",],header_libs: ["libhardware_headers","arm_gralloc_headers",],shared_libs: ["libcutils","libc","liblog","libcutils",],defaults: ["memory_allocator_defaults",],export_include_dirs: ["vendor/qc/hardware/modules/vpu/wrapper/encoder/jpeg_enc",],
}
这里将生成vendor/lib/libarm_vpu_jpegenc_wr.so和vendor/lib64/libarm_vpu_jpegenc_wr.so。
vpu so放到Camera HAL
这里如下放置:vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/ext_lib/lib/libarm_vpu_jpegenc_wr.so
vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/ext_lib/lib64/libarm_vpu_jpegenc_wr.so
vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/ext_inc/arm_vpu_jpegenc_wr.h
Camera HAL添加vpu预编译目标
cc_prebuilt_library_shared {name "libarm_vpu_jpegenc_wr",vendor: true,strip: { none: true },compile_multilib: "both",arch: {arm: {srcs: ["ext_lib/lib/libarm_vpu_jpegenc_wr.so"],relative_install_path: ".",},arm64: {srcs: ["ext_lib/lib64/libarm_vpu_jpegenc_wr.so"],relative_install_path: ".",},},shared_libs: ["libutils","liblog","libcutils","libdmabufheap",],
}
Camera HAL中添加对vpu的引用
//主要是两个内容:头文件路径和so应用
...
xx {...shared_libs: [..."libarm_vpu_jpegenc_wr",],include_dirs: [..."vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/ext_inc",],...
}
可能遇到的问题
out/soong/.intermediates/vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/libarm_vpu_jpegenc_wr/android_vendor.35_arm64_armv8-a_shared/libarm_vpu_jpegenc_wr.so: error: DT_NEEDED "libutils.so" is not specified in shared_libs.
问题原因
-
DT_NEEDED
:
是 ELF 文件(共享库)中的一个字段,用于指定该库依赖的其他共享库。加载器会根据DT_NEEDED
动态加载依赖库。 -
库文件
libarm_vpu_jpegenc_wr.so
依赖libutils.so
,但在Android.bp
的shared_libs
中未声明该依赖。
解决方法
在Android.bp中添加缺失的依赖,对于这里的例子,就是:
out/soong/.intermediates/vendor/qc/hardware/modules/camera/devices/EmulatedCamera/hwl/libarm_vpu_jpegenc_wr/android_vendor.35_arm_armv8-a_shared/libarm_vpu_jpegenc_wr.so: error: DT_SONAME "libarm_vpu_jpegenc.so" must be equal to the file name "libarm_vpu_jpegenc_wr.so".
问题的原因
-
DT_SONAME
:
是 ELF 文件(共享库)中的一个字段,用于指定动态链接时的库名称。加载器会根据DT_SONAME
查找库文件。 -
库文件
libarm_vpu_jpegenc_wr.so
的DT_SONAME
被设置为libarm_vpu_jpegenc.so
,而 Android 构建系统要求DT_SONAME
必须与库文件名一致。
Camera HAL Android.bp中cc_prebuilt_library_shared libarm_vpu_jpegenc_wr, 构建的src虽然是libarm_vpu_jpegenc_wr.so, 单这个so构建脚本(VPU HAL Android.bp)中cc_library_shared 是arm_vpu_jpegenc。 即DT_SONAME需要和库文件名不一致。
解决方法
修改VPU HAL Android.bp cc_library_shared目标名为libarm_vpu_jpegenc_wr。