我有个问题。我有一个如下所示的项目结构:
P
| -SubP1
| -SubP2

两个软件包中都有两个存根类 android.media.IRemoteDisplay 。它们的实现方式有所不同,但这不是问题-当我将在Android上运行该应用程序时,它们将被系统类取代。

但是,存在一个问题-我无法构建项目,因为dexMerger失败-它表示存在两个冲突的类。我可以理解该错误-毕竟确实有两个相互冲突的类:)

但是当我尝试像这样在build.gradle中排除这些文件时:

sourceSets {
    main {
        java {
            srcDir 'src'
            exclude '**/android/media/**'
        }
    }
}

编译失败,因为找不到 android.media.IRemoteControlDisplay 类(及其嵌套类)。

我如何仍可以使用这些类,但将它们从生成的DEX文件中排除?

不要问题,是否应该从编译的项目中排除该类-这是正确的事,我已经做到了,但是是手动进行的-通过将SubP1和SubP2预编译到jar中,然后从中手动删除IRemoteController.class这些jar文件,然后将这些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,并对存根类进行了同样的操作。然后,我声明了SubP1和SubP2的依赖关系,如下所示:

dependencies {
    provided project(':SubP1:SubSubP1')
}


dependencies {
    provided project(':SubP2:SubSubP2')
}

那就成功了! Gradle假设没有在编译类时将在运行时加载它们。

关于android - 从生成的dex文件中排除类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28014615/

10-10 03:12