android - VerifyError:拒绝类 android.support.gb,因为它未能通过编译时验证
问题描述
这类似于Rejecting class,因为它在编译时验证 Android和java.lang.VerifyError: Verifier denied class on Lollipop 使用发布 APK 时失败,但我的问题的根源仍然未知,所有建议的解决方案都无济于事。
手动安装具有 MultiDex 支持并启用 ProGuard 的签名发布 apk 会在启动时引发此异常:
475-475/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: ..., PID: 475
java.lang.VerifyError: Verifier rejected class android.support.g.b due to bad method void android.support.g.b.<init>() (declaration of 'android.support.g.b' appears in /data/app/...-2/base.apk)
at ...MyApp.attachBaseContext(Unknown Source)
at android.app.Application.attach(Application.java:181)
这不会发生在-dontoptimize
. 当前最小优化设置:
-optimizations "code/*"
-optimizations
没有或没有限制性的选项,我得到同样的错误。添加-keep class android.*
也无济于事。我没有得到任何错误"code/removal/*,code/simplification/*"
,但这忽略了-assumenosideeffects
android.support.gb 是混淆后的android.support.multidex.MultiDex 类本身,在调用overridden 时报错attachBaseContext(Context)
:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
使用字节码查看器解码此方法(默认构造函数)会导致:
private b() { // <init> //()V
return
}
- 按类规范禁用优化会很有用。
- 备选方案:了解考虑的最小
-optimizations
选项-assumenosideeffects
解决方案
不要使用成员通配符,-assumenosideeffects
因为这会“溢出”到其他类的 Object 中。见https://sourceforge.net/p/proguard/bugs/716/#98d4
任何带有接口的规则都可能出现类似的问题。例子:
-assumenosideeffects class * implements Interface {
public <init>();
public Object interfacemethod(); # May concern methods with same signature in other Objects
}
推荐阅读
- python - 将 CWD 设置为文件位置
- wordpress - twilio 是否允许我在 whatsapp 上发送特定号码的消息(从我的 wordpress 中获取)?
- c++ - 使用 Xcode 12 导入外部 C++ 库
- android - 适用于 AR 的 Google Play Services 需要最新版本错误
- postgresql - 子查询方程左边部分和右边部分一样,为什么?
- javascript - JavaScript 中动态生成的 LinkedIn 分享按钮
- python - 如何从 Python 中的字符串列表中获取最多重复出现的单词?
- java - IndexOutOfBound Java 异常无法分析错误
- ios - Xcode 12.2:调试器不使用断点
- sqlite - Row_Number() 函数在 sqlite 版本 3.5.1 中不起作用