【问题标题】:Share Android.variantFilter for all app modules为所有应用模块共享 Android.variantFilter
【发布时间】:2022-08-15 23:59:13
【问题描述】:

我想对我所有的 android 应用程序模块的 android.variantFilter(...) 使用相同的实现。

目前我在 \"app\"-Module 中有这样一个 variantFilter 可以正常工作:

android.variantFilter { variant ->
    String buildType = variant.buildType.name
    String flavor = variant.getFlavors().get(0).name

    if ((buildType == \'debug\' && (flavor == \'canary\' || flavor == \'int\' || flavor == \'prd\')) ||
            (buildType == \'release\' && (flavor == \'dev\' || flavor == \'loc\')))
        variant.setIgnore(true)
}

该应用程序包含几个模块,但我想过滤变体全部模块也一样。无需在所有模块的 build.gradle 文件中重新实现相同的 variantFilter。

所以我的问题是:有没有办法在中心位置定义该过滤器(例如应用程序的顶级builg.gradle 文件)并在模块特定的build.gradle 文件中引用它?

    标签: android build.gradle android-build-flavors


    【解决方案1】:

    要么将脚本放在父目录中名为 variants.gradle 的文件中,要么将其放在 apply it 中:

    apply from: '../variants.gradle'
    

    或使用AndroidComponentsExtension.beforeVariants

    在这个阶段,访问 DSL 对象是不允许的,在构建 VariantBuilderT 对象之前,使用finalizeDsl 方法以编程方式访问 DSL 对象。

    DslLifecycle.finalizeDsl(唯一可用的选项):

    API 用于在从构建文件评估之后以编程方式自定义 DSL 对象,然后再用于构建过程的后续步骤(如变体或任务创建)。

    这意味着,可以以编程方式配置变体,而无需显式声明它们。看到这个answer of mine...它可能不是variant.setIgnore(true),而是variant.enabled = false

    【讨论】:

    • 抱歉回复晚了,假期不在办公室……简单就是美丽。我喜欢使用单独的文件来定义构建变体的方法。目前正在测试。
    【解决方案2】:

    我相信这是您想要在顶级 build.gradle 上实现的目标,或者这是您已经拥有的:

    android {
        ...
        defaultConfig {...}
        buildTypes {
            debug{...}
            release{...}
        }
        productFlavors {
            canary {...}
            int {...}
            prd {...}
            dev {...}
            loc {...}
        }
        variantFilter { variant ->
            String buildType = variant.buildType.name
            String flavor = variant.flavors*.name
            
            if ((buildType == 'debug' && (flavor == 'canary' || flavor == 'int' || flavor == 'prd')) ||
                    (buildType == 'release' && (flavor == 'dev' || flavor == 'loc')))
                variant.setIgnore(true)
        }
    }
    

    在 developer.android 官方网页上有更多信息:Configure Build Variants

    【讨论】:

    • 产品风味不是在顶层定义的,而是在模块内部定义的,因此更往下一层。因此,模块特定的 gradle 文件中的每个模块都有一个定义。
    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 2020-02-26
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多