android - 从生成的 dex 文件中排除类

标签 android gradle android-studio dex

我有一个问题。我的项目结构如下所示:
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/

相关文章:

javascript - 我的世博项目自动缓存图像

javascript - Phonegap - 读取子目录?

带有 Gradle 的 Kotlin 1.3 - 在 intellij 中标记源根目录后出现 "Kotlin not configured"错误

groovy - Gradle 构建示例因 "You must assign a Groovy library to the ' groovy 配置而失败。”

android-studio - 在 TabLayout 中的选项卡之间添加空间

android - 生成签名APK播放商店

android - 使用融合位置 api 跳转到位置

android - Activity 被杀死并重新创建后, fragment 仍然存在

Gradle 任务语法 : how is it explained from a Groovy perspective?

android - 权限 READ_EXTERNAL_STORAGE 总是被拒绝