我正在使用ACRA我的Android应用程序。我的问题是,当崩溃发生时,我怎样才能确保在报告崩溃之前执行一些代码。我的意思是我想在崩溃发生时添加一些自定义变量,以便知道应用程序处于什么状态?
请帮忙
谢谢
答案 0 :(得分:2)
按照here所述实施您自己的发件人。它可以简单地包围一些现有的发送者,在那里转发发送功能。
在发件人代码中,您可以在实际发送报告之前采取任何特殊操作。
答案 1 :(得分:1)
使用ACRA 4.5.0和HttpSender后端这对我有用。我在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表格中显示这些内容。
答案 2 :(得分: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);
}
}