【问题标题】:Duplicate class names in two external third party obfuscated libraries两个外部第三方混淆库中的重复类名
【发布时间】:2020-01-30 17:13:36
【问题描述】:

我有一个包含两个外部第三方库的项目。在尝试构建项目时,这两个库都具有混淆的类文件名和 gradle barfs。

Duplicate class a.a.a.a.a.b found in modules...

我不能排除任何类,因为它们不是重复的,我也没有看到 gradle 为名称添加前缀的方法。

有什么简单的解决方法吗?

【问题讨论】:

    标签: android gradle


    【解决方案1】:

    您可以使用shadow pluginrelocate the offending packages。然后,您将依赖阴影 jar 而不是原来的

    plugins {
       id "com.github.johnrengelman.shadow" version "5.2.0"
    }
    configurations {
       shadowMe { transitive = false } 
    } 
    dependencies {
       shadowMe 'foo:jar-to-shadow:1.0'
       compile files({tasks.shadowJar})
    }
    task shadowJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
       archiveBaseName = 'shadowed-foo' 
       relocate 'a.a.a.a.a', 'shadow.a.a.a.a'
       from zipTree(configurations.shadowMe.singleFile)
    }
    

    这些都没有经过测试,可能需要一些调整,但希望你能明白

    【讨论】:

    • 谢谢,我在研究的时候碰到了shadow插件,觉得一定有更好的办法。
    • 唯一的其他解决方案是使用不同的类加载器加载每个 jar(或将每个 jar 加载到单独的 jvm 中)
    【解决方案2】:

    我遇到了 Install Referrer 和 ARCore(均来自 Google!)的问题

    我无法让 ShadowJar 使用 aar 库(其中包含 classes.jar)。也许有一些方法可以做到,但我想不通。

    相反,我下载并解压缩了 aar,使用 jarjar 重命名 classes.jar 中的违规类,并将其压缩回 aar。然后我将修改后的aar 文件放在我的libs 目录中,并修改我的依赖项以引用该本地文件而不是maven 库。

    更详细的解释:
    为了修复 classes.jar,我将其重命名为 classes-original.jar,创建了一个 jarjar.rules 文件,其中包含:

    rule a.a.a relocated-a.a.a
    

    然后跑了:

    java -jar jarjar-1.4.jar process jarjar.rules classes-original.jar classes.jar
    

    【讨论】:

    • 您好,我目前遇到了与 installReferrer 和 ARCore(使用 Unity)完全相同的问题。你还记得你用来解决问题的步骤/命令吗?如果是这样,你介意分享它们吗?将不胜感激。提前致谢。 PS:就我而言。重复的类是“aaa”。你也一样吗?
    • 如果其他人遇到此问题:此答案中解释了该工具的用法:stackoverflow.com/a/33592560
    猜你喜欢
    • 2017-05-27
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2016-07-04
    相关资源
    最近更新 更多