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

时间:2017-10-27 08:52:36

标签: android android-gradle android-studio-3.0

我有一个包含4个模块的项目,例如A,B,C,D。模块C是A,B和D中公共代码的容器。模块C使用Wire从Protobuffers生成Java代码。模块B依赖于模块C和D.我在B中只有一个编译项目依赖,因为B编译D编译C ..

直到去年的Android Studio Update,当我失去编辑器时,一切正常,即模块仍然很好,但是在模块A和B中编辑的Android Studio错过了生成的Java类并且画了我的代码"公平"红色,即C中生成的类对编辑器来说是未知的,丢失了语法完成和所有其他东西。

在谷歌开票后什么也没发生。我花了一段时间来解决这个问题

 sourceSets {
    main.java.srcDirs += '../common/build/generated/source/java/'
}

在我的(A或B)格斗中。这保持了编辑的完整性,无论如何项目正在建设中。

使用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:\00meins\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:\00meins\AndroidStudioProjects\Badgers-UI\app\src\main\java, D:\00meins\AndroidStudioProjects\Badgers-UI\app\src\debug\java, D:\00meins\AndroidStudioProjects\Badgers-UI\app\build\generated\source\r\debug, D:\00meins\AndroidStudioProjects\Badgers-UI\app\build\generated\source\buildConfig\debug, D:\00meins\AndroidStudioProjects\Badgers-UI\app\build\generated\source\aidl\debug, D:\00meins\AndroidStudioProjects\Badgers-UI\app\build\generated\source\rs\debug]'

困惑的评论:当我绝望地尝试降级gradle,gradle工具等以及Android Studio以前Android Studio版本的状态由于越来越多的依赖关系而放弃了一半的方式并且让事情回到了AS3.0的状态交付和我的模块建立。

然而,在重新启动AS3.0之后,我又回到了上述两难境地。我的意思是我不能每次都来回编辑我的gradle设置以获得构建的工作。

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

我现在正在AFK度过一个漫长的周末,希望能在下周初找到答案。

参考文献:

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

1 个答案:

答案 0 :(得分:0)

这不是一个超级答案,因为事情是复杂而真实的世界。但Google支持人员仔细检查了我的设置,发现需要生成代码的某个源设置,这在AS2.2下是可选的。

所以,如果你从AS3开始,它可能不会发生。但是随着时间的推移,事情变得一团糟,并且在迁移后突然停止工作,这一点并不是很明显。