gpt4 book ai didi

java - 如何正确处理类依赖关系以利用 Gradle 在 Java/Android 中的增量编译?

转载 作者:行者123 更新时间:2023-12-03 05:38:25 29 4
gpt4 key购买 nike

我改进了我们的构建系统并激活了增量构建和编译,如 this 中所述。问题。令我失望的是,增量编译并没有像我在阅读 Gradles blog post 时所期望的那样缩短构建时间。 .

经过一番调查,我意识到问题在于,即使我只在应用程序深处的某个小类中添加了评论,显然几乎整个代码库都被重建了。事实上,我接触哪个类并不重要,Gradles --debug输出显示它基本上总是重新编译 476 个类。

Incremental compilation of 476 classes completed in 12.51 secs.



虽然我理解 public static更改文件中的常量会触发完全重新编译(只是稍微慢一点),我不明白如何正确分解类依赖项以便增量编译真正起作用。确定影响增量编译的类依赖项的确切规则是什么?我可以阅读一些示例 here ,但它似乎根本不适用于我们的(相当标准的)项目。

我自己的一些测试产生了以下结果:
// One of my main classes that has lots of class dependencies
public class A{
public void foo() {
// This line produces a dependency between A and B. So changing just
// a comment in B triggers recompilation of all classes attached to A
B b1 = new B();


}
}

// A small helper class that I want to change
public class B {
public void bar() {
// This line does not create a dependency, so B can still be compiled by
// itself. But usually, that's not the "common" direction you have.
A a1 = new A();
// I make the change here and then trigger a new build
}
}

为什么 A 在实现细节而不是 B 的接口(interface)发生变化时需要重新编译?

我还尝试在接口(interface) C 后面“隐藏”B。我认为这将是打破依赖关系的正确方法(尽管通常非常麻烦)。但事实证明它根本没有帮助。

public class A{
public void foo() {
C c1 = C.cFactory();
}
}

public class B implements C {
public void bar() {
// I make the change here and then trigger a new build
}
}

public interface C {
void bar();

public static C cFactory() {
return new B();
}
}

在我看来,我们有这么大的依赖 blob,我不确定这是否可以合理地改变,即使我认为我们有一个设计合理的代码库。 Android 开发人员中是否有可以有效改进增量编译的最佳实践、指南或设计模式?

我确实想知道其他人是否和我们有同样的问题,如果没有,你做了什么?

最佳答案

问题实际上是我们所有的类都是大依赖图的一部分。这在报价中显示

Incremental compilation of 476 classes completed in 12.51 secs.



基本上,我接触的任何类都会导致重新编译 476 个类。在我们的特定情况下,这是由两种模式引起的。我们在 Android 中使用显式 Intent , which I am not sure how to better handle .此外,我们以这样的方式使用 Dagger,将所有类连接成一个圆圈。

关于接口(interface)问题,我在实现 cFactory() 时犯了一个相当明显的错误。 .因为这会从 C 创建一个类依赖项至 B因此从 A 传递过来至 C .

下面的代码 fragment 打破了 A 的依赖关系。至 B但从 B 创建一个至 A .
public class A{
public static void foo(C input) {
input.foo();
}
}

public class B implements C {
public void bar() {
// I make the change here and then trigger a new build
A.foo(this);
}
}

public interface C {
void bar();
}

关于java - 如何正确处理类依赖关系以利用 Gradle 在 Java/Android 中的增量编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54600574/

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