Ошибка при запуске подписанного APK с помощью Proguard

Мое приложение падает при запуске подписанной версии apk с включенным Proguard. Обратите внимание, что в обычном режиме отладки приложение не аварийно завершает работу.

FATAL EXCEPTION: AsyncTask #1
Process: orbyt.horizon, PID: 21671
       java.lang.RuntimeException: An error occurred while executing doInBackground()
           at android.os.AsyncTask$3.done(AsyncTask.java:309)
           at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
           at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
           at java.util.concurrent.FutureTask.run(FutureTask.java:242)
           at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
           at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
           at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
           at java.lang.Thread.run(Thread.java:818)
        Caused by: java.lang.NoSuchFieldError
           at libcore.reflect.AnnotationAccess.decodeValue(AnnotationAccess.java:688)
           at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:663)
           at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:641)
           at libcore.reflect.AnnotationAccess.getDeclaredAnnotation(AnnotationAccess.java:171)
           at libcore.reflect.AnnotationAccess.getAnnotation(AnnotationAccess.java:72)
           at java.lang.Class.getAnnotation(Class.java:359)
           ... 
        Caused by: java.lang.NoSuchFieldException: No field LINK in class La/a/a/c/a/i; (declaration of 'a.a.a.c.a.i' appears in /data/app/orbyt.horizon-1/base.apk)
           at java.lang.Class.getDeclaredField(Native Method)
           at libcore.reflect.AnnotationAccess.decodeValue(AnnotationAccess.java:685)
           at 

 

Теперь, если бы я угадал, я бы сказал, что Proguard запутывает несколько классов, которых не должно быть. Итак, как вы собираетесь отлаживать это?

Вот мой proguard-rules.pro :

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}

# Retrofit 2.X
## https://square.github.io/retrofit/ ##

-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

# Butterknife

-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

# Glide specific rules #
# https://github.com/bumptech/glide

-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
    **[] $VALUES;
    public *;
}


## Retrolambda specific rules ##

# as per official recommendation: https://github.com/evant/gradle-retrolambda#proguard
-dontwarn java.lang.invoke.*

# OkHttp
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.squareup.okhttp.** { *; }
-keep interface com.squareup.okhttp.** { *; }
-dontwarn com.squareup.okhttp.**


#JodaTime
# These aren't necessary if including joda-convert, but
# most people aren't, so it's helpful to include it.
-dontwarn org.joda.convert.FromString
-dontwarn org.joda.convert.ToString

#twitter4j
-dontwarn twitter4j.**
-keep class twitter4j.** { *; }

#google
-dontwarn com.google.**

#okio
-dontwarn com.squareup.**
-dontwarn okio.**

#misc
-dontwarn com.google.code.**
-dontwarn oauth.signpost.**
-dontwarn twitter4j.**
-dontwarn javax.management.**
-dontwarn javax.xml.**
-dontwarn org.apache.**
-dontwarn org.slf4j.**
-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry
-optimizations !class/unboxing/enum
-keep  class com.fasterxml.jackson.annotation.** {*;}
-keep  class com.fasterxml.jackson.core.** {*;}
-keep  class com.fasterxml.jackson.databind.** {*;}
-keep class libcore.** { *; }

Так что может быть причиной этого?


person Orbit    schedule 16.02.2016    source источник
comment
Может быть, вы могли бы взглянуть на файл mapps.txt, сгенерированный proguard, чтобы увидеть, какой класс a/a/a/c/a/i соответствует до обфускации?   -  person Doug Stevenson    schedule 17.02.2016
comment
Спасибо за ответ. Я отлаживал это прошлой ночью, и после поиска в Google я просмотрел файл Mapping.txt. Я только что сгенерировал еще один подписанный apk и взглянул на новый mapps.txt, но поиск в файле этой строки ничего не дает. Где-то читал, что при использовании файла mappings.txt иногда нужен файл retrace.bat, это такой случай? Что мне нужно сделать с исполняемым файлом повторной трассировки в отношении файла mapping.txt? В качестве примечания: я только что заработал версию (см. ответ), но все же хотел бы научиться ее отлаживать.   -  person Orbit    schedule 17.02.2016
comment
Обычно вы используете инструмент повторной трассировки для обработки трассировки стека сбоя, чтобы вернуть в него все исходные символы и номера строк. Но ручного сканирования файла mappings.txt обычно достаточно, чтобы найти недостающие символы.   -  person Doug Stevenson    schedule 17.02.2016
comment
Ах хорошо. Странно тогда, что я ничего не видел. Я видел много классов из пакета, который вызывал проблему (что я отметил в своем ответе ниже), но ничего, что соответствовало бы трассировке стека. Мне придется немного изучить использование инструмента повторной трассировки. Спасибо за помощь!   -  person Orbit    schedule 17.02.2016


Ответы (1)


По-видимому, проблема была связана с JRAW. Добавление следующих строк в мой proguard-rules.pro файл, похоже, решило проблему:

#jraw
-dontwarn net.dean.**
-keep class net.dean.** {*;}
person Orbit    schedule 16.02.2016