3

AndroidアプリでACRAを使用しています。私の質問は、クラッシュが発生した場合、クラッシュが報告される前にコードを確実に実行するにはどうすればよいかということです。つまり、クラッシュが発生したときにいくつかのカスタム変数を追加して、アプリの状態を把握したいということですか?

助けてください

ありがとうございました

4

3 に答える 3

2

hereの説明に従って、独自の送信者を実装します。既存の送信者の単なるラッパーであり、そこに送信機能を転送します。

実際にレポートを送信する前に、送信者コード内で特別なアクションを実行できます。

于 2013-01-14T09:19:58.060 に答える
1

これは、HttpSender バックエンドで ACRA 4.5.0 を使用して私にとってうまくいったことです。Cloudant で Acralyzer を使用しています。

元のコード:

@ReportsCrashes(
    mode = ReportingInteractionMode.DIALOG,
    resDialogText = R.string.crash_dialog_text,
    resDialogCommentPrompt = R.string.crash_dialog_comment_prompt,

    formUri = "https://kpc.cloudant.com/acra-openconnect/_design/acra-storage/_update/report",
    formUriBasicAuthLogin="[restricted reporter login]",
    formUriBasicAuthPassword="[restricted reporter password]",
    reportType = org.acra.sender.HttpSender.Type.JSON,
    httpMethod = org.acra.sender.HttpSender.Method.PUT,

    formKey = ""
)

public class Application extends android.app.Application {

    public void onCreate() {
        super.onCreate();
        ACRA.init(this);

私のアプリケーションは、ログ メッセージを含むメモリ内循環バッファを保持しています。これはディスクに書き込まれません。エントリが追加されるたびにこれを文字列にレンダリングして putCustomData() を呼び出すことは特に望んでいませんでした。その代わりに、静的な「ダンパー」メソッドである VPNLog.dumpLast() を呼び出して、HttpSender.send() が実行される直前にレポートを変更します。新しいコードは次のようになります。

@ReportsCrashes(
    mode = ReportingInteractionMode.DIALOG,
    resDialogText = R.string.crash_dialog_text,
    resDialogCommentPrompt = R.string.crash_dialog_comment_prompt,

    formUri = "https://kpc.cloudant.com/acra-openconnect/_design/acra-storage/_update/report",
    formUriBasicAuthLogin="[restricted reporter login]",
    formUriBasicAuthPassword="[restricted reporter password]",
    // reportType and httpMethod are now defined below

    formKey = ""
)

public class Application extends android.app.Application {

    public void onCreate() {
        super.onCreate();
        ACRA.init(this);
        ACRA.getErrorReporter().setReportSender(
            new HttpSender(org.acra.sender.HttpSender.Method.PUT,
                           org.acra.sender.HttpSender.Type.JSON,
                           null) {

                @Override
                public void send(CrashReportData report) throws ReportSenderException {
                    report.put(ReportField.APPLICATION_LOG, VPNLog.dumpLast());
                    super.send(report);
                }

            });

追加する値は長い (100 行以上) 文字列です。Acralyzer はそれを別々の番号付き行に正しく分割します。

もう 1 つのオプションは、ReportField.CUSTOM_DATA に複数のキーと値のペアを入力することです。

report.put(ReportField.CUSTOM_DATA, "key0=value0\nkey1=value1\n");

Acralyzer はこれらを HTML テーブルに表示します。

于 2014-08-03T23:50:15.867 に答える