我有问题。我的项目结构看起来像这样:
P
| -SubP1
| -SubP2
两个包中都有两个存根类 android.media.IRemoteDisplay 。它们的实现不同,但事实并非如此 - 当我在Android上运行应用程序时,它们将被系统类所取代。
但是,有一个问题 - 我无法构建项目,因为dexMerger失败了 - 它说有两个冲突的类。我能理解这个错误 - 毕竟,真的有两个相互矛盾的类:)
但是当我尝试在build.gradle中排除这些文件时:
sourceSets {
main {
java {
srcDir 'src'
exclude '**/android/media/**'
}
}
}
编译失败,因为它无法找到 android.media.IRemoteControlDisplay 类(以及它的嵌套类)。
我如何仍然使用这些类,但将它们从生成的DEX文件中排除?
请 DON' T 提问是否有权从已编译的项目中排除该类 - 这是正确的做法,我已经做过了,但是我是手动的 - 通过将SubP1和SubP2预先编译为jar,然后从这些jar文件中手动删除IRemoteController.class,然后将这些jar包含在P中。
我也对这个解决方案感到满意:
1.构建SubP1
2.从SubP1.jar中删除IRemoteControlDisplay.class
3.构建SubP2
4.从SubP2.jar中删除IRemoteControlDisplay.class
5.将SubP1.jar和SubP2.jar作为依赖关系添加到P
6.建立P
如果有可能,请告诉我。
答案 0 :(得分:1)
最后,我已经能够做到了。
我需要的是运行时依赖项而不是编译时依赖项。因此,我为SubP1创建了一个名为SubSubP1的子模块(例如)将android.media.IRemoteDisplay移动到SubSubP1中,并为SubP2创建了子模块SubSubP2,并对存根类做了相同的操作。然后,我已经为SubP1和SubP2声明了依赖关系:
dependencies {
provided project(':SubP1:SubSubP1')
}
和
dependencies {
provided project(':SubP2:SubSubP2')
}
这就是诀窍!而不是编译类,Gradle假定它们将在运行时加载。