Android Studio 无法构建具有跨模块依赖性的模块

Android Studio Unable to Build Module with Cross Module Dependancy

我有一个包含 4 个模块的项目,例如 A、B、C、D。模块 C 是 A、B 和 D 中公共代码的容器。模块 C 使用 Wire 生成 Java 代码来自原型缓冲区。模块 B 依赖于模块 C 和 D。不过我在 B 中只有一个编译项目依赖,因为 B 编译 D 编译 C..

去年 Android Studio Update 之前一切正常,当时我 "lost the editor",即模块仍在很好地构建,但是 Android Studio 在模块 A 和 B 中编辑时错过了生成的 Java 类 并将我的代码 "fairly" 涂成红色,即从 C 生成的 类 变得不为编辑器所知,失去了语法完成和所有其他东西。

在 Google 打开工单后没有任何反应。我用了一段时间

的解决方法
 sourceSets {
    main.java.srcDirs += '../common/build/generated/source/java/'
}

在我的(A 或 B)中 gradle。这使编辑器完好无损,项目仍在建设中。

使用 Android Studio 3.0 我不再构建模块。使用上面的 sourceset 行,我最终发现 dexer 重复 类

Information:Gradle tasks [:app:assembleDebug]
Error:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Lde/spieleck/app/badgers/messages/BadgeMsg$Builder;
Error:com.android.dex.DexException: Multiple dex files define Lde/spieleck/app/badgers/messages/BadgeMsg$Builder;
Error:  at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)
Error:  at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)
Error:  at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)
Error:  at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
Error:  at com.android.dx.merge.DexMerger.merge(DexMerger.java:198)
Error:  at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:61)
Error:  at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:36)
Error:  at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1445)
Error:  at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
Error:  at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902)
Error:  at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689)
Error:  at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644)
Error:  at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Error:Execution failed for task ':app:transformDexArchiveWithDexMergerForDebug'.
> com.android.build.api.transform.TransformException: com.android.dex.DexException: Multiple dex files define Lde/spieleck/app/badgers/messages/BadgeMsg$Builder;
Information:BUILD FAILED in 8s
Information:BUILD 61 FINISHED; failure=org.gradle.internal.exceptions.LocationAwareException: Execution failed for task ':app:transformDexArchiveWithDexMergerForDebug'.
Information:16 errors
Information:0 warnings
Information:See complete output in console

没有以上 gradle 行,我最终编译器找不到代码:

Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> Unable to find source java class: 'D:[=13=]meins\AndroidStudioProjects\Badgers-UI\common\build\generated\source\java\de\spieleck\app\badgers\messages\BadgeMsg.java' because it does not belong to any of the source dirs: '[D:[=13=]meins\AndroidStudioProjects\Badgers-UI\app\src\main\java, D:[=13=]meins\AndroidStudioProjects\Badgers-UI\app\src\debug\java, D:[=13=]meins\AndroidStudioProjects\Badgers-UI\app\build\generated\source\r\debug, D:[=13=]meins\AndroidStudioProjects\Badgers-UI\app\build\generated\source\buildConfig\debug, D:[=13=]meins\AndroidStudioProjects\Badgers-UI\app\build\generated\source\aidl\debug, D:[=13=]meins\AndroidStudioProjects\Badgers-UI\app\build\generated\source\rs\debug]'

令人困惑的评论:当我绝望地尝试使用 Android Studio 将 gradle、gradle 工具等降级到以前的 Android Studio 版本时,放弃了一半由于越来越多的依赖关系,并且让事情恢复到 AS3.0 交付和我的模块构建的状态。

然而重启AS3.0后,我又回到了上述困境。我的意思是我真的不能每次都来回编辑我的 gradle 设置来让构建工作。

关于如何更好地设置我的依赖项或修复所有编译、构建和语法突出显示的任何建议?

我现在休假了一个长周末,希望下周初能得到答案。

参考文献:

  1. G+: https://plus.google.com/u/0/+FrankNestel/posts/c177h2R1qJz
  2. Google 问题:https://issuetracker.google.com/issues/37120454

这不是一个超级答案,因为事情是复杂的和真实的世界。但是 Google 支持亲切地检查了我的设置并发现,生成代码的特定源设置已成​​为必需的,这在 AS2.2 下是可选的。

因此,如果您无论如何都从 AS3 开始,这可能不会发生。但随着时间的推移,事情变得一团糟,并且在迁移后突然停止工作,这并不是很明显。