8

ACRA 自体が奇妙な問題でクラッシュしています。

IllegalStateException: Cannot access ErrorReporter before ACRA#init

完全に動作する ACRA 4.3.0 のアプリがあります。アプリ全体をライブラリに変更したので、マイナー バリアントを作成できます。マニフェストとこの新しいライブラリへのリンク以外は完全に空白の新しいプロジェクトを作成しました。これを試みる他の人については、AcraApplication.java で「resToastText = R.string.crash_toast_text」行を削除し、Acra.init(this); の下に新しい行を追加する必要があります。

ACRA.getConfig().setResToastText(R.string.crash_toast_text);

プロジェクトは正常にビルドされ、デバッグで ACRA.init(this); を確認しました。私のメインプログラムコードの前で、エラーが発生する前に実行されます。メイン プログラムで、いくつかのカスタム データを設定した時点で、次のようになります。

ACRA.getErrorReporter().putCustomData("Orientation", "L");

これによりクラッシュが発生し (より正確には、ACRA 自体がエラーを引き起こします)、ACRA レポートは生成されません。

次に何を試すか、またはどこを見るべきかのヒントはありますか? ACRA はライブラリと互換性がない可能性があります。この場合、別の方法で処理することはできますが、ライブラリの目的を無効にします。


解決策: 以下の行を追加する代わりにAcra.init(this);、init 行の前に次の 3 行を追加します。

ACRAConfiguration config = ACRA.getNewDefaultConfig(this); 
config.setResToastText(R.string.crash_toast_text);
ACRA.setConfig(config);

ACRA.init(this);

これは v4.3.0 以降でのみ機能することに注意してください。

4

3 に答える 3

1

私は同じ問題を抱えていました。それはプロガードの難読化が原因でした。

解決策は、以下のカスタマイズを proguard.cfg ファイルに追加することです (こちらの ACRA wiki ページから取得)。

ACRA.init() は先頭に置く必要があることに注意してください。

@Override
  public void onCreate() {
    ACRA.init(this);
    ACRA.getErrorReporter().setReportSender(new MySender());

    super.onCreate();
  } 

proguard.cfg:

#ACRA specifics
# we need line numbers in our stack traces otherwise they are pretty useless
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

# ACRA needs "annotations" so add this... 
-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);
}
于 2013-05-16T19:26:34.893 に答える
1

私の場合、@ReportCrashesの設定がありませんでした...これがうまくいくことを願っています

@ReportsCrashes(
    formUri = "uploadurl",
    reportType = HttpSender.Type.JSON,
    httpMethod = HttpSender.Method.POST,
    formUriBasicAuthLogin = "llenigingeneyederrownlys",
    formUriBasicAuthPassword = "1a35b13f9f54271d23a9aed988451182e5b97211",
    formKey = "", // This is required for backward compatibility but not used
    customReportContent = {
            ReportField.APP_VERSION_CODE,
            ReportField.APP_VERSION_NAME,
            ReportField.ANDROID_VERSION,
            ReportField.PACKAGE_NAME,
            ReportField.REPORT_ID,
            ReportField.BUILD,
            ReportField.STACK_TRACE
    },
    mode = ReportingInteractionMode.TOAST,
    resToastText =R.string.msg

)
于 2016-05-17T07:29:53.147 に答える