java.lang.VerifyError:拒绝尝试子类错误类的类

问题描述 投票:2回答:2

在将proguard应用于应用程序m获得以下验证错误时,我看到了其他验证错误的变体,但以下似乎有点不同,Proguard版本:5.3.3,以下MainApplication类扩展android.app.Application并且崩溃发生在super.onCreate( ); ofCreate()方法

并且在我的计划中

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgent

,我也提到过

-dontshrink -dontoptimize

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.myapplication, PID: 18598
    java.lang.VerifyError: Rejecting class com.myapplication.MainApplication that attempts to sub-type erroneous class ak (declaration of 'com.myapplication.MainApplication' appears in /data/app/com.myapplication-v4oPXfQv5kNLX1oUA9GwUw==/base.apk)
        at java.lang.Class.newInstance(Native Method)
        at android.app.Instrumentation.newApplication(Instrumentation.java:1102)
        at android.app.Instrumentation.newApplication(Instrumentation.java:1087)
        at android.app.LoadedApk.makeApplication(LoadedApk.java:983)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5715)
        at android.app.ActivityThread.-wrap1(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.VerifyError: Rejecting class ak that attempts to sub-type erroneous class en (declaration of 'ak' appears in /data/app/com.myapplication-v4oPXfQv5kNLX1oUA9GwUw==/base.apk)
        at java.lang.Class.newInstance(Native Method) 
        at android.app.Instrumentation.newApplication(Instrumentation.java:1102) 
        at android.app.Instrumentation.newApplication(Instrumentation.java:1087) 
        at android.app.LoadedApk.makeApplication(LoadedApk.java:983) 
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5715) 
        at android.app.ActivityThread.-wrap1(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 
     Caused by: java.lang.VerifyError: Verifier rejected class en: void en.<init>(android.content.Context) failed to verify: void en.<init>(android.content.Context): [0xA] thrown class Precise Reference: bjp not instanceof ThrowableVerifier rejected class en: void en.attachBaseContext(android.content.Context) failed to verify: void en.attachBaseContext(android.content.Context): [0x7] thrown class Precise Reference: bjp not instanceof Throwable

随着分析apk我可以看到以下没有proguard没有混淆

.class public Lcom/myapplication/MainApplication;
.super Landroid/app/Application;
.source "MainApplication.java"

但是一旦我申请了proguard,同样被混淆了

.class public Lcom/myapplication/MainApplication;
.super Lak;
.source "SourceFile"

如果我错了,请纠正我,跟随

-keep public class * extends android.app.Application

它不能混淆应用程序类,为什么上面发生..?

android proguard android-proguard
2个回答
3
投票

在解决了很多冲突和rebase后,我遇到了完全相同的错误。我刚刚清理了项目并重建了它。它再次像魅力一样工作。


0
投票

在查看ContextWrapper时...正在说明:

已知的直接子类

Application,BackupAgent,ContextThemeWrapper,IsolatedContext,MutableContextWrapper,RenamingDelegatingContext,Service

...其中并非所有声明都在您的ProGuard -keep配置中声明。

您需要添加一个类似下面的规则,这是一种不同的方法,而不是通过名称明确添加所有单个子类... public关键字在那里是相当可选的,因为那些private / protected方法并不真正需要进行模糊处理,因为SDK源包可以公开下载。将-verbose开关添加到配置中总是让ProGuard抱怨“该怎么做”,总是带有指向用户手册的超链接。

-keep public class * extends android.content.ContextWrapper {public *;}

在处理混淆版本中的崩溃时,将mapping.txt上传到Crashlytics会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.