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

Я использую ACRA 4.4.0 в своих приложениях для Android, чтобы получать отчеты о сбоях от пользователей. Моя среда разработки — 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) работает хорошо. Есть ли способ решить эту проблему? Заранее спасибо. Майкл.


person Darkmike    schedule 28.04.2014    source источник


Ответы (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);
}
person Dawid C    schedule 28.04.2014