使用ProGuard会导致ACRA发生NoSuchFieldError

我在我的Android应用程序中使用ACRA 4.4.0来接收来自用户的崩溃报告。 我的IDE是ADT Build:v22.2.1-833290。 几天前,我已经开始使用ProGuard来处理要在Google Play上发布的应用程序。 当我安装并开始导出已签名的apk时,在ACRA报告中使用的字段发生NoSuchFieldError。 我的代码是:

@ReportsCrashes(formKey = <my_key>, mailTo = <my_email>, customReportContent = { ReportField.APP_VERSION_CODE, ReportField.APP_VERSION_NAME, ReportField.ANDROID_VERSION, ReportField.PHONE_MODEL, ReportField.CUSTOM_DATA, ReportField.STACK_TRACE, ReportField.LOGCAT }, mode = ReportingInteractionMode.TOAST, resToastText = R.string.crash_toast_text) public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); ACRA.init(this); } } 

proguard-project.txt中包含“-keep public class org.acra。*”不起作用。 正如我在GoogleDocs中看到的,可能的原因是Proguard不能正确地使用dynamic引用的字段和方法。 优化APK(无ACRA)效果很好。 有没有办法解决这个问题? 提前致谢。 迈克尔。

Solutions Collecting From Web of "使用ProGuard会导致ACRA发生NoSuchFieldError"

你可以尝试使用它的文档在这里configurationACRA: https : //github.com/ACRA/acra/wiki/Proguard包括在你的proguardconfiguration文件:

 #ACRA specifics # Restore some Source file names and restore approximate line numbers in the stack traces, # otherwise the stack traces are pretty useless -keepattributes SourceFile,LineNumberTable # ACRA needs "annotations" so add this... # Note: This may already be defined in the default "proguard-android-optimize.txt" # file in the SDK. If it is, then you don't need to duplicate it. See your # "project.properties" file to get the path to the default "proguard-android-optimize.txt". -keepattributes *Annotation* # keep this class so that logging will show 'ACRA' and not a obfuscated name like 'a'. # Note: if you are removing log messages elsewhere in this file then this isn't necessary -keep class org.acra.ACRA { *; } # keep this around for some enums that ACRA needs -keep class org.acra.ReportingInteractionMode { *; } -keepnames class org.acra.sender.HttpSender$** { *; } -keepnames class org.acra.ReportField { *; } # keep this otherwise it is removed by ProGuard -keep public class org.acra.ErrorReporter { public void addCustomData(java.lang.String,java.lang.String); public void putCustomData(java.lang.String,java.lang.String); public void removeCustomData(java.lang.String); } # keep this otherwise it is removed by ProGuard -keep public class org.acra.ErrorReporter { public void handleSilentException(java.lang.Throwable); }