我的应用中有两个库。
一个是加密库(A),一个是虚拟键盘库(B)。
我直接使用A库,
虚拟键盘库也在内部使用A,并包含在aar中。
B仅使用2个A函数,转换为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个函数有关吗?
答案 0 :(得分: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))。