You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:36:17