在 gradle Android Studio 中排除一个 class 文件

Exclude one class file in gradle Android Studio

在我的项目中,我需要导入第三方jar 文件和Facebook SDK。

compile files('libs/SkinSDK.jar')
compile 'com.facebook.android:facebook-android-sdk:4.14.0'

两者都包含相同的 BundleJSONConverter class。所以,我不能生成签名的 APK。它总是显示重复条目 com/facebook/internal/BundleJSONConverter.

所以,我想在 Facebook 或 SkinSDK.jar 中排除。我试过

compile ('com.facebook.android:facebook-android-sdk:4.14.0') {
    exclude group: 'com.facebook.internal', module: 'BundleJSONConverter'
}

它不工作并显示相同的错误。

依赖项的配置闭包的exclude方法排除了传递依赖项。所以,如果你的模块依赖依赖于其他模块,你可以从你的构建中排除它们。您可以检查 'com.facebook.android:facebook-android-sdk:4.14.0' 模块对其 Maven repository info page.

的传递依赖性

如果 BundleJSONConverter class 存在于传递依赖中,您可以按照与现在相同的方式排除特定模块。只需指定 groupmoduleversion,就像您对依赖项所做的那样。

如果您只想排除一个 class 依赖 jar,请查看 jar jar links 工具及其 Gradle 插件。它允许您更改包含的罐子,例如更改包或删除 classes.

下面(shortened) example展示了插件的使用和修改依赖jar的一些方法:

compile jarjar.repackage {
    from 'org.apache.hive:hive-exec:0.13.0.2.1.5.0-695'

    archiveBypass "commons*.jar"
    archiveExclude "slf4j*.jar"

    classDelete "org.apache.thrift.**"
    classRename 'org.json.**', 'org.anarres.hive.json.@1'
}

遇到过类似情况。这就是我所做的,并不像我希望的那样优雅,但它有效:

  1. 重命名 jar 文件(SkinSDK.jar 在您的情况下):.zip 而不是 .jar

  2. 转到 "inside" zip 文件(我正在使用 DoubleCommander,还有许多其他实用程序),或将其解压缩到临时文件夹。

  3. 删除导致问题的重复项class。转到 "outside" 压缩文件。

  4. 将文件从 .zip 重命名(或重新打包)为 .jar 。编译.

希望它有用...

我在导入 jar 后遇到了重复的 classes 的类似问题。就我而言,冲突发生在那个 jar 中的 class 和我自己项目中的 class 之间。 下面我分享了您可以用来丢弃您自己的源代码树中可用的 classes 的解决方案,假设 jar 中的那个是正确的:

android {
   sourceSets {
     main {
       java {
            filter.excludes = [
                    "com/package/Duplicated.java",                      
            ]
       }
     }
   }
}