android 捕获系统异常并上传日志的实例

发布时间:2021-09-28 06:31:48

在做项目时,经常会把错误利用异常抛出去,这样在开发时就可以通过手机抛出的异常排查错误。但是当程序开发完毕,版本稳定,需要上线时,为了避免抛出异常影响用户感受,可以用uncaughtexceptionhandler捕获全局异常,对异常做出处理。比如我们可以获取到抛出异常的时间、手机的硬件信息、错误的堆栈信息,然后将获取到的所有的信息发送到服务器中,也可以发送到指定的邮件中,以便及时修改bug。

示例:

android 捕获系统异常并上传日志的实例

自定义异常类实现uncaughtexceptionhandler接口,当某个页面出现异常就会调用uncaughtexception这个方法,我们可以在这个方法中获取异常信息、时间等,然后将获取到的信息发送到我们指定的服务器

复制代码代码如下:

publicclassmycrashhandlerimplementsuncaughtexceptionhandler{

//需求是整个应用程序只有一个mycrash-handler

privatestaticmycrashhandlermycrashhandler;

privatecontextcontext;

privatedoubanserviceservice;

privatesimpledateformatdataformat=newsimpledateformat("yyyy-mm-dd-hh-mm-ss");

//1.私有化构造方法

privatemycrashhandler(){

}

publicstaticsynchronizedmycrashhandlergetinstance(){

if(mycrashhandler!=null){

returnmycrashhandler;

}else{

mycrashhandler=newmycrashhandler();

returnmycrashhandler;

}

}

publicvoidinit(contextcontext,doubanserviceservice){

this.context=context;

this.service=service;

}

publicvoiduncaughtexception(threadarg0,throwablearg1){

system.out.println("程序挂掉了");

//1.获取当前程序的版本号.版本的id

stringversioninfo=getversioninfo();

//2.获取手机的硬件信息.

stringmobileinfo=getmobileinfo();

//3.把错误的堆栈信息获取出来

stringerrorinfo=geterrorinfo(arg1);

//4.把所有的信息还有信息对应的时间提交到服务器

try{

service.createnote(newplaintextconstruct(dataformat.format(newdate())),

newplaintextconstruct(versioninfo+mobileinfo+errorinfo),"public","yes");

}catch(exceptione){

e.printstacktrace();

}

//干掉当前的程序

android.os.process.killprocess(android.os.process.mypid());

}

privatestringgeterrorinfo(throwablearg1){

writerwriter=newstringwriter();

printwriterpw=newprintwriter(writer);

arg1.printstacktrace(pw);

pw.close();

stringerror=writer.tostring();

returnerror;

}

privatestringgetmobileinfo(){

stringbuffersb=newstringbuffer();

//通过反*获取系统的硬件信息

try{

field[]fields=build.class.getdeclaredfields();

for(fieldfield:fields){

//*反*,获取私有的信息

field.setaccessible(true);

stringname=field.getname();

stringvalue=field.get(null).tostring();

sb.append(name+"="+value);

sb.append("n");

}

}catch(exceptione){

e.printstacktrace();

}

returnsb.tostring();

}

privatestringgetversioninfo(){

try{

packagemanagerpm=context.getpackagemanager();

packageinfoinfo=pm.getpackageinfo(context.getpackagename(),0);

returninfo.versionname;

}catch(exceptione){

e.printstacktrace();

return"版本号未知";

}

}

}

创建一个application实例将mycrashhandler注册到整个应用程序上,创建出服务并进行传递:

复制代码代码如下:

publicclassdoubanapplicationextendsapplication{

publicnoteentryentry;

@override

publicvoidoncreate(){

super.oncreate();

stringapikey="0fab7f9aa21f39cd2f027ecfe65dad67";

stringsecret="87fc1c5e99bfa5b3";

//获取到service

doubanservicemyservice=newdoubanservice("我的小豆豆",apikey,

secret);

myservice.setaccesstoken("1fa4e5be0f808a0b5eeeb13a2e819e21","56a622c1138dbfce");

mycrashhandlerhandler=mycrashhandler.getinstance();

handler.init(getapplicationcontext(),myservice);

thread.setdefaultuncaughtexceptionhandler(handler);

}

}

看了android 捕获系统异常并上传日志的实例还看了:
  • 筛选系统日志的例子

    本文介绍使用powershell读取系统日志,可以按日志名称、日志类型、时间等多个因素进行筛选。powershell中提供了一个叫get-eventlog的cmdlet,使用它可以读取系统日志。运行一下这个get-eventlog的cmdl...

  • 自动转报系统数据库进程异常的现象及处置过程的案例分析论文

    摘要:本文详细描述了自动转报系统数据库进程异常的现象及处置过程,总结了类似故障的处理方法及预防措施。关键词:自动转报系统;数据库*作处理进程dmhs_mon;压报;2010年,*区管中心从*民航总局航管科技公司引进了dmhs—h大型电报...

  • Linux查看系统日志的一些常用命令汇总

    last-a把从何处登入系统的主机名称或ip地址,显示在最后一行。-d指定记录文件。指定记录文件。将ip地址转换成主机名称。-f<记录文件>指定记录文件。-n<显示列数>或-<显示列数>设置列出名单的显示...

  • Android系统研发实习生求职信范文

    先生/女士您好:我在网上看到贵公司的招聘信息,我对android系统研发实习生职位非常有兴趣,特来应聘。对照公司及职位的要求,我的情况简述如下:1、*理工大学电子工程系研究生在读,研二,已获导师许可,每周可到职3天,能够保障连续6个月的实...

  • Linux系统日志子系统详解

    在linux系统中,有三个主要的日志子系统:连接时间日志--由多个程序执行,把纪录写入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统。进程统计--...