Android - 仅在发布版本变体上执行 Gradle 任务
Posted
技术标签:
【中文标题】Android - 仅在发布版本变体上执行 Gradle 任务【英文标题】:Android - Only execute Gradle task on release build variant 【发布时间】:2015-07-06 05:19:52 【问题描述】:我正在尝试将我的 build.gradle 文件配置为仅在选择发布构建变体时执行 gradle 任务。到目前为止,我的任务总是被执行,无论是在我的调试或发布构建类型中还是在签名配置中。我尝试在 applicationsVariants 块中添加我的任务并检查它是否是发布变体,但它只是循环遍历所有变体。
applicationVariants.all variant ->
variant.outputs.each output ->
...
我知道调试和发布任务总是针对您选择的任何构建变体运行。是否可以仅在创建发布版本时执行某些代码?如果是这样,该代码在哪里?谢谢!
我已经阅读了有关此问题的所有 *** 问题,但没有一个答案是我真正想要的。我的最终目标是,当我为 Play 商店构建选择“发布”构建变体时,会向我们的服务器发布一条消息。我不希望仅在调试时发生这种情况。
【问题讨论】:
“我的最终目标是,当我为 Play 商店构建选择“发布”构建变体时,会向我们的服务器发布一条消息。“那么,当构建变体为从 IDE Build Variant 窗口中选择? 是的。如果我从 Build Variant 窗口中选择“发布”,我只希望在构建过程中执行某些任务。如果选择了“调试”,则不应执行这些任务。 您的问题颇具误导性。您不想在选择 Build Variant 时执行某个任务,而是在执行特定的 Gradle 任务(assembleRelese 或 assembleDebug)时执行。在这种情况下,“assembleRelease.dependsOn customTask”应该可以完成这项工作。 【参考方案1】:为您感兴趣的构建类型添加doFirst
或doLast
。
android.applicationVariants.all variant ->
if ( variant.buildType.name == "release")
variant.assemble.doLast // Can also use doFirst here to run at the start.
logger.lifecycle("we have successfully built $v.name and can post a messaage to remote server")
【讨论】:
第一行出现“无方法签名”错误。 Try #2 让我回到原来的问题,如果我将“debug”换成“release”,但将 Build Variant 设置为“debug”,if 语句中的代码仍然会被调用在每个构建中。 @Mark 我想我终于理解你了 :) 我再次更新了我的答案。 警告:这可能会减慢您的构建速度。 在抱怨构建缓慢的人身上,我们一遍又一遍地反复看到的一件事就是“doLast”。 "doLast" 不好,gradle 无法理解你的任务现在是否是增量的,因为它不知道你在里面做什么。 youtu.be/7ll-rkLCtyk?t=36m4s @Mark,在变体闭包之外有什么办法吗?【参考方案2】:我必须做这样的事情来检查构建版本:
buildTypes
applicationVariants.all variant ->
variant.outputs.each output ->
def project = "AppName"
def separator = "_"
/*def flavor = variant.productFlavors[0].name*/
def buildType = variant.variantData.variantConfiguration.buildType.name
def versionName = variant.versionName
def versionCode = variant.versionCode
def date = new Date();
def formattedDate = date.format('yyyyMMdd_HHmm')
if (variant.buildType.name == "release")
def newApkName = project + separator + "v" + versionName + separator + versionCode + separator + buildType + separator + formattedDate + ".apk"
output.outputFile = new File(output.outputFile.parent, newApkName)
if (variant.buildType.name == "debug")
def newApkName = project + separator + "v" + versionName + separator + versionCode + separator + buildType + ".apk"
output.outputFile = new File(output.outputFile.parent, newApkName)
【讨论】:
您的if (variant.buildType.name == "release")
和 if (variant.buildType.name == "debug")
块是否仅针对这些构建类型运行?以上是关于Android - 仅在发布版本变体上执行 Gradle 任务的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin Android Admob 测试广告仅在设备上显示一次
为啥 apk 仅在 Android 10 的发布版本中中止?