有没有办法在Android.bp中添加/删除模块?

有没有办法在Android.bp中添加/删除模块?,android,android-soong,Android,Android Soong,我正在尝试根据Environment变量集在Android.bp中添加/删除模块。 例如,如果我将1设置为BUILD_SOURCE,则在Android.bp中删除cc_prebuild_二进制文件,并添加一些cc_二进制文件 我看过指南,也看过下面的句子, 宋楚瑜故意不支持Android.bp文件中的条件。相反,构建规则中需要条件的复杂性在Go中处理 但是我找不到控制整个模块的方法,而不是模块中的属性 有人知道怎么做或者导游在哪里吗 提前感谢:)我假设您有以下设置: cc_binary {

我正在尝试根据Environment变量集在Android.bp中添加/删除模块。 例如,如果我将1设置为BUILD_SOURCE,则在Android.bp中删除cc_prebuild_二进制文件,并添加一些cc_二进制文件

我看过指南,也看过下面的句子,

宋楚瑜故意不支持Android.bp文件中的条件。相反,构建规则中需要条件的复杂性在Go中处理

但是我找不到控制整个模块的方法,而不是模块中的属性

有人知道怎么做或者导游在哪里吗


提前感谢:)

我假设您有以下设置:

cc_binary {
  name: "my_binary",
  srcs: ["some_file.cc"]
}

cc_prebuilt_binary {
  name: "my_binary_prebuilt",
  srcs: ["some_blob"]
}
我建议采取以下办法:

步骤1:有条件地选择模块 Song build系统要求模块名称是唯一的。因此,在您的例子中,
cc\u预构建的二进制文件
cc\u二进制文件
需要不同的名称。因此,在需要这些模块的地方,您必须选择正确的模块

由于您处理的是二进制文件,因此我假设您是通过一些
.mk
文件中的
PRODUCT\u PACKAGES
变量来选择这些模块(与库相反,库也可以被选为另一个模块的依赖项)。然后,您将调整
产品包
声明,例如:

ifeq ($(BUILD_SOURCE),1)
    PRODUCT_PACKAGES += my_binary
else
    PRODUCT_PACKAGES += my_binary_prebuilt
endif
步骤2:有条件地启用模块 如果两个模块的源文件始终可用,则不需要进一步的工作。但是,如果在
BUILD\u SOURCE=1
时预构建的二进制文件根本不可用,则需要完全禁用此模块。这不同于在步骤1中不选择它:对于禁用的模块,不会验证
srcs
中指定的文件的可用性

可以通过以下方式手动禁用:

cc_prebuilt_binary {
  name: "my_binary_prebuilt",
  srcs: ["some_blob"],
  enabled: false
}
但是,我假设您希望根据
BUILD\u SOURCE
环境变量自动执行此操作

为此,您可以定义一个自定义模块预设(例如,在文件
my\u prebuilded\u preset.go
中),该预设基于
BUILD\u SOURCE
环境变量设置
enabled
标志:

package my_prebuilt_preset

import (
    "android/soong/android"
    "android/soong/cc"
)

func myPrebuiltDefaults(ctx android.LoadHookContext) {
    type props struct {
        Target struct {
            Android struct {
                Enabled *bool
            }
        }
    }

    p := &props{}
    p.Target.Android.Enabled = new(bool)
    *p.Target.Android.Enabled = !ctx.AConfig().IsEnvTrue("BUILD_SOURCE")

    ctx.AppendProperties(p)
}

func myPrebuiltDefaultsFactory() android.Module {
    module := cc.DefaultsFactory()
    android.AddLoadHook(module, myPrebuiltDefaults)

    return module
}

func init() {
    android.RegisterModuleType("my_prebuilt_preset", myPrebuiltDefaultsFactory)
}
您需要在Android.bp中为Go文件添加一个模块:

bootstrap_go_package {
    name: "soong-my_prebuilt_preset",
    pkgPath: "android/soong/external/my_prebuilt_preset",
    deps: [
        "soong",
        "soong-android",
        "soong-cc"
    ],
    srcs: [
        "my_prebuilt_preset.go"
    ],
    pluginFor: ["soong_build"]
}
然后将预设添加到您的
my\u binary\u预构建的

my_prebuilt_preset {
  name: "my-prebuilt-preset"
}

cc_prebuilt_binary {
  name: "my_binary_prebuilt",
  srcs: ["some_blob"],
  defaults: ["my-prebuilt-preset"]
}

BUILD\u SOURCE=1
时,您的
my\u binary\u prebuilded
应该被禁用,并且其
srcs
字段不应该被评估。

还不是完整答案,但是您可以通过在模块声明中添加enabled:false来禁用Android.bp中的模块。也许您可以根据环境变量(参考:)在Go中设置此标志?您可以给我一些关于启用<代码>的示例,例如文档、链接、、、?或者,是否可以使模块不带SRC?