如何在Android.bp文件中添加条件判断语句实现条件编译
Android.bp 实现条件编译指定模块的方案
Android.bp 是Soong构建系统的声明式配置文件,原生不支持过程式的if判断语法,要实现自定义target_build开关控制gzip模块是否参与编译,有两种官方支持的落地方案:
方案1:轻量无代码方案(推荐,无需修改Soong核心逻辑)
使用Soong内置的soong_config_module_type能力,自定义带条件判断的模块类型,全程不需要写Go插件代码,步骤如下:
- 首先声明绑定了自定义开关的条件模块类型,指定开关为布尔类型,控制模块的
enabled属性:
soong_config_module_type { name: "cc_binary_cond", // 基于原生cc_binary类型扩展 module_type: "cc_binary", // 自定义配置命名空间,避免和其他配置冲突 config_namespace: "vendor_custom", // 声明你要用到的布尔型条件变量target_build bool_variables: ["target_build"], // 指定这个条件变量可以控制的模块属性 properties: ["enabled"], }
- 用自定义的条件模块类型声明gzip模块,默认关闭编译,开关打开时自动启用:
cc_binary_cond { name: "gzip", defaults: ["gzip_default"], static_libs: [...], // 默认状态:不参与编译 enabled: false, // 当target_build为true时,覆盖enabled属性为true,模块加入编译 soong_config_variables: { target_build: { enabled: true, }, }, }
- 最后在产品配置Makefile中,需要编译gzip的场景下添加配置打开开关即可:
$(call soong_config_set, vendor_custom, target_build, true)
方案2:Soong插件扩展方案(适合复杂自定义逻辑场景)
如果你的条件判断逻辑比较复杂,不是简单的布尔开关控制,可以通过编写Go语言的Soong插件实现:
- 在厂商自定义的Soong插件目录下注册自定义变量
target_build,将其和产品配置变量绑定 - 在插件的模块处理逻辑中,判断
target_build的值:如果为false,直接将模块的Enabled属性返回为false,跳过编译流程 - Android.bp中的模块声明不需要做特殊改造,插件会自动在加载模块时完成条件判断逻辑
补充:内置条件场景简化写法
如果你的target_build是Soong原生支持的判断维度(比如特定CPU架构、特定OS目标、特定构建变体),不需要自定义配置,直接用内置的条件块即可,示例:
cc_binary{ name: "gzip", defaults: ["gzip_default"], static_libs: [...], // 仅在android arm64目标下编译 target: { android_arm64: { enabled: true, }, }, // 非userdebug版本不编译 product_variables: { debuggable: { enabled: false, }, }, }
内容的提问来源于stack exchange,提问作者user3596362
相关产品推荐
相关产品推荐

