如何一步步实现在app上展示log日志的工具类
1.为何要做这个
需求:
适用环境:手机没有连接电脑开发环境时候
1.app突然崩溃,且很难复现,可以即时查看崩溃信息;
2.测试人员在真机测试时,app崩溃;不用复现立即获得崩溃日志反馈给开发人员;
3.及时观察app请求和返回的数据信息等;
当然,前2条需求都有第三方sdk提供崩溃捕捉并能在网页端查看,但数据反馈较慢;
2.需要做什么
1.即时展示log日志,在哪里展示用什么展示?
2.展示界面需要不影响用户操作;要有开关开启和关闭展示界面;
3.捕获崩溃日志后怎么展示?app已经崩溃还如何展示信息呢?(这是重点)
3.如何去做
log日志类应该都会写吧,就是打印log日志的时候都通过工具类打印,
可以为日志集中管理,方便发布版本的时候关闭日志;
1.怎么在app上展示日志问题:
思路:
我第一次尝试是用一个半透明全屏的TextView覆盖在activiy布局上方。
TextView是插入activity的根view里面decorView容器
因为view没有消费触摸事件,所以不影响app操作;
但是看上去很不美观,影响观察app界面内容;
后来用一个悬浮的可以拖动的小窗口展示日志
注意,这个悬浮窗不是全局的,只是app内的不需要权限

需要解决的问题:
1、activity跳转的时候日志窗口怎么跟随
2、日志窗口的开关怎么设置
解决日志窗口跟随activity跳转的办法:
ActivityLifecycleCallbacks 我们需要这个activity生命周期回调;
不了解的可以去查查资料。app所有activity生命周期都会在这里回调
我们的日志类需要在application里面初始化,拿到application后我们给他注册activity生命周期回调;
在这里我们可以拿到activity对象,前一activity隐藏时候我们把我们的日志窗口移除。
下一个activity显示的时候我们把日志窗口添加进去,这样日志窗口就可以跟着activity跳转了;
解决日志开关的办法:
工具类要能捕获事件,无论是触摸事件还是按键事件,但要对app正常操作无影响;
我只想到了ViewGroup的dispatchTouchEvent;
我这里选择捕获DOWN事件,并根据点击间隔,3短3长作为开关日志悬浮窗的暗码;
每次触摸事件的到来都会经过这里分发,并且不会消费事件;但是这里只能获取到DOWN事件,
为了获取到整个页面的down事件,我们必须把工具类继承一个容器,把activity的内容布局从 decorView 取出放入我们的容器里面
把我们的容器放到decorView作为布局,这样我们就能获取到activity的所有down事件,
并且能方便的把我们的展示日志悬浮窗布局叠加在activity内容布局上层;
然后是 日志悬浮窗的拖动,这里我用了ViewDragHelper,会自定义控件的应该都接触过。
有个小问题,每次切换activity会重置悬浮窗位置,每次拖动记录位置信息即可
2.捕获崩溃日志后怎么展示问题:
捕获崩溃异常用:Thread.setDefaultUncaughtExceptionHandler()方法;
app崩溃分为2种情况:
1.activity正常启动后,其它事件导致的崩溃
这种情况可以开子线程,利用Looper.prepare()和 Looper.loop()让子线程具有弹toast和dialog的能力;
直接用dialog展示崩溃信息;

2.activity启动直接崩溃
这时候我们无法利用activity上下文弹toast和dialog了
这里我苦恼了很久,想过用文件保存,下次开启app时候检测文件,然后展示,展示后清空;
或者存储到sd卡,直接打开文本文件;这些方法都不是很即时,也很麻烦;
后来想到用socket模拟web服务器,打开浏览器访问本地端口,把崩溃信息发往浏览器展示
经测试很方便很及时,并且浏览器展示效果也不错;可以高亮本地代码错误行号;

3.然后增加一些细节处理:
1.日志过滤,日志过滤等级设置和关键字筛选
2.过滤器的界面呼出,我在悬浮窗的标题栏点击事件呼出,也可以在屏幕顶端快速单击5次呼出
3.不同日志等级不同颜色处理。等等;
4.app正式发布的时候对象不会初始化不占用任何资源

4.使用非常简单
在application里面初始化即可
Logger.init(this);
源码地址:
https://github.com/jarryleo/LoggerView/blob/master/app/src/main/java/cn/leo/loggerview/utils/Logger.java
网友评论