【问题标题】:How Do I Stop Gradle for Android From Building *All* Library Module Build Types On Every Build? [duplicate]如何停止 Gradle for Android 在每次构建时构建 *All* 库模块构建类型? [复制]
【发布时间】:2015-03-25 15:46:29
【问题描述】:

我确定以前有人问过这个问题,但我只是找不到合适的关键字来找出答案,所以...

当我请求构建一个构建类型时,如何阻止 Gradle for Android(在 Android Studio 内部或外部)构建库模块的所有构建类型? IOW,如果我正在构建 debug,如何防止 Gradle for Android也构建 release?


背景故事,对于那些有不同想法的人:

假设我有两个 Android Studio 项目,A 和 B。每个项目都有两个模块:一个 Android 库模块和一个依赖于该库的演示应用程序。所以,我一共有四个模块:

  • AL:项目A的库
  • AD:项目A的demo app
  • BL:项目B的库
  • BD:项目B的demo app

只要 A 和 B 没有血缘关系,生活就是美好的。

但是如果我想让 BL 依赖于 AL 怎么办?

对于release,如果我希望这些库进入 Maven 风格的工件存储库,我需要 BL 的 release 变体依赖于 A 的已发布工件>L。这样,我的 BL POM 就有了正确的依赖信息。

对于debug,如果 BL 可以依赖于 AL 的工作副本,那将是理想的选择。虽然设置起来有点麻烦,但我可以让它工作。

但是,如果我向 AL 添加一些东西,例如一个新的 Java 类,并且我尝试从 BL 使用它,我将无法构建。我的debug 构建非常好 AFAICT。然而,即使我现在真的真的不想做 release 构建,Android 的 Gradle 仍然坚持做 release 构建:

$ gradle assembleDebug
:demo:preBuild UP-TO-DATE
:demo:preDebugBuild UP-TO-DATE
:demo:compileDebugNdk UP-TO-DATE
:demo:checkDebugManifest
:demo:preReleaseBuild UP-TO-DATE
:richedit:compileLint
:richedit:copyReleaseLint UP-TO-DATE
:richedit:mergeReleaseProguardFiles UP-TO-DATE
:richedit:preBuild UP-TO-DATE
:richedit:preReleaseBuild UP-TO-DATE
:richedit:checkReleaseManifest
:richedit:prepareReleaseDependencies
:richedit:compileReleaseAidl UP-TO-DATE
:richedit:compileReleaseRenderscript UP-TO-DATE
:richedit:generateReleaseBuildConfig UP-TO-DATE
:richedit:generateReleaseAssets UP-TO-DATE
:richedit:mergeReleaseAssets UP-TO-DATE
:richedit:generateReleaseResValues UP-TO-DATE
:richedit:generateReleaseResources UP-TO-DATE
:richedit:packageReleaseResources
:richedit:processReleaseManifest UP-TO-DATE
:richedit:processReleaseResources
:richedit:generateReleaseSources
:richedit:compileReleaseJava

(在我上面的命名法中,richedit 是 BL,demo 是 BD)

我要求组装debug 构建,但它仍然编译release 构建。 release 构建无法编译,因为我试图让 BL 使用 AL 中未发布的新内容。

虽然不是 100% 肯定,但我有理由相信,如果 Gradle for Android 在我尝试构建 debug 时会愉快地忽略 release,那么我的状态会很好。

当然,也有可能的解决方法:

  • 我可以放弃这些是独立库的想法,并将它们合并为一个。我可能还会这样做。但我确实感觉我正在尝试做的事情应该是可能的。

  • 在发布release AL 之前,我无法尝试使用 AL 更改,在这种情况下为 BL 可以依赖于 debug 和 release 的已发布工件。然而,这似乎会在 A 项目中导致大量补丁级别的流失,因为我的这个新 A 功能的主要消费者“用例”是 B。仅仅因为我在 A 中有通过仪器测试的更改并不意味着它们'将是 B 所需要的,直到我可以使用 A 中的更改构建 B 之前我不会知道这一点。

  • 上述解决方法的一个变体可能是SNAPSHOT 版本,我会以某种方式启用检查SNAPSHOT 版本的debug,但不检查release 或其他东西。然而,Maven、Gradle、Android 和SNAPSHOT 的组合似乎都没有得到充分的记录,我不知道这是否是我应该追求的东西。而且,与前面的子弹一样,这仍然会导致release 被不必要地构建;在我的情况下构建会成功。

是否有一些我缺少的 Gradle for Android 设置说 debug 表示 只是 debug?

【问题讨论】:

  • 我并不精通 Gradle,所以这可能是一派胡言 :-| - 你能打开Build Variants 面板(查看> 工具窗口> 构建变体)并为richedit 模块选择debug 吗?
  • @Vikram:就是这样。反过来,这意味着当您构建或运行项目时,它将执行assembleDebug 任务,并导致所描述的问题。我碰巧使用命令行 gradle assembleDebug 任务来显示 Gradle 成绩单,但结果是一样的。不过谢谢!
  • @AmrutBidri:该评论仅适用于自定义构建类型。现在,我只使用debug 和release。不过谢谢!

标签: android android-studio android-gradle-plugin


【解决方案1】:

https://stackoverflow.com/a/27278352/535762 如果您解决了您的问题,我很想知道如何解决,因为使用 gradle 构建并只考虑调试肯定还不能完全发挥作用。

这里是基本部分:

在左侧的“构建变体”面板窗口中,您应该会看到两个模块,以及它们旁边的当前“活动”变体。比如

app debug 
custom_lib debug

Build > Make Project

正在以当前变体构建项目中的每个模块

https://code.google.com/p/android/issues/detail?id=52962 将需要构建 custom_lib 的发布变体,因此您最终会构建两者。

使用Make Module app 选项。此选项会根据项目面板中的当前选择或当前编辑器从 app 更改为 lib,并且始终只执行构建当前模块所需的操作。

【讨论】:

  • 这表明我的问题是重复的。我几乎放弃了这个问题,所以我不希望测试 Xav 的解决方案是否实用。很可能是这样,尽管自 2014 年 12 月以来 Android Studio 的变化可能会影响问题。非常感谢!
  • 哦,很抱歉没有明确的答案。我对其进行了编辑以确保每个人都能看到重要部分。
【解决方案2】:

这里有一个错误:https://code.google.com/p/android/issues/detail?id=52962

是否评论 #35 即

尝试在依赖项目中设置此项

android {
    publishNonDefault true
    ...
}

这个在使用它的项目中

dependencies {
    releaseCompile project(path: ':theotherproject', configuration: 'release')
    debugCompile project(path: ':theotherproject', configuration: 'debug')
}

取自这里: https://code.google.com/p/android/issues/detail?id=66805

为你工作?似乎是大多数人认为有效的一种,我还没有亲自尝试过。

【讨论】:

  • 对不起,这不会改变行为。此外,它会破坏发布构建的 POM,这需要依赖于工件,而不是一些对等项目。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-10-21
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2023-03-05
  • 2020-08-29
  • 1970-01-01
相关资源
最近更新 更多