3

我正在使用 ACRA 和我的 android 应用程序。我的问题是,当发生崩溃时,如何确保在报告崩溃之前执行一些代码。我的意思是我想在崩溃发生时添加一些自定义变量,以便我知道应用程序处于什么状态?

请帮忙

谢谢

4

3 回答 3

2

按照此处的描述实现您自己的发件人。它可以只是一些现有发件人的包装器,在那里转发发送功能。

在发送者代码中,您可以在实际发送报告之前采取任何特殊操作。

于 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 正确地将其分成单独的编号行。

另一种选择是使用多个键/值对填充 ReportField.CUSTOM_DATA:

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

Acralyzer 将在 HTML 表格中显示这些内容。

于 2014-08-03T23:50:15.867 回答
0

Acra 使用 Thread.setDefaultUncaughtExceptionHandler(...);

您可以设置自己的未捕获异常处理程序,然后调用 ACRA 生成报告:

public class My_Exception_Interceptor implements Thread.UncaughtExceptionHandler {

    /**
     * Sets up to catch an exception. 
     * Call this after initializing ACRA.
     */
    public void setUpFatalExceptionHandling() {
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    /**
     * Called by the JVM on an uncaught exception. 
     * @param t - the thread
     * @param e - the throwable
     */
    @Override
    public void uncaughtException(@Nullable Thread t, @NonNull Throwable e) {
        ...your code...
        ACRA.getErrorReporter().handleException(e, true);
    }
}
于 2019-01-29T18:03:18.073 回答