【问题标题】:How to execute a task after assembleRelease?assembleRelease 后如何执行任务?
【发布时间】:2016-12-29 17:14:27
【问题描述】:

Firebase-Crash has a new feature。您可以使用 Gradle 命令上传您的 mapping.txt./gradlew :app:firebaseUploadReleaseProguardMapping

我想自动化这个过程。我想在创建发布 apk 后立即将该 mapping.txt 文件上传到 Firebase。

如何在成功的assembleRelease 之后强制 Gradle 执行firebaseUploadReleaseProguardMapping?有没有更简单的方法来做到这一点?

【问题讨论】:

  • 你是怎么解决这个问题的?
  • 我还没解决。我正在使用@Doug Stevenson 的解决方案,但这并不是我想要的。

标签: android gradle android-gradle-plugin firebase-crash-reporting


【解决方案1】:

一般来说,您可以使用dependsOn 方法为任务定义依赖项。

例如:

task A << {
    println 'Hello from A'
}

task B << {
    println 'Hello from B'
}

B.dependsOn A

你会得到

> gradle -q B
Hello from A
Hello from B

在您的情况下,您可以指定:

firebaseUploadReleaseProguardMapping.dependsOn assembleRelease

您也可以使用finalizedBy 方法。

A.finalizedBy B

请注意:

  • 即使A 失败,这也会运行B
  • finalizedBy 被标记为“正在孵化”,这意味着这是一个实验性功能,其行为可以在未来的版本中更改。

【讨论】:

  • 使用这个解决方案我必须运行./gradlew :app:firebaseUploadReleaseProguardMapping。我对吗?我不想改变主要任务。我的意思是,我想运行./gradlew :app:assembleRelease
  • 你是对的。我知道还有另一种方法,但请注意。
  • 您需要的不是 firebaseUploadReleaseProguardMapping.dependsOn assembleRelease: assembleRelease.dependsOn firebaseUploadReleaseProguardMapping
【解决方案2】:
project.tasks.whenTaskAdded { Task task ->
if (task.name == 'assembleRelease') {
    task.doLast {
        println("makeSystemSignature")
    }
    task.finalizedBy(makeSystemSignature)
}}

【讨论】:

  • 请在您的答案中添加一些解释,以便其他人可以从中学习
  • 正如这个答案所使用的,如果你想总是一个接一个地运行一个任务,应该使用 finalizedBy,而不是 dependsOn。棘手的部分是您要调用 finalizedBy 的任务不存在并且在构建过程中自动添加,因此直接引用它会导致错误。答案是等到添加任务后才能像这个答案一样配置 finalizedBy。
【解决方案3】:

仔细查看以 firebaseUploadReleaseProguardMapping 为目标时执行的任务链:

...
:app:transformClassesWithDexForRelease
:app:mergeReleaseJniLibFolders UP-TO-DATE
:app:transformNative_libsWithMergeJniLibsForRelease
:app:transformNative_libsWithStripDebugSymbolForRelease
:app:packageRelease
:app:assembleRelease
:app:firebaseUploadReleaseProguardMapping

看到 firebaseUploadReleaseProguardMapping 已经依赖于 assembleRelease。您不需要为您尝试执行的操作强制任何其他依赖项 - 插件已经设置了依赖项,因此当您告诉 gradle 运行该任务时,它已经完成了发布构建。如果您总是想在成功发布构建后上传,只需定位 firebaseUploadReleaseProguardMapping 而不是 assembleRelease。

【讨论】:

    【解决方案4】:

    可以定义一个外部工具“生成签名的 APK 并上传 ProGuard 映射文件”——而不是“生成签名的 APK”按钮,因为任务firebaseUploadReleaseProguardMapping 依赖于assembleRelease,因此会总是 执行它。 Firebase 插件最近更新为 1.1.0 ...

    结果:

    :mobile:assembleRelease
    :mobile:firebaseUploadReleaseProguardMapping
    Attempting to upload Proguard mapping file...
    

    【讨论】:

      猜你喜欢
      • 2019-02-22
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-08
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      相关资源
      最近更新 更多