由于自己最近在跟一个项目,怎么说呢,项目功能真的是太多了,有时测试的MM忙不过来,有些隐形的bug没发现出来,但是我认为整体稳定性不够好,有时会Crash掉,这也给那些出去演示的市场部伙伴带来了不少的尴尬,虽然说现在属于测试阶段,但毕竟是上线的项目,用户体验不好,有时直接可能会杀死一个产品,而市场部的伙伴在演示的时候也不知道程序崩溃crash具体的操作流程,因为挂的那么突然 = = !,所以每次演示回来都会提出一些UI和程序挂掉的BUG,于是经常会出现如下的对话场景,然而作为程序猿傲娇的本能,“怎么可能?你能给我重现吗?......”,”并不能,但是balabala.....“,好吧,有问题总得改吧,但是他们也只能说出大概挂掉的地方,于是,你就得跟这个bug,看的你是一脸懵逼,根本不知道挂在哪里,好伐???!!!要是你能告诉我挂在那一行,是什么原因,我就至少可以有针对性的改啊。 ~ ~
好了,说了这么多,我相信应该有人和我同样的感觉吧,要是能记录下挂掉的行数和原因那该多好啊,于是我搜索了一下,还真有这样的,满足我的需求。它可以自动捕获程序异常,并记录存储在本地,最主要的是它可以自动上传到邮箱和发送到服务器,而且原作者对此方法进行了封装,只要进行简单的配置就可以使用了。
这里我就直接给出作者的文章地址(文章地址在文末)吧,不过,我这里做一些小的补充,因为就算有了别人的框架,我按照他的说明还是没完全成功,并不能发送到邮箱,只能保存异常信息到本地sd卡上,作为并没接触过邮件发送的我,也不知道原因出在哪,我看到好多人在下载源代码的链接下面留言说不能用,以为真的不能用,但是我不甘心,于是我又搜索了一些资料,终于看出了一些端倪,原来是我的邮箱的smtp服务功能没开启,邮箱为了安全起见,默认是关闭的,也就是不能自动发送邮件。
好的,下面我给出此框架的使用步骤吧。
使用本框架前,你需要以下jar包 android-crash-1.0.jar activation.jar additionnal.jar mail.jar 后面的3个是可选的,如果你用邮件的方式的话,就需要它们,如果采用服务器的方式,就不用了。这几个jar包,点击此处下载。
首先先说使用步骤吧:
1,添加jar包
①,如果你是Eclipse用户,你想用到邮件的发送来处理异常信息,那你得需要将上面的4个jar包添加到你的项目中,具体步骤不会的可百度。
②,如果你是Android studio用户,你需要在build.gradle(Project:xxx)下的repository中添加如下代码段
repository { jcenter() // or mavenCentral() }
在build.gradle(Module:xxx) 中的dependencies添加如下依赖
compile 'com.githang:android-crash:1.0'
后面的3个是可选的,如果用邮件的方式发送的话,需要添加jar包,和添加相应的依赖
其实上述的添加依赖是可以自动完成的,当你把jar包导入后,然后邮件你的jar包,会出现add to library,你添加后,会在依赖中发现已经帮你自动添加了。
2,属性配置
自定义一个类,让其继承于Application,并在AndroidManifest.xml中的application节点中使用name属性,将类名添加进去,这样当程序一启动就会先执行继承自application类里面的配置,最后要别忘了添加权限,一个是网络权限,一个是往sd卡写的权限
public class MyApplication extends Application{ @Override public void onCreate() { super.onCreate(); initHttpReporter(); } /** * 使用EMAIL发送日志 */ private void initEmailReporter() { CrashEmailReporter reporter = new CrashEmailReporter(this); reporter.setReceiver("你的接收邮箱"); reporter.setSender("[email protected]"); reporter.setSendPassword("xxxxxxxx");//说到这个密码,你可以设置一个客户端授权码,它是登录第三方客户端的专用密码,和主登录密码不冲突 reporter.setSMTPHost("smtp.163.com");//这里使用的是163发送邮件的服务,所以主机名是163的,有需要修改的,也可以更改对应的主机名 reporter.setPort("465");//端口号,可选25端口号,具体的看是否使用ssl安全协议 AndroidCrash.getInstance().setCrashReporter(reporter).init(this); } /** * 使用HTTP发送日志 */ private void initHttpReporter() { CrashHttpReporter reporter = new CrashHttpReporter(this) { /** * 重写此方法,可以弹出自定义的崩溃提示对话框,而不使用系统的崩溃处理。 * @param thread * @param ex */ @Override public void closeApp(Thread thread, Throwable ex) { // final Activity activity = AppManager.currentActivity(); // Toast.makeText(activity, "发生异常,正在退出", Toast.LENGTH_SHORT).show(); // 自定义弹出对话框 new AlertDialog.Builder(getApplicationContext()). setMessage("程序发生异常,现在退出"). setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // AppManager.AppExit(activity); } }).create().show(); Log.d("MyApplication", "thead:" + Thread.currentThread().getName()); } }; reporter.setUrl("http://xxx.crashreport.jd-app.com/your_receiver").setFileParam("fileName") .setToParam("to").setTo("你的接收邮箱") .setTitleParam("subject").setBodyParam("message"); reporter.setCallback(new CrashHttpReporter.HttpReportCallback() { @Override public boolean isSuccess(int i, String s) { return s.endsWith("ok"); } }); AndroidCrash.getInstance().setCrashReporter(reporter).init(this); } }
具体怎么设置SMTP服务,请点击下面的链接 http://jingyan.baidu.com/article/0aa223755d15dc88cd0d6473.html
本框架的作者原文链接如下 http://blog.csdn.net/maosidiaoxian/article/details/27178439 具体的原理可参见此文
如果对以上内容有疑惑的,欢迎留言!!