首页 > 解决方案 > VerifyError:拒绝类 android.support.gb,因为它未能通过编译时验证

问题描述

这类似于Rejecting class,因为它在编译时验证 Androidjava.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
}

标签: androidproguard

解决方案


不要使用成员通配符,-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
}

推荐阅读