基于产品口味维度创建Gradle任务

5

我在build.gradle中有以下的productFlavors:

productFlavors {

    free {

    }
    paid {

    }       
}

现在我添加了一个口味维度(http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Multi-flavor-variants),像这样:
flavorDimensions "payment", "releasetype"

productFlavors {

    paid {
        dimension "payment"
    }
    free {
        dimension "payment"
    }
    beta {
        dimension "releasetype"
    }

    major {
        dimension "releasetype"
    }
}

我正在使用这个脚本来生成Jacoco覆盖率报告的Gradle任务。该脚本将构建类型(debug、release)与产品口味(付费、免费等)组合在一起,并相应地生成任务。
当然,由于口味维度的存在,这种方法已经失效了,因为该脚本没有考虑到它们。
该脚本生成以下任务:
testDebugPaidUnitTestCoverage
testDebugFreeUnitTestCoverage
testDebugBetaUnitTestCoverage
testDebugMajorUnitTestCoverage

它应该做的是:
testDebugPaidBetaUnitTestCoverage
testDebugPaidMajorUnitTestCoverage
...

我尝试通过gradle任务访问flavorDimensions

android.flavorDimensions

但它无法识别该属性:
Error:Could not get unknown property 'flavorDimensions' for object of type com.android.build.gradle.LibraryExtension.

你有没有什么建议可以扩展这个脚本,使其能够与口味维度一起使用或如何从我的外部jacoco.gradle脚本中访问它们?

我可以从那里访问构建类型和产品口味,所以这应该是可能的吗?

2个回答

1
我认为Sam在他的回答中是正确的,但他没有解释为什么变体是关键,也没有将他的例子与相关的脚本联系起来。我来试着回答一下。
问题在于该脚本循环遍历产品风味,然后在嵌套循环中构建类型:
productFlavors.each { productFlavorName ->
    buildTypes.each { buildTypeName ->
        ...
    }
}

由于productFlavors是所有ProductFlavor实例的列表,而不是跨维度的ProductFlavor组合的列表,因此它无法提供您要寻找的多维支持。
变体为您提供了产品风味和构建类型的所有组合。不需要嵌套循环,只需循环应用程序变体或库变体,具体取决于您是在处理应用程序还是库。例如:
applicationVariants.each { variantName ->
    ...
}

看着这个脚本,我发现你会遇到一个挑战:脚本构建了一个源目录路径,使得 buildType 目录是 product-flavor 目录的子目录:sourcePath = "${productFlavorName}/${buildTypeName}"。由于变体名称是一个字符串,这种路径构造方式不起作用。然而,自从这个问题被提出以来已经过去了很多年,脚本的其余部分可能也需要进行全面改进。
Gradle 给你的另一个有用的集合是 flavorDimensions。在这个例子中,它们将是字符串“payment”和“releasetype”。通过一些巧妙的循环,可以重现你通过变体“免费”获得的组合。

0

我不擅长使用Gradle。

但是也许你可以尝试以下方法:

如果你的模块是库;

variants = android.libraryVariants.collect { var ->
    var.name
}

如果你的模块是应用程序;

variants = android.applicationVariants.collect { var ->
    var.name
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接