我将 ACRA 集成到我的应用程序中,以便从我在 beta 体育场的应用程序中获取崩溃报告,这样我就能够修复错误、查找代码中的错误等。如果我在模拟器上运行它,一切正常并且 ACRA 已启动并运行,但是如果我使用 Android 工具导出应用程序的签名包,则会收到 ExceptionInInitializeError 并且应用程序在设备上被强制关闭。如果我发现此错误并在没有 ACRA 的情况下继续,则应用程序本身就像魅力一样运行......
这里有人和 ACRA 有同样的问题吗?会不会和 ProGuard 有关系?我在 ACRA 主页上关注了 ProGuard 如何操作,但也许我在这方面遗漏了一些东西?
这是我的 proguard.cfg 的样子: -injars 'C:\Workspaces\motodevWs\gp2012\bin\classes' -injars 'C:\Workspaces\motodevWs\gp2012\libs' -outjars 'C:\Workspaces\motodevWs\gp2012 \bin\classes-processed.jar'
-libraryjars 'C:\android\android-sdk\platforms\android-7\android.jar'
-libraryjars 'C:\android\android-sdk\add-ons\addon_google_apis_google_inc_7 \libs\maps.jar'
-optimizations !code/simplification/arithmetic
-allowaccessmodification
-repackageclasses ''
-keepattributes *Annotation*,SourceFile,LineNumberTable,*Annotation*
-renamesourcefileattribute SourceFile
-dontpreverify
-dontwarn java.awt.**,javax.security.**,java.beans.**,com.sun.**
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context,android.util.AttributeSet);
public <init>(android.content.Context,android.util.AttributeSet,int);
public void set*(...);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context,android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context,android.util.AttributeSet,int);
}
-keepclassmembers class * extends android.os.Parcelable {
static android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# 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 {
<fields>;
<methods>;
}
# keep this around for some enums that ACRA needs
-keep class org.acra.ReportingInteractionMode {
<fields>;
<methods>;
}
# keep this otherwise it is removed by ProGuard
-keep public class org.acra.ErrorReporter {
public void addCustomData(java.lang.String,java.lang.String);
}
# keep this otherwise it is removed by ProGuard
-keep public class org.acra.ErrorReporter {
public org.acra.ErrorReporter$ReportsSenderWorker handleSilentException(java.lang.Throwable);
}
问题解决了!
经过一番研究和重新思考我的问题后,我找到了问题的解决方案,而且确实在我的proguard.cfg
文件中我遗漏了一些东西!
不知何故我设法不保留枚举,现在我添加了
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
对我proguard.cfg
来说,一切都很完美!!