自动化工具 搭建自己的 crash 监控系统

snake · 2016年01月13日 · 最后由 ARF 回复于 2019年07月25日 · 5858 次阅读
本帖已被设为精华帖!

Snake 一直想做一个能监控 crash 的工具,像 google analytics 一样。

开发一个手机应用有如此多的限制,比如硬件限制(CPU,内存,电池等等)。如果你的代码不是足够合理,那就准备迎接世界上最严重的问题吧:Crash。根据研究所示:

应用崩溃是手机 app 用户抱怨最多的额问题

更严重的:如果一个应用连续崩溃 3 次,大概一半的用户会卸载这个应用

崩溃追踪系统,让开发者能够从用户的设备上收集到每一个导致崩溃的细节,专门用来解决这种应用崩溃问题。目前最流行的 2 个流行崩溃追踪系统是 Crashlytics 和 Parse Crash Reporting,这两个服务都是免费的,开发者可以免费集成他们到你的 app。当应用奔溃,整个跟踪报告就会发送到他们的后端,开发者可以及时快捷的修复这些严重的问题,这样,你就可以在很短的时间内奉上一个 “无 Crash” 的应用。

然而,这些服务的提供商会收集这些数据,对于对用户隐私敏感的公司还是有些顾虑的。

那么。。。是否有那种允许我们在自己服务器部署的崩溃追踪系统?当然有!!并且会非常容易创建,下面有请 Application Crash Reporting on Android (ACRA) 一个允许 Android 应用自动发送崩溃报告到自己服务器的库。

1. Ubuntu 上安装 Acralyzer

首先从安装 couchdb 开始,打开终端,输入如下命令:

apt-get install couchdb

使用如下指令来验证是否安装成功

curl http://127.0.0.1:5984

如果安装成功,会返回如下信息

{"couchdb":"Welcome","version":"1.6.1"}

编辑/etc/couchdb/local.ini 文件来允许我们通过外部 IP 来访问 CouchDB(默认只能通关 127.0.0.1 来访问)。只需要把下面两行的注释去掉即可。

;port = 5984
;bind_address = 127.0.0.1

然后修改为:

port = 5984
bind_address = 0.0.0.0

在这个文件里,你还应该添加一个用户名/密码来作为管理员账户,找到这一行(一般是在文件末尾):

[admins]

在它的下一行添加一个 username=password 形式的内容。例如:

snake = 12345

不用担心在这里写明文密码会不会有问题,一旦 CouchDB 重启后,你的密码会被自动哈希加密,并且是不可读的

保存文件,通过下面的语句来重启 CouchDB:

curl -X POST http://localhost:5984/_restart -H"Content-Type: application/json"

如果报权限错误,就加上权限 username:password@host:5984

curl -X POST http://snake:123456@localhost:5984/_restart -H"Content-Type: application/json"

2. Mac 上安装 Acralyzer
mac 上我用homebrew 安装 couchdb, 一条命令就够了。

brew install couchdb 

启动也很简单,

couchdb 

你将看到

➜  ~  couchdb
Apache CouchDB 1.6.1 (LogLevel=info) is starting.
Apache CouchDB has started. Time to relax.
[info] [<0.32.0>] Apache CouchDB has started on http://127.0.0.1:5984/
[info] [<0.108.0>] 127.0.0.1 - - GET / 200
[info] [<0.102.0>] 127.0.0.1 - - GET /favicon.ico 200

后面的步骤跟 ubuntu 上一样,只是配置文件在:/usr/local/etc/couchdb/local.ini


现在,你就可以通过浏览器来访问 CouchDB 了,网页服务被称为 Futon—CouchDB 的界面后端。通过以下地址来打开浏览器:

http://<YOUR_SERVER_IP>:5984/_utils


多了两数据库.

3. 配置本地数据库
现在我们要安装一个 acro-storage(Acralyzer 的存储端)。通过右侧的菜单,点击 Replicator(复制器),并填写表单的 from Remote Database 和 from Remote Database 类似如下所示:

from Remote Database: http://get.acralyzer.com/distrib-acra-storage

to Local Database: acra-myapp

然后点击 Replicate,等待它完成。

然后使用类似的方法安装 Acralyzer:

from Remote Database: http://get.acralyzer.com/distrib-acralyzer

to Local Database: acralyzer

还是点击 Replicate 来安装

如果你上面做的都对的话,你会发现系统里多了 2 个数据库—-acra-myapp 和 acralyzer.

注意:你先要用你开始创建的 admin 登录进去,不然会出错。
myapp 是你打算监控的项目名字。
如果你有多个项目要监控,多安装几个 acro-storage

离成功很近了,下一步,我们要创建用户,打开浏览器,转到这个网址:

http://<YOUR_SERVER_IP>:5984/acralyzer/_design/acralyzer/index.html

进入 Admin 页并点击 Users

创建后,拷贝生成的信息到记事本,后面有用

然后去数据库 acra-myapp,给这个帐号加上 read 权限


4. 在客户端安装 ACRA
首先需要在 build.gradle 中添加一个 (dependency) 依赖(使用 Android Studio):

compile 'ch.acra:acra:4.6.1'

同步你的 gradle 文件,然后创建一个自定义的 Application 类
在你的自定义 Application 类上面添加一个 Annotation @ReportCrashes
贴上你前面保存在记事本的信息

最后一步,不要忘记在 AndroidManifest.xml 中添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

测试
造一个 crash

到监控上面去看一下

有了,大功告成

点开可以看到 bug 的详细信息

还有很多功能,不在这里啰嗦了。
有兴趣的话,可以参照:
ACRA
ACRA|git

后记:这玩意折腾起来不难,但是我掉进坑里了,浪费了很多时间,甚至一度想放弃了。

原创不易,转载请标明来自 Testerhome! (微信公众号 “软件测试精品” 已转发)

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 43 条回复 时间 点赞
  1. 配置本地数据库

这一步是不是很慢,我这里转圈圈转了很久了

#1 楼 @yuweixx 我错了,这里需要先登录~~~

学习了

—— 来自 TesterHome 官方 安卓客户端

感谢分享,学习中~

感谢分享

受教了,感谢分享

这种是必须修改被测 apk 的源码吗?

#7 楼 @niuniudd 是的,需要添加一个 java 文件和一个权限。

请问有没有思路可以在不更改被测 apk 代码的前提下抓取 crash?

#10 楼 @yuweixx 那是不是自己解析、过滤 logcat 日志更好?

#11 楼 @quqing 应用场景不一样,如果测试的时候,一直连着 adb,logcat 抓日志当然方便;就算没有连接,如果是易重现的 crash,用 logcat 抓日志也方便。但总有些时候,遇到的是偶现的 crash,恰好没有连 adb,这种场景就需要一个能随时抓日志的工具。

有道理,赞一个

#12 楼 @yuweixx 最近在研究这块,搞了个 apk,启动一个 service,使用 logcat 命令抓取日志,但发现只能抓取当前 apk 的日志,还在研究怎么破

非常不错的分享。但是是不是可以利用已用的 crash 平台, crashlytics 然后做一个总汇 dashboard

#14 楼 @niuniudd 权限问题吧,adb 的权限和 apk 的权限是不一样的

我想问下这个的安全性如何,有没有什么安全风险?

#16 楼 @yuweixx apk 的权限被我提升到 system 了,还是一样,看来必须要 root 权限才行

眼瞎的表示,登陆按钮找了好久。登陆按钮在右下角,登陆按钮在右下角,登陆按钮在右下角,重要的事情说三遍

snake #23 · 2016年01月19日 Author

#20 楼 @wangfuwen000 当数据库启动时,你看下 log 信息,它启动的是哪个 IP,调试的话,你用 charles 或者 Fiddler,看下请求和返回。

#22 楼 @andyguo 我没有遇到这个问题哦

#22 楼 @andyguo 我这边也是这样,创建数据库的时候,不断转菊花(已登陆),有没其他可以替代的链接

赞,除了崩溃问题,ANR 问题能获取么?

太值得学习了,感谢楼主

我在 centos 上安装的为什么 Reports 栏有数据,而 bugs 栏没数据呢,有遇到的吗,一起学习一下~谢谢

anderson 你好多英文名啊

#12 楼 @yuweixx adb shell bugreport > bugreport.log
可以获取最近一段时间的 log

#31 楼 @michael_wang 学习了,多谢。

谢谢分享,涨姿势了。

干货,不过这个需要开发配合着安装吧?

有没有对整个安卓手机的所有 crash 等错误进行监控的工具?

—— 来自 TesterHome 官方 安卓客户端

匿名 #38 · 2016年06月29日

更新楼主

楼主 ios 的 monkey 测试整明白没有,望请教

anr crash tombstone,这些问题都可以抓吗?需要开发人员在代码中添加类吗?

45楼 已删除

#21 楼 @snake 复制数据库到本地,一直没有成功,是什么原因?

棒棒哒!不知能否抓取 anr crash tombstone?

—— 来自 TesterHome 官方 安卓客户端

46楼 已删除

收藏学习了,感谢分享

—— 来自 TesterHome 官方 安卓客户端

@yuweixx 在不登录的情况下可以看到报告页面的图表吗? 需要怎么配置? 感觉这个报告图表应该不需要登录就能看到才比较正常

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册