【问题标题】:Using ProGuard causes NoSuchFieldError for ACRA使用 ProGuard 会导致 ACRA 出现 NoSuchFieldError
【发布时间】:2014-06-13 23:49:20
【问题描述】:

我在我的 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 不能与动态引用的字段和方法一起正常工作。优化的 APK(没有 ACRA)效果很好。有没有办法解决这个问题? 提前致谢。 迈克尔。

【问题讨论】:

    标签: android proguard acra nosuchfieldexception


    【解决方案1】:

    您可以尝试在此处使用其文档配置 ACRA:https://github.com/ACRA/acra/wiki/Proguard 将其包含在您的 proguard 配置文件中:

    #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);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-04
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多