2016-02-16 4 views
1

Мое приложение разбивается при запуске подписанной версии 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.** { *; } 

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

+2

Может быть, вы могли бы взглянуть на mappings.txt файл, генерируемый ProGuard, чтобы увидеть, какой класс 'a/a/a/c/a/i' отображает до обфускации? –

+0

Спасибо за ответ. Я отлаживал эту последнюю ночь, и после поиска в Интернете я просмотрел файл mappings.txt. Я просто сгенерировал еще один подписанный apk и посмотрел новый файл mappings.txt, но поиск файла для этой строки ничего не меняет. Я где-то читал, что при использовании файла mappings.txt иногда нужен файл retrace.bat, это такой случай? Что мне нужно сделать с исполняемым файлом retrace в отношении файла mapping.txt? В качестве примечания я просто получил версию (см. Ответ), но все равно хотел бы узнать, как ее отладить. – Orbit

+1

Обычно вы должны использовать инструмент retrace для обработки трассировки стека аварии, чтобы вернуть в него все исходные символы и номера строк. Но ручное сканирование файла mappings.txt обычно достаточно хорошо, чтобы показать, какие символы отсутствуют. –

ответ

0

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

#jraw 
-dontwarn net.dean.** 
-keep class net.dean.** {*;}