从生成的 dex 文件中排除 class

Exclude class from resulting dex file

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

两个包中都有两个存根 classes android.media.IRemoteDisplay。它们在实现上有所不同,但这不是问题 - 当我 运行 Android.

上的应用程序时,它们将被系统 classes 取代

但是,有一个问题 - 我无法构建项目,因为 dexMerger 失败 - 它说有两个冲突的 classes。我能理解那个错误——毕竟,确实有两个相互冲突的 classes :)

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

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

编译失败,因为找不到android.media.IRemoteControlDisplayclass(而且是嵌套的classes).

如何才能继续使用这些 classes,但将它们从生成的 DEX 文件中排除?

不要质疑从编译的项目中排除class是否正确-这是正确的做法,我已经做到了,但是手动-通过将 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
如果可以,请告诉我。

我终于做到了。

我需要的是 runtime 依赖而不是 compilation-time 依赖。因此,我为 SubP1 创建了名为 SubSubP1 的子模块(例如)将 android.media.IRemoteDisplay 移到了 SubSubP1 中,并为 SubP2 创建了子模块 SubSubP2,并对存根 class 进行了同样的操作。然后我为 SubP1 和 SubP2 声明了如下依赖关系:

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

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

成功了! Gradle 假设它们将在运行时加载,而不是编译 classes。