如何解决Android系统中healthd依赖自定义C库的variant缺失报错问题?
什么是报错中提到的variants
Android Soong构建系统中的variants(变体)是指同一个代码模块,根据不同构建参数生成的适配不同运行场景的构建产物,每个变体由多个维度的参数唯一标识,报错中涉及的参数含义如下:
arch:目标硬件架构,比如arm64、arm32等image:产物所属的镜像分区,你当前的问题核心就出在这个维度:- 你自己开发的
libmylibrary当前只有image:core的变体,也就是仅会被编译到system分区 - 而healthd的两个依赖模块分别需要不同分区的变体:
android.hardware.health@2.0-impl属于vendor分区,需要image:vendor的依赖变体android.hardware.health@2.0-impl-default属于recovery分区,需要image:recovery的依赖变体
- 你自己开发的
link:链接方式,报错中你需要的是动态链接(shared),现有库已经满足该条件
需要注意:即使设备system分区存在该库,也无法被vendor、recovery分区的模块调用。一方面Android构建阶段会强制校验依赖变体匹配,不会直接使用已有的分区不匹配的库;另一方面Android Treble规则限制vendor分区进程无权访问system分区的第三方库,强制使用也会出现运行时权限错误。
修复方案
修改libmylibrary的Android.bp配置,在原有cc_library_shared配置块中新增分区适配声明即可,示例如下:
cc_library_shared { name: "libmylibrary", // 保留你原有配置,比如srcs、cflags、export_include_dirs等 // 新增以下配置 vendor_available: true, // 生成vendor分区可用的变体 recovery_available: true, // 生成recovery分区可用的变体 // 若后续需要给product分区的模块依赖,可额外添加product_available: true }
修改完成后重新执行构建,Soong会自动生成对应分区的变体,依赖报错就会消失。构建完成后你可以在out目录下的vendor、recovery相关产物路径中找到对应分区的libmylibrary.so文件。
内容的提问来源于stack exchange,提问作者fadedbee
相关产品推荐
相关产品推荐

