【问题标题】:Groovy/build.gradle: Get if Debug or ReleaseGroovy/build.gradle: Get if Debug or Release
【发布时间】:2022-01-03 11:32:55
【问题描述】:

我正在寻找一种简单的方法来确定在我的库的 build.gradle 脚本(在任务中)中是否正在为调试或发布模式构建 Android 应用。

我有一个名为prepareHermes 的任务,它提取一个.aar 文件。我目前总是提取调试变体,但在发布版本中我想使用发布变体:

  task prepareHermes() {
    doLast {
      def IS_DEBUG = // TODO: here
      def aarName = IS_DEBUG ? "hermes-debug.aar" : "hermes-release.aar"
      def hermesAAR = file("$hermesPackagePath/android/${aarName}")

      if (!hermesAAR.exists()) {
        throw new GradleScriptException("The hermes-engine npm package is missing \"android/${aarName}\"", null)
      }

      def soFiles = zipTree(hermesAAR).matching({ it.include "**/*.so" })

      copy {
        from soFiles
        from "$reactNative/ReactAndroid/src/main/jni/first-party/hermes/Android.mk"
        into "$thirdPartyNdkDir/hermes"
      }
    }
  }

这个任务后来在各个地方使用(参见完整代码here),所以制作两个单独的任务(prepareHermesDebugprepareHermesRelease)有点不方便,因为我有大量重复的代码。 (此任务是其他一些任务的依赖项,如完整代码所示。)

【问题讨论】:

    标签: android gradle groovy


    【解决方案1】:

    您还可以根据需要生成任意数量的任务:

    [ 'debug', 'release' ].each{ name ->
    
      task "prepareHermes-$name"{
        doLast {
          def aarName = "hermes-${name}.aar"
          def hermesAAR = file "$hermesPackagePath/android/$aarName"
          // the rest...
        }
      }
    
    }
    

    然后如果你运行gradlew tasks,你会在输出中看到prepareHermes-debugprepareHermes-release

    【讨论】:

      【解决方案2】:

      使用gradle.startParameter.taskRequests 确定当前变体不是一个好主意。**

      1. Android Gradle 插件 (AGP) 是基于 Gradle 平台构建的。
      2. Android Variant 是上层的概念。
      3. Gradle gradle.startParameter.taskRequests API 在 Under layer,它不是 Variant Aware。

      不支持这样的场景:

      ./gradlew clean assemble
      

      上面的命令会产生DebugRelease 工件,这会破坏使用taskRequests 的检查脚本。

      制作两个单独的任务(prepareHermesDebug 和 prepareHermesRelease)有点不方便...

      是的,我们将使用onVariants{} API 来做类似的事情。基本上,它会迭代所有变体对象,以便您有机会分别注册 Variant Aware 任务:

      androidComponents {
          onVariants { variant ->
              project.tasks.register<AarUploadTask>("${variant.name}AarUpload") {
                  aar.set(variant.artifacts.get(SingleArtifact.AAR))
              }
          }
      }
      
      abstract class AarUploadTask: DefaultTask() {
      
          @get:InputFile
          abstract val aar: RegularFileProperty
      
          @TaskAction
          fun taskAction() {
              println("Uploading ${aar.get().asFile.absolutePath} to fantasy server...")
          }
      }
      

      通过上面新的 Variant&Artifact APIs(在 Kotlin DSL 中抱歉,但你可以很容易地将其转换为 groovy),你可以得到 Variant 对应的.aar 并方便地将其传递给自定义任务(不再使用硬编码) .

      查看android/gradle-receipt 的完整脚本,以及Extend the Android Gradle plugin 的更多API 文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 2023-01-11
        • 1970-01-01
        • 2017-08-03
        相关资源
        最近更新 更多