我有一个问题。我的项目结构如下所示:
P
|-SubP1
|-SubP2
两个包中都有两个 stub 类android.media.IRemoteDisplay。它们在实现上有所不同,但这不是问题 - 当我在 Android 上运行应用程序时,它们将被系统类替换。
但是,有一个问题 - 我无法构建项目,因为 dexMerger 失败 - 它说有两个冲突的类。我可以理解这个错误 - 毕竟,确实有两个冲突的类:)
但是当我尝试像这样在 build.gradle 中排除这些文件时:
sourceSets {
main {
java {
srcDir 'src'
exclude '**/android/media/**'
}
}
}
编译失败,因为找不到 android.media.IRemoteControlDisplay 类(及其嵌套类)。
如何仍然使用这些类,但将它们从生成的 DEX 文件中排除?
请不要质疑从编译项目中排除该类是否正确 - 这是正确的做法,我已经这样做了,但是手动 - 通过将 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
如果可能的话,请告诉我。
最佳答案
我终于能够做到了。
我需要的是运行时依赖项,而不是编译时依赖项。因此,我为 SubP1 创建了名为 SubSubP1 的子模块(例如),将 android.media.IRemoteDisplay 移动到 SubSubP1 中,并为 SubP2 创建了子模块 SubSubP2,并对 stub 类执行了相同的操作。然后我为 SubP1 和 SubP2 声明了如下依赖关系:
dependencies {
provided project(':SubP1:SubSubP1')
}
和
dependencies {
provided project(':SubP2:SubSubP2')
}
这就成功了! Gradle 假设它们将在运行时加载,而不是编译这些类。
关于android - 从生成的 dex 文件中排除类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28014615/