Использование ProGuard вызывает NoSuchFieldError для ACRA

Я использую ACRA 4.4.0 в своих приложениях для Android, чтобы получать отчеты о сбоях от пользователей. Моя IDE является ADT Build: v22.2.1-833290. Несколько дней назад я начал использовать ProGuard для приложений, которые собираюсь опубликовать в Google Play. Когда я устанавливаю и запускаю экспортированный подписанный apk, возникает ошибка NoSuchFieldError для полей, используемых в отчетах ACRA. Мой код:

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

Включение "-keep public class org.acra.*" В proguard-project.txt не дает никакого эффекта. Как я вижу в GoogleDocs, возможная причина заключается в том, что Proguard не работает правильно с динамически ссылающимися полями и методами. Оптимизированный APK(без ACRA) работает хорошо. Есть ли способ исправить эту проблему? Заранее спасибо. Майкл.

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);
}
Другие вопросы по тегам