Android下使用Crashlytics
2015-10-27 16:42
2051 查看
转自:http://blog.sina.com.cn/s/blog_48964b120102uz8w.html
国内Android开发者应该主要使用友盟做数据统计分析,但个人在开发中发现这货越来越不靠谱,错误分析和事件统计数据时有时无,或者数据大起大落;甚至统计到的错误信息还包含友盟SDK自己的错误。跟他们客服和技术也沟通过,要么是让你发apk包,要么是让你自己看文档,问题始终没得到解决,然后很自然想到国外的类似工具。
Crashlytics在国外用的比较多,特别是iOS平台。Square、Walmart、Paypal、Yammer、Yelp、Path、Expedia、Waze、Groupon等众多大咖级别的APP都是其用户,而且目前也开始支持Android平台。而其他同类产品localytics、geckoboard等要么不支持Android、要么收费、要么没什么人用。
第一次用过之后的感受就是:高端、大气、上档次:
1.注册需要审核通过才能使用,国内同类产品顶多发个邮箱激活链接;
2.支持Eclipse、Intellij IDEA和Android Studio等三大IDE;
3.Eclipse插件是iOS主题风格UI,跟其他plugin在一起简直是鹤立鸡群;
4.只要登录帐号并选择项目,会自动导入jar包并生成一个序列号,然后在
5.不像友盟等国内同类产品,将固定的序列号直接写入xml文件,而是动态自动生成的;当然这个存放序列号的xml文件也是不能修改和提交到版本控制系统的;
6.后台可以设置邮件提醒,当然这个最好不要开启,Android开发那数量惊人、千奇百怪的错误信息你懂的。
7.不仅能统计到
8.相当详细的错误信息,不仅仅是简单的打印StackTrace信息;并且能看到最近一次crash的机器可用内存等信息,而不仅仅是简单统计机型和版本号。
虽然看起来很强大,一开始使用还是遇到了两个问题:
然后只能看官方文档上找答案。发现有一篇讲怎么强制crash的文章,但仔细一看也没什么,只要在
正在茫然的时候,想到了
这样的话,很有可能是我们自定义的
虽然友盟也是默认下次启动时上传错误信息,但感觉Crashlytics可靠多了,而且还是墙外的东西,做到这水平真心不容易了。
不过有个小问题,当初自己捕获异常只是kill掉当前的进程:
这样做不会影响之前的页面,但默认的处理方式是直接杀掉整个应用,这样对用户体验肯定有些影响,但为了能可靠的统计到所有异常信息,也只能做点牺牲了。
经过几天观察,Crashlytics统计到的错误信息数量确实比友盟更多,看来没选错。
那如果我们自定义了
但后面还是出现了一个问题,有用户反馈新版本安装后移动时就crash了,而Crashlytics后台却看不到该信息。那么很显然是在Crashlytics初始化之前就出现了异常。
我们在Library Project中定义了一个
这说明我们Crashlytics初始化的时机不对,需要将Crashlytics代码放到
=============
libs导包
登录帐号并选择项目,会自动导入jar包并生成一个序列号,然后在
国内Android开发者应该主要使用友盟做数据统计分析,但个人在开发中发现这货越来越不靠谱,错误分析和事件统计数据时有时无,或者数据大起大落;甚至统计到的错误信息还包含友盟SDK自己的错误。跟他们客服和技术也沟通过,要么是让你发apk包,要么是让你自己看文档,问题始终没得到解决,然后很自然想到国外的类似工具。
Crashlytics在国外用的比较多,特别是iOS平台。Square、Walmart、Paypal、Yammer、Yelp、Path、Expedia、Waze、Groupon等众多大咖级别的APP都是其用户,而且目前也开始支持Android平台。而其他同类产品localytics、geckoboard等要么不支持Android、要么收费、要么没什么人用。
第一次用过之后的感受就是:高端、大气、上档次:
1.注册需要审核通过才能使用,国内同类产品顶多发个邮箱激活链接;
2.支持Eclipse、Intellij IDEA和Android Studio等三大IDE;
3.Eclipse插件是iOS主题风格UI,跟其他plugin在一起简直是鹤立鸡群;
4.只要登录帐号并选择项目,会自动导入jar包并生成一个序列号,然后在
AndroidManifest.xml和启动
Activity的入口添加初始化代码,可以说是一键式操作,当然要使用除错误统计外的其他功能还是得自己添加代码;
5.不像友盟等国内同类产品,将固定的序列号直接写入xml文件,而是动态自动生成的;当然这个存放序列号的xml文件也是不能修改和提交到版本控制系统的;
6.后台可以设置邮件提醒,当然这个最好不要开启,Android开发那数量惊人、千奇百怪的错误信息你懂的。
7.不仅能统计到
UncaughtException这种未捕获的Crash异常信息,只要在
try/
catch代码块的
catch中添加一行代码就能统计到任何异常;
try{ myMethodThatThrows(); }catch(Exception e){ Crashlytics.logException(e); //handle your exception here! } |
虽然看起来很强大,一开始使用还是遇到了两个问题:
自定义UncaughtExceptionHandler和Crashlytics相冲突
一开始肯定想看看错误统计的即时性,通过手动添加代码throw new RuntimeException模拟crash,但是后台始终看不到错误数据。
然后只能看官方文档上找答案。发现有一篇讲怎么强制crash的文章,但仔细一看也没什么,只要在
Crashlytics.start()调用之后就行了。
正在茫然的时候,想到了
UncaughtExceptionHandler,之前有篇文章专门讲怎么通过它捕获应用全局异常信息。很显然,这种错误统计工具应该也是这么干的。
这样的话,很有可能是我们自定义的
UncaughtExceptionHandler跟Crashlytics的SDK中定义的相冲突了,于是注释掉了自己的这部分代码,最后终于从后台看到错误日志了。
虽然友盟也是默认下次启动时上传错误信息,但感觉Crashlytics可靠多了,而且还是墙外的东西,做到这水平真心不容易了。
不过有个小问题,当初自己捕获异常只是kill掉当前的进程:
android.os.Process.killProcess(android.os.Process.myPid()); |
经过几天观察,Crashlytics统计到的错误信息数量确实比友盟更多,看来没选错。
Crashlytics初始化的时机
默认情况下,Eclipse插件会自动通过AndroidMafifest.xml找到用于launch的
Activity,然后在其
onCreate()方法中调用
Crashlytics.start()完成初始化。显然这是个单例模式,只需要初始化一次。当然,你在每个
Activity中都掉用一次也是没有问题的。
那如果我们自定义了
Application子类,能否直接在其中初始化呢,答案是肯定的,详见这篇文章。
但后面还是出现了一个问题,有用户反馈新版本安装后移动时就crash了,而Crashlytics后台却看不到该信息。那么很显然是在Crashlytics初始化之前就出现了异常。
我们在Library Project中定义了一个
BaseApplication extends Application,然后在实际项目中又定义了一个
MyApplication extends BaseApplication,而我们是在
MyApplication的
onCeate()方法中初始化Crashlytics的,而且还是在调用父类
BaseApplication的
onCreate()方法之后,通过logcat看到异常正是在
BaseApplication的
onCreate()方法中发生的,这时候Crashlytics还没初始化,当然也就统计不到数据了。
这说明我们Crashlytics初始化的时机不对,需要将Crashlytics代码放到
BaseApplication的
onCreate()中执行。
=============
libs导包
登录帐号并选择项目,会自动导入jar包并生成一个序列号,然后在
AndroidManifest.xml和启动
Activity的入口
相关文章推荐
- android之View坐标系(view获取自身坐标的方法和点击事件中坐标的获取)
- AndroidDevTools简介
- Android HandlerThread 完全解析
- [Android Pro] Android 4.3 NotificationListenerService使用详解
- Android 获取有TabActivity继承关系的子类名的方法 及 获取Activity类名的方法
- 如何让android开机后自动运行自己的程序
- ListView或GridView 顶部间距
- Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix
- Android 使用CheckBox实现ListView自定义单选
- Android github开源项目学习之—仿知乎APP(一)
- android weight属性
- androidstudio快捷键
- Android实战技巧:多线程AsyncTask(版本不同,有点差异)
- Android开发,使用Volley框架进行简单数据交互
- Android Canvas使用
- Android动画循环弹动cycleInterpolator
- 关于EditText组件在android4.4W中出现黄色感叹号的问题?
- Android数据存储的5种方法
- Android数据存储的5种方法
- android开发之使用上下文菜单