VerifyError: Отклонение класса android.support.g.b, потому что он не прошел проверку во время компиляции - PullRequest
0 голосов
/ 28 июня 2018

Это похоже на Отклонение класса, потому что он не прошел проверку во время компиляции Android и java.lang.VerifyError: Verifier отклонил класс на Lollipop при использовании релиза APK , но происхождение моего Проблема до сих пор неизвестна и все предложенные решения не помогают.

Установка вручную подписанного релиза apk с поддержкой MultiDex и включенной ProGuard выдает это исключение при запуске:

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.g.b - это запутанный класс android.support.multidex.MultiDex, и ошибка возникает, когда вызывается переопределенный attachBaseContext(Context):

@Override
protected void attachBaseContext(Context base) {

    super.attachBaseContext(base);
    MultiDex.install(this);
}

Декодирование этого метода (конструктор по умолчанию) с помощью средства просмотра байтового кода приводит к:

private b() { // <init> //()V
    return
}
  • Было бы полезно отключить оптимизацию по спецификации класса.
  • Альтернатива: знание минимальной опции -optimizations, которая учитывает -assumenosideeffects

1 Ответ

0 голосов
/ 06 сентября 2018

Не используйте групповые символы-члены с -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
}
...