【问题标题】:I want to know if this error is due to library duplication我想知道这个错误是否是由于库重复
【发布时间】:2018-08-09 12:12:56
【问题描述】:

我的应用中有两个库。

一个是加密库(A),一个是虚拟键盘库(B)。

我直接使用A库,

虚拟键盘库也在内部使用 A 并包含在 aar 中。

B 仅使用 A 的 2 个函数,转换为 Dex Jar 时只有 2 个函数可见。 (BA函数,BB函数)

但是,当我构建我的应用程序时,我收到了一个与函数相关的错误,该错误不是从 B 调用的。

Caused by: java.lang.NoSuchMethodError: No static method BC()
[B in class Lcom/Encryption/Encrypt/API; or its super classes
 (declaration of 'com.Encryption.Encrypt.API'
 appears in /data/app/kr.co.MyApp-1/base.apk:classes8.dex)

这是否与将 B 转换为 Dex Jar 时只有 2 个函数有关?

【问题讨论】:

    标签: android jar java-native-interface aar


    【解决方案1】:

    是的,看起来是这样。发生这种情况的原因是,当这里存在依赖项重复时,选择了单个版本的库,并且选择了最大版本来构建 apk,例如假设您的应用程序直接使用“super-log:log:2.0”,以及“super-downloader:downloader:1.0.”,在它自己的上下文中,使用“super-log:log:1.0”。因此,在构建过程中,gradle 会寻找副本并选择它们的最大版本以包含在构建中,在我们的例子中是“super-log 2.0”。所以,apk创建成功了,但是在运行时,如果这里出现“superlog 1.0”和“superlog 2.0”接口不匹配的情况,就会报错(具体看是哪一个,但通常是与ClassDefNotFoundError相关的NoSuchMethodError(效果一样)可以用raw java实现:只编译两个类,当A类依赖B类时,调用B的一个函数,编译后删除B.class,就会出现ClassDefNotFoundError))。

    【讨论】:

    • 感谢您的回复。但我不能改变目前的结构。在B中调用A的所有函数,问题能解决吗?
    • @ilikecat,如果这里是库 B 正在使用的旧版本库 A 中的一些特定模块,您可以尝试将此模块从模块的 build.gradle 中的 A 的直接依赖项声明中排除。但由于 A 的独特架构,无法确定之后系统将如何运行。如果它能够解决之前的 NoSuchMethodError 情况,则需要进行适当的测试以确保使用 A 的其他任何东西都没有损坏。你可以在这里看到它是如何完成的:docs.gradle.org/current/userguide/…
    • 我会试试的。谢谢你。 :D
    猜你喜欢
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2016-02-05
    • 1970-01-01
    相关资源
    最近更新 更多