java.lang.VerifyError: Отклонение класса, который пытается подкласса ошибочного класса - PullRequest
0 голосов
/ 26 июня 2018

При применении proguard к приложению m, получающему следующую ошибку проверки, я видел другие варианты ошибок проверки, но следующее, кажется, немного отличается, версия Proguard: 5.3.3. После класса MainApplication расширяется android.app.Application и происходит сбой супер.onCreate ();из метода onCreate ()

и в моем proguard m, имеющем

-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

он не должен запутывать классы приложений, почему это происходит выше? ..

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

У меня была точно такая же ошибка после разрешения множества конфликтов и перебазировок.Я просто очистил проект и перестроил его.Он снова работал как шарм.

0 голосов
/ 03 июля 2018

При взгляде на ContextWrapper ... утверждается, что:

Известные прямые подклассы

Приложение, BackupAgent, ContextThemeWrapper, IsolatedContext, MutableContextWrapper, RenamingDelegatingContext, Служба

... из которых не все объявлены в вашей конфигурации ProGuard -keep.

вам нужно добавить правило, аналогичное приведенному ниже, что является другим подходом, чем добавление всех отдельных подклассов явно по их имени ... ключевое слово public здесь не является обязательным, потому что эти * 1017 Методы * / protected не нужно обфусцировать просто потому, что пакет исходных кодов SDK общедоступен для скачивания. добавление в конфигурацию ключа -verbose всегда заставляет ProGuard жаловаться на «что делать», всегда с гиперссылкой на руководство пользователя.

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

загрузка mapping.txt в Crashlytics помогает при сбоях в запутанных сборках.

...