标签:android   class   style   log   com   http   it   si   使用

使用的工具:Android studio

首先,需要了解的是:

ACRA有3种方式将错误信息提交到后台:

1.邮件形式,但经过测试,发现会调用系统的邮箱进行发送到指定的邮箱,如果没有邮箱,则会报错,如果没有登陆,则要登陆才去发送,很显然,中国很少会登录邮箱的,也懒得登录去发送。第一种方式,不推荐使用。

2.以GoogleDoc形式发送到一个我也不知道怎么搭建的后台。有兴趣的可以去尝试:http://www.jianshu.com/p/fd4d6a7c6175

3.自定义发送器进行发送

这里用的是第3种方式进行提交:

第一步:

配置Gradle:

 compile ‘ch.acra:acra:4.9.0‘ // 应用崩溃信息

第二步:

自定义两个类:CrashSenderFactory和CrashSender类,其中发送的内容是在CrashSender中..

package com.lanhetech.testdemo;import android.content.Context;
import android.support.annotation.NonNull;import com.orhanobut.logger.Logger;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.Callback;import org.acra.ReportField;
import org.acra.collector.CrashReportData;
import org.acra.sender.ReportSender;
import org.acra.sender.ReportSenderException;import okhttp3.Call;
import okhttp3.Response;public class CrashSender implements ReportSender {@Overridepublic void send(@NonNull Context context, @NonNull CrashReportData errorContent) throws ReportSenderException {// 自定义需要发送的内容到后台OkHttpUtils.get().url("http://h-bolin.imwork.net:14572/TestServlet/servlet/UploadServlet").addParams("APP_VERSION_CODE", errorContent.getProperty(ReportField.APP_VERSION_CODE)).addParams("APP_VERSION_NAME", errorContent.getProperty(ReportField.APP_VERSION_NAME)).addParams("PACKAGE_NAME", errorContent.getProperty(ReportField.PACKAGE_NAME)).addParams("FILE_PATH", errorContent.getProperty(ReportField.FILE_PATH)).addParams("PHONE_MODEL", errorContent.getProperty(ReportField.PHONE_MODEL)).addParams("ANDROID_VERSION", errorContent.getProperty(ReportField.ANDROID_VERSION)).addParams("BUILD", errorContent.getProperty(ReportField.BUILD)).addParams("BRAND", errorContent.getProperty(ReportField.BRAND)).addParams("STACK_TRACE", errorContent.getProperty(ReportField.STACK_TRACE)).addParams("STACK_TRACE_HASH", errorContent.getProperty(ReportField.STACK_TRACE_HASH)).addParams("USER_CRASH_DATE", errorContent.getProperty(ReportField.USER_CRASH_DATE)).addParams("DUMPSYS_MEMINFO", errorContent.getProperty(ReportField.DUMPSYS_MEMINFO)).addParams("DEVICE_ID", errorContent.getProperty(ReportField.DEVICE_ID)).build().execute(new Callback() {@Overridepublic Object parseNetworkResponse(Response response, int id) throws Exception {Logger.d("response=" + response.toString());return null;}@Overridepublic void onError(Call call, Exception e, int id) {}@Overridepublic void onResponse(Object response, int id) {}});}
}

View Code

package com.lanhetech.testdemo;import android.content.Context;
import android.support.annotation.NonNull;import org.acra.config.ACRAConfiguration;
import org.acra.sender.ReportSender;
import org.acra.sender.ReportSenderFactory;public class CrashSenderFactory implements ReportSenderFactory {@NonNull@Overridepublic ReportSender create(@NonNull Context context, @NonNull ACRAConfiguration config) {return new CrashSender();}
}

View Code

第三步:

自定义MyApplication

package com.lanhetech.testdemo;import android.app.Application;
import android.content.Context;import org.acra.ACRA;
import org.acra.ReportingInteractionMode;
import org.acra.annotation.ReportsCrashes;@ReportsCrashes(mode = ReportingInteractionMode.TOAST,resToastText = R.string.app_error,// 更换默认的发送器reportSenderFactoryClasses = {com.lanhetech.testdemo.CrashSenderFactory.class}
)
public class MyApplication extends Application {@Overrideprotected void attachBaseContext(Context base) {super.attachBaseContext(base);ACRA.init(this);}@Overridepublic void onCreate() {super.onCreate();}
}

View Code

第四步:

修改AndroidManifest.xml内容,获取权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.lanhetech.testdemo"><!--获取权限--><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission><!--修改这里application name--><applicationandroid:name=".MyApplication"android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".Main2Activity"></activity></application></manifest>

View Code

到这里,ARCA就配置好了,但需要后台的配合。

以下是web的Servlet的代码:

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// TODO Auto-generated method stub// super.doGet(req, resp);System.out.println("参数内容:" + req.getParameter("APP_VERSION_CODE"));System.out.println("参数内容:" + req.getParameter("APP_VERSION_NAME"));System.out.println("参数内容:" + req.getParameter("PACKAGE_NAME"));System.out.println("参数内容:" + req.getParameter("FILE_PATH"));System.out.println("参数内容:" + req.getParameter("PHONE_MODEL"));System.out.println("参数内容:" + req.getParameter("ANDROID_VERSION"));System.out.println("参数内容:" + req.getParameter("BUILD"));System.out.println("参数内容:" + req.getParameter("BRAND"));System.out.println("参数内容:" + req.getParameter("STACK_TRACE"));System.out.println("参数内容:" + req.getParameter("STACK_TRACE_HASH"));System.out.println("参数内容:" + req.getParameter("USER_CRASH_DATE"));System.out.println("参数内容:" + req.getParameter("DUMPSYS_MEMINFO"));System.out.println("参数内容:" + req.getParameter("DEVICE_ID"));PrintWriter out = resp.getWriter();out.println("0");out.flush();out.close();}

View Code

测试:

public class MainActivity extends AppCompatActivity {private ImageView main_show_img;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);"1".substring(5);}
}

View Code

测试结果:

参数内容:1.0
参数内容:com.lanhetech.testdemo
参数内容:/data/data/com.lanhetech.testdemo/files
参数内容:Coolpad 8705
参数内容:4.3
参数内容:BOARD=unknown
BOOTLOADER=unknown
BRAND=Coolpad
CPU_ABI=armeabi-v7a
CPU_ABI2=armeabi
DEVICE=Coolpad8705
DISPLAY=4.3.018.P1.140225.8705
FINGERPRINT=Coolpad/Coolpad8705/Coolpad8705:4.3/JSS15Q/4.3.045.P1.160407.8705:user/release-keys
HARDWARE=pxa1l88
HOST=ubuntu
ID=JSS15Q
IS_DEBUGGABLE=false
MANUFACTURER=Coolpad
MODEL=Coolpad 8705
PRODUCT=Coolpad8705
RADIO=unknown
SERIAL=870520131010
TAGS=release-keys
TIME=1460020349000
TYPE=user
UNKNOWN=unknown
USER=system1
VERSION.CODENAME=REL
VERSION.INCREMENTAL=unknown
VERSION.RELEASE=4.3
VERSION.RESOURCES_SDK_INT=18
VERSION.SDK=18
VERSION.SDK_INT=18参数内容:Coolpad
参数内容:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lanhetech.testdemo/com.lanhetech.testdemo.MainActivity}: java.lang.StringIndexOutOfBoundsException: length=1; index=5at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2224)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2279)at android.app.ActivityThread.access$600(ActivityThread.java:144)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)at android.os.Handler.dispatchMessage(Handler.java:99)at android.os.Looper.loop(Looper.java:137)at android.app.ActivityThread.main(ActivityThread.java:5215)at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke(Method.java:525)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:760)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.StringIndexOutOfBoundsException: length=1; index=5at java.lang.String.indexAndLength(String.java:579)at java.lang.String.substring(String.java:1438)at com.lanhetech.testdemo.MainActivity.onCreate(MainActivity.java:32)at android.app.Activity.performCreate(Activity.java:5146)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2188)... 11 more
java.lang.StringIndexOutOfBoundsException: length=1; index=5at java.lang.String.indexAndLength(String.java:579)at java.lang.String.substring(String.java:1438)at com.lanhetech.testdemo.MainActivity.onCreate(MainActivity.java:32)at android.app.Activity.performCreate(Activity.java:5146)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2188)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2279)at android.app.ActivityThread.access$600(ActivityThread.java:144)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269)at android.os.Handler.dispatchMessage(Handler.java:99)at android.os.Looper.loop(Looper.java:137)at android.app.ActivityThread.main(ActivityThread.java:5215)at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke(Method.java:525)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:760)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)at dalvik.system.NativeStart.main(Native Method)参数内容:null
参数内容:2016-09-29T16:33:34.236+08:00
参数内容:Permission Denial: can‘t dump meminfo from from pid=20656, uid=10084 without permission android.permission.DUMP
参数内容:null

View Code

注意点:

首先需要注意一点,Acra使用独立进程:acra,进行采集数据的发送,保证当app崩溃时,采集仍然能发送出去。
由于使用独立的进程,所以会导致application被实例化多次,这样就需要注意app自身的某些业务逻辑,不要在application类中执行多次,从而导致app产生bug。
对Acra的相关配置一般在application中进行初始化。

参考资料:

http://www.jianshu.com/p/fd4d6a7c6175

http://blog.sina.com.cn/s/blog_8a86f4dd0101g6d4.html

http://blog.csdn.net/fhlkm/article/details/8603133

ACRA 框架的使用 – 发送到后台解析(后台的代码也在)

标签:android   class   style   log   com   http   it   si   使用

原文:http://www.cnblogs.com/H-BolinBlog/p/5920401.html

ACRA崩溃报告详解相关推荐

  1. Jacoco代码覆盖率报告详解

    一.JaCoCo Jacoco从多种角度对代码进行了分析,包括指令(Instructions,C0 Coverage),分支(Branches,C1 Coverage),圈复杂度(Cyclomatic ...

  2. 微软白皮书:47页报告详解中国芯片设计云技术

    来源:智东西 在多方面因素的推动下,中国的芯片设计行业迎来了前所未有的发展契机.当前,我国芯片设计业的产品范围已经涵盖了几乎所有门类,且部分产品已拥有了一定的市场规模,但我国芯片产品总体上仍然处于中低 ...

  3. 性能测试基础之JMeter聚合报告详解

    提示:聚合报告组件的使用和察看结果树组件的使用方式相同.本篇文章主要是详细的介绍一下聚合报告组件内容,不做示例演示. 1.聚合报告介绍 在使用JMeter进行性能测试时,聚合报告(Aggregate ...

  4. JMeter基础 — JMeter聚合报告详解

    提示:聚合报告组件的使用和察看结果树组件的使用方式相同.本篇文章主要是详细的介绍一下聚合报告组件内容,不做示例演示. 1.聚合报告介绍 在使用JMeter进行性能测试时,聚合报告(Aggregate ...

  5. 帆软所有销量为0的显示为空值_市场上最流行的9款跨境电商亚马逊销量预估工具精准度报告详解!...

    很多用户都知道JS产品的数据精准度是目前市场上最好的,今年我们继续做了"2019亚马逊销量预估准确度调研报告",将市场上的销量预估工具进行多维度对比分析,报告如下. 2019版报告 ...

  6. SICC大会发布银行、保险用户报告——详解C2B下的服务创新

    11月26日,在由腾讯联合洛可可·洛客.永辉超市.微众银行.微保等多家企业主办的首届服务创新大会上,腾讯用户研究与体验设计部(以下简称CDC)正式对外发布<2018银行业用户体验大调研报告> ...

  7. 阿里云96页报告详解《云上转型》(10个案例、10大趋势/完整版PPT)

    阿里云研究中心云上转型报告:第四次计算革命孕育"数字经济体" 纵观2000年的人类历史,计算与商业始终是一对互相促进的"孪生兄弟",创造出许许多多崭新的商业模式 ...

  8. Teams会议/实时事件中的参会者报告详解

    参会者报告本身是个非常好的功能,让老板可以抓大家的出勤率.但是这个报告有几个不完美的地方或者说仔细看会发现一些问题. 首先会议报告必须由会议组织者在会议进行中抓取,如果你忘记了第二天再进去抓,抓出来的 ...

  9. openGauss/MogDB WDR报告详解

    摘要 WDR(Workload Diagnosis Report)负载诊断报告,是openGauss的工作负载诊断报告,常用于判断openGauss长期性能问题.WDR报告基于两次不同时间点系统的性能 ...

最新文章

  1. RADIUS协议:认证与计费的鼻祖
  2. python小白——进阶之路——day6天---字符串相关相关函数,格式化(format)
  3. android error: undefined reference to 的错误分析
  4. ssl提高组周四备考赛【2018.11.1】
  5. java dataset类的方法,C#中DataSet转化为实体集合类的方法
  6. libevent简述
  7. 数据挖掘:模型选择——SVM
  8. Hbase单机安装及使用hbase shell进行简单操作
  9. 采用单/双缓冲区需要花费的时间
  10. premiere直接使用计算机素材,Premiere使用技巧之视频捕捉 -电脑资料
  11. vue导出excel加一个进度条_vue纯前端导出excel表格
  12. java lang ClassCastException java lang Integer cannot be ca
  13. 话费充值折扣数据库_《京东话费充值系统架构演进实践》--阅读
  14. 计算机组装 仿真交互,《计算机硬件组装》仿真交互系统设计与实现.doc
  15. 太爽啦,GitHub网站1S变VS Code
  16. Numpy入门(九):np.corrcoef()用法
  17. 集美大学计算机工程学院转专业,2021年集美大学大一新生转专业及入学考试相关规定...
  18. 树莓派4B+配件+Intel神经棒2代购机指南
  19. 软件测试的生命周期及基本流程
  20. 2018计算机软件著作权,2018年我国计算机软件著作权登记量破百万件

热门文章

  1. 人工智能的“无间道”通向何方
  2. 抓取淘宝商品价格人气-http://hws.m.taobao.com/cache/wdetail/5.0
  3. Autodesk激活出错提示代码0015.111
  4. 国际交流学术英文写作hnu(仅供参考)
  5. 阿甘修理机器人cd_剑网3遗失的美好-剑网3遗失的美好换哪个好-剑网3遗失的美好可兑换物品一览_牛游戏网...
  6. MFC Windows 程序设计[三十五]之五彩十六宫格
  7. 数据库PostrageSQL-服务器配置连接和认证
  8. Linux echo $DISPLAY输出为空
  9. XDown 2.0.2.3中文版:小编自用款mac下载工具
  10. HTML5 之WebSocket入门demo和简易聊天室