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】:

为您感兴趣的构建类型添加doFirstdoLast

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 任务的主要内容,如果未能解决你的问题,请参考以下文章

travis.ci 上的 Android 构建变体

Android Studio 构建变体问题

Xamarin Android Admob 测试广告仅在设备上显示一次

为啥 apk 仅在 Android 10 的发布版本中中止?

Facebook 分享对话框始终仅在 Android 上显示验证码

使用 Google 登录无法在 Android 上运行(仅在 iOS 上) - Flutter