gpt4 book ai didi

android - 如何在 Gradle 中的 buildType 上添加条件 afterEvaluate

转载 作者:行者123 更新时间:2023-11-29 14:26:34 37 4
gpt4 key购买 nike

我的 build.gradle 文件末尾有这段代码:

         project.afterEvaluate {

// If you add/change build types, you have to add to/change
// these task names.
mergeDebugAssets.dependsOn project.tasks.getByName('downloadLicenses')
mergeReleaseAssets.dependsOn project.tasks.getByName('downloadLicenses')

}

参见:Copy generated third party licenses to assets完整代码

这过去工作正常(不管设置了哪个 buildType)但是如果将我的依赖项更新到最新版本这会触发异常(当使用 buildType='debug' 构建时):

无法为项目“:application”获取未知属性“mergeReleaseAssets”

我的想法是,也许将这个 block 分成两部分,并将它们放在 buildTypes 配置下。但这不起作用,因为它无论如何都会尝试评估代码并崩溃。

有什么想法吗?

更新 1:根本原因? https://code.google.com/p/android/issues/detail?id=219732

更新 2:糟糕的解决方法:

try {
mergeDebugAssets.dependsOn project.tasks.getByName('downloadLicenses')
} catch (Exception e) {
// Expected when building variant Release
}
try {
mergeReleaseAssets.dependsOn project.tasks.getByName('downloadLicenses')
} catch (Exception e) {
// Expected when building variant Debug
}

最佳答案

afterEvaluate 中引用 release 任务时出现错误的原因可能是因为 Android Studio 的 Instant Run 功能使用了特殊的 Android Gradle plugin feature只构建调试 应用程序变体。这意味着只有 debug 任务被创建,因此当您引用它们时找不到 release 任务。

有几种方法可以解决这个问题:

  1. 使用字符串按名称搜索相关任务。如果 Android 构建系统将来更改了任务名称,您的额外构建规则将不会运行,但您可能甚至不会注意到。

  2. 要确定发布任务是否存在,请检查是否存在名称在未来不太可能更改的任务。也许 assembleRelease 符合这个要求。

  3. 要确定发布任务是否存在,请检查发布应用程序变体是否使用类似以下内容构建:

    project.afterEvaluate {
    if (!android.applicationVariants.matching { it.buildType.name == 'release' }.isEmpty()) {
    mergeReleaseAssets.dependsOn project.tasks.getByName('downloadLicenses')
    }
    }

最后一个选项看起来有点恶心,但希望如果将来 Android 构建系统任务名称发生变化,它会快速失败。

关于android - 如何在 Gradle 中的 buildType 上添加条件 afterEvaluate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41239220/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com