Android 使用Proguard运行签名APK时出错

Android 使用Proguard运行签名APK时出错,android,apk,proguard,android-proguard,Android,Apk,Proguard,Android Proguard,我的应用程序在启动启用Proguard的已签名apk版本时崩溃。请注意,在常规调试模式下,应用程序不会崩溃 FATAL EXCEPTION: AsyncTask #1 Process: orbyt.horizon, PID: 21671 java.lang.RuntimeException: An error occurred while executing doInBackground() at android.os.AsyncTask$3.done(Asy

我的应用程序在启动启用Proguard的已签名apk版本时崩溃。请注意,在常规调试模式下,应用程序不会崩溃

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规则。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.** { *; }
-assumenosideffects类android.util.Log{
公共静态布尔isLoggable(java.lang.String,int);
公共静态INTV(…);
公共静态int i(…);
公共静态int w(…);
公共静态int d(…);
公共静态INTE(…);
}
#改装2.X
## https://square.github.io/retrofit/ ##
-dontwarn 2**
-保持类2.*{*;}
-保留署名
-保留特例
#毛刀
-保持类butterknife.*{*;}
-dontwarn butterknife,内部**
-保持类**$$ViewBinder{*;}
-KeepClassSwithMemberNames类*{
@黄油刀*;
}
-KeepClassSwithMemberNames类*{
@黄油刀*;
}
#滑翔特定规则#
# https://github.com/bumptech/glide
-keep public类*实现com.bumptech.glide.module.GlideModule
-保持公共枚举com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$**{
**[]美元价值;
公众*;
}
##反lambda特定规则##
#根据官方建议:https://github.com/evant/gradle-retrolambda#proguard
-dontwarn java.lang.invoke*
#OkHttp
-保留署名
-keepattributes*注释*
-保持类com.squareup.okhttp.*{*;}
-保持接口com.squareup.okhttp.*{*;}
-dontwarn com.squareup.okhttp**
#乔达蒂姆
#如果包括joda convert,则不需要这些,但是
#大多数人不是这样,所以把它包括进去是有帮助的。
-dontwarn org.joda.convert.FromString
-dontwarn org.joda.convert.ToString
#twitter4j
-dontwarn twitter4j**
-保持类twitter4j.*{*;}
#谷歌
-dontwarn com.google**
#奥基奥
-dontwarn com.squareup**
-唐特沃恩·奥基奥**
#杂项
-dontwarn com.google.code**
-dontwarn oauth.路标**
-dontwarn twitter4j**
-dontwarn javax.management**
-dontwarn javax.xml**
-dontwarn org.apache**
-dontwarn org.slf4j**
-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry
-优化!类/取消装箱/枚举
-保留类com.fasterxml.jackson.annotation.*{*;}
-保持类com.fasterxml.jackson.core.*{*;}
-保持类com.fasterxml.jackson.databind.*{*;}
-保持类libcore.*{*;}

那么,是什么导致了这种情况呢?

显然问题出在我的
proguard规则中添加了以下几行。pro
文件似乎已经解决了这个问题:

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

显然问题在于,在我的
proguard规则中添加了以下行。pro
文件似乎已经解决了问题:

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

也许您可以查看proguard生成的mappings.txt文件,看看在混淆之前,
a/a/a/c/a/i
映射到哪个类?谢谢您的回复。我昨晚调试了这个,在谷歌搜索之后,我确实查看了mappings.txt文件。我刚刚生成了另一个带签名的apk,并查看了新的mappings.txt,但在文件中搜索该字符串并没有找到任何结果。我在某个地方读到,当使用mappings.txt文件时,有时需要retrace.bat文件,是这样的吗?对于mapping.txt文件,我需要如何处理retrace可执行文件?顺便说一句,我只是让一个版本正常工作(请参见答案),但我仍然想学习如何调试它。通常,您会使用回溯工具处理崩溃的堆栈跟踪,以将所有原始符号和行号恢复到其中。但是手动扫描mappings.txt通常足以显示缺少的符号。啊,好的。奇怪的是我什么也没看到。我从包中看到了许多导致问题的类(我在下面的回答中指出了这一点),但没有任何类与stacktrace匹配。我得研究一下使用回溯工具的问题。谢谢你的帮助!也许您可以查看proguard生成的mappings.txt文件,看看在混淆之前,
a/a/a/c/a/i
映射到哪个类?谢谢您的回复。我昨晚调试了这个,在谷歌搜索之后,我确实查看了mappings.txt文件。我刚刚生成了另一个带签名的apk,并查看了新的mappings.txt,但在文件中搜索该字符串并没有找到任何结果。我在某个地方读到,当使用mappings.txt文件时,有时需要retrace.bat文件,是这样的吗?对于mapping.txt文件,我需要如何处理retrace可执行文件?顺便说一句,我只是让一个版本正常工作(请参见答案),但我仍然想学习如何调试它。通常,您会使用回溯工具处理崩溃的堆栈跟踪,以将所有原始符号和行号恢复到其中。但是手动扫描mappings.txt通常足以显示缺少的符号。啊,好的。奇怪的是我什么也没看到。我从包中看到了许多导致问题的类(我在下面的回答中指出了这一点),但没有任何类与stacktrace匹配。我得研究一下使用回溯工具的问题。谢谢你的帮助!