【问题标题】:Exclude module on build Android Studio在构建 Android Studio 时排除模块
【发布时间】:2018-02-25 01:57:43
【问题描述】:

我有一个包含 3 个模块的 Android Studio 项目。甲、乙、丙。 A依赖于C,B依赖于C。 我正在尝试加快构建时间,并且我意识到每次执行 assembleRelease/assembeDebug 任务时,它都会构建所有模块。 每次我构建模块 A 应该只构建 A 和 C,因为 B 在该任务中没有依赖关系,对吗? 每次构建模块 A 时如何避免构建模块 B?

模块 A 依赖项:

dependencies {
    compile project(path: ':c', configuration: 'release')
    provided files('libs/some-lib.jar')
}

模块 B 依赖项:

dependencies {
    compile project(path: ':c', configuration: 'debug')
}

模块 C 依赖项:

dependencies {
    compile files('libs/other-lib.jar')
}

【问题讨论】:

  • 你是如何运行任务的?通过命令行,还是通过 Android Studio 中的 Gradle 对话框?
  • 我正在从 gradle 对话框运行任务。现在我正在从命令行运行任务并且构建时间减少了很多。显然,无论您尝试构建什么,gradle 对话框都会构建所有模块
  • 发生的事情是(如果你仔细看的话)从 Android Studio 运行子模块任务实际上是从项目的根目录调用任务。由于根通常包含所有 ref,因此它生成的配置构建树包含所有模块。如果您启动运行子模块任务的 Android Studio 的第二个实例/窗口,则只会基于该模块及其依赖项生成构建树。这在 Gradle 日志中很容易看到。

标签: android android-studio gradle build dependencies


【解决方案1】:

我已经在 cmets 中明确表示,我认为入侵 settings.gradle 来删除模块是个坏主意。

因此,如果您无法在打开两个或更多项目的情况下运行 Android Studio,或者您不想在命令行上调用 Gradle,或者您只想禁用某些模块,因为它们对您不感兴趣,实际上有一种受支持的方法可以做到这一点。 (至少在 Android Studio 的最新版本中,例如 3.2.x。)

  1. 右键单击顶层项目或项目视图中的任何模块
  2. 选择加载/卸载模块...
  3. 卸载不想激活的模块

由于这只会更改您的本地项目并且永远不会意外提交,因此这是一种安全地减少模块开销的安全方法。我认为它甚至会为您进行同步,因此您不必手动强制同步。

【讨论】:

    【解决方案2】:

    There is a bug in Android Studio 如果您使用 Gradle 项目对话框运行任务,这些任务将在根上下文中运行。也就是说,如果您仔细观察,即使是子模块任务也会像在根级别运行相同的任务一样运行。

    解决方案:

    1. 使用命令行 Gradle 或 Gradle 包装器。
    2. 始终运行两个 Android Studio 实例(即打开多个项目)

    【讨论】:

    • 我开始使用以下命令从控制台构建:gradlew a:assembleDebug .. 构建时间减少了很多!谢谢
    【解决方案3】:

    只需在根 settings.gradle 文件中删除相关模块(在本例中为 B)的 include 语句即可阻止 Android Studio 构建 B,因为它会将其从整个 Gradle 项目中排除。该模块将保持不变,但是如果您打算修改其中的任何代码,则需要重新添加 include 语句。另请注意,修改 settings.gradle 文件需要 Gradle Sync 才能使 Android Studio 正常执行。

    【讨论】:

    • 这就像说你不希望模块 B 成为项目的一部分,这可能不是我们想要做的。
    • 这真的取决于事物的实际结构,这有点固执己见。对我来说,如果模块目录位于项目根目录中,我不会认为即使删除了 include 语句,它也不会从项目中删除,它仍然存在但它不活动,因此会导致更少build 是 OP 的核心点
    • 是的,但 Android Studio,至少在 2.x 中,考虑将其删除。它甚至会询问您是否要将其从模块列表中删除,并且它将以普通字体而不是 UI 中的粗体呈现。即使您不“删除”它,而是将其保留在模块列表中但未附加到主项目,也会有各种各样的问题。命令行中的 Gradle 可能仍然有效,但 Android Studio 中的同步和其他 UI 活动将永远不会看到该模块。此外,在团队设置中,此文件是共享的,对其进行调整会导致各种不必要的混乱。
    • 哦,不,我一直都这样做,从来没有遇到过任何问题,它不会导致 gradle 或 android studio 出现任何问题。这个想法实际上是让 android studio 不对模块采取行动或根本不构建它,因为我没有使用它,它只是停止用 gradle 构建它,在我的团队中,我们完全可以接受它。就像我说的那样,这完全是固执己见,没有一个正确的一面,他们可能都是对的,也可能都是错的。就我个人而言,我不觉得它很麻烦,如果我需要看一些东西,代码仍然在那里,我仍然可以在 android studio 中看到它。
    • 每次想要维护它时都必须将模块重新添加到 IDE 中的想法听起来像是一个令人震惊的 hack。特别是当报告问题的原因是由于 Android Studio 中的错误时。是的,根据我的知情意见,你正在做的是一个黑客行为,我特别建议人们不要遵循这个建议。而不是这样做,使模块成为一个库并发布它。因为真的没有理由将 source 放在同一个项目中。
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多