app组件加载异常监控
软件异常监控常常直接关联到软件本身的质量,完备的异常监控体系常常能够快速定位到软件运行中发生的问题,并能帮助我们快速定位异常的源头,提升软件质量。在服务端的话,可以通过tomcat日志查看定位,在native开发的app中我们也可以通过各种异常监控工具去监控,但是对于混合开发的app来说,通过上面的方式就不那么容易做到了。通常混合开发的app通过webview本地加载html、js、css,如果发生错误,应该怎样去捕获并传送给服务器呢?前端错误日志传送给服务器很简单,在异常发生时直接发请求就可以了,下面我们主要讨论下错误的捕获方案。
一、对于native开发的app
Android sdk提供了常用的四大组件,activity、broadcastReciver、contentProvider、service,对于activty来说,加载页面布局过程中,如果出现异常,那么程序就会崩溃,我们可以根据是否有异常发生来做截屏处理,将此时的logcat日志以及性能网络等状态一并上传至服务端,进行综合分析;对于broadcastReciver、contentProvider、service这三个组件来说,他们不同于activity,是不可见的部分,也做不到截图处理,只有通过logcat日志来分析是否在发送(接收)广播、启动(停止/运行中)服务、数据共享的过程中产生异常导致组件运行异常。
二、对于混合开发的app
前端代码异常,一般语法错误以及运行时错误,浏览器都会在console里边体现出错误信息,以及出错的文件,行号,堆栈信息,我们在浏览器中打开html页面,可以通过console控制台查看是否有异常出现,但是在app中加载的话是否也是这样呢。
混合开发的app,主要是通过webView加载加载服务端html或者是加载本地的html、js、css。当html中的js异常的时候,webview并没有能力去捕获到发生的异常。现有的捕获异常方案主要有两种; window.onerror全局异常捕获和try-catch运行时解决方案。
1.window.onerror捕获整个页面中运行的错误,它的局限是对于跨域的JavaScript脚本需要添加跨域支持,也就是需要涉及服务器的修改成本,否则无法获取到运行时具体的堆栈错误信息,而是"script error"的信息,不利于我们定位问题。
各参数具体代表了,异常信息,异常js位置,行号,列号,错误详细信息
2.try-catch运行时监控
使用try-catch,对于某个方法函数,我们可以这样定义来捕获函数里面运行时的异常,但是try-catch只能捕获当前单个作用域下的异常
使用try-catch的话,就需要开发人员对所有的业务方法嵌套上try-catch块。
3.使用BadJs
4.BadJs是web前端异常监控的解决方案,提供了页面脚本错误监控、上报、统计和查看等能力,目前已在Github上开源(https://github.com/betterjs)
以上方法是在界面组件加载异常的监控,那么就可以利用组件异常时通过手机截图将截来的手机屏幕图传给服务端,再与正常的图片进行相似度比较,来判断当前组件是否加载出现问题。可以通过openCv进行图片相似度对比
OpenCV进行图像相似度对比、Pillow进行图像对比
openCV:Open Source Computer Vision Library
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类 构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理 和计算机视觉方面的很多通用算法。
Pillow,python的图像处理库
1.opencv-246.jar包以及对应dll库
2.https://pypi.python.org/pypi/Pillow/3.0.0下载Pillow库 pip install Pillow-3.0.0-cp35-none-win_amd64.whl