从生成的dex文件中排除类

时间:2015-01-18 20:42:48

标签: android gradle android-studio dex

我有问题。我的项目结构看起来像这样:
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
如果有可能,请告诉我。

1 个答案:

答案 0 :(得分:1)

最后,我已经能够做到了。

我需要的是运行时依赖项而不是编译时依赖项。因此,我为SubP1创建了一个名为SubSubP1的子模块(例如)将android.media.IRemoteDisplay移动到SubSubP1中,并为SubP2创建了子模块SubSubP2,并对存根类做了相同的操作。然后,我已经为SubP1和SubP2声明了依赖关系:

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

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

这就是诀窍!而不是编译类,Gradle假定它们将在运行时加载。