Мое приложение разбивается при запуске подписанной версии 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.** { *; }
Так что может быть причиной этого?
Может быть, вы могли бы взглянуть на mappings.txt файл, генерируемый ProGuard, чтобы увидеть, какой класс 'a/a/a/c/a/i' отображает до обфускации? –
Спасибо за ответ. Я отлаживал эту последнюю ночь, и после поиска в Интернете я просмотрел файл mappings.txt. Я просто сгенерировал еще один подписанный apk и посмотрел новый файл mappings.txt, но поиск файла для этой строки ничего не меняет. Я где-то читал, что при использовании файла mappings.txt иногда нужен файл retrace.bat, это такой случай? Что мне нужно сделать с исполняемым файлом retrace в отношении файла mapping.txt? В качестве примечания я просто получил версию (см. Ответ), но все равно хотел бы узнать, как ее отладить. – Orbit
Обычно вы должны использовать инструмент retrace для обработки трассировки стека аварии, чтобы вернуть в него все исходные символы и номера строк. Но ручное сканирование файла mappings.txt обычно достаточно хорошо, чтобы показать, какие символы отсутствуют. –