美文网首页安卓开发相关Android开发经验谈Android开发
一步步实现在app上展示log日志的工具类

一步步实现在app上展示log日志的工具类

作者: JarryLeo | 来源:发表于2017-12-13 16:08 被阅读63次

如何一步步实现在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内的不需要权限

可以拖动的悬浮窗展示log日志

需要解决的问题:

    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展示崩溃信息;

activity启动后的事件崩溃

    2.activity启动直接崩溃

    这时候我们无法利用activity上下文弹toast和dialog了

    这里我苦恼了很久,想过用文件保存,下次开启app时候检测文件,然后展示,展示后清空;

    或者存储到sd卡,直接打开文本文件;这些方法都不是很即时,也很麻烦;

    后来想到用socket模拟web服务器,打开浏览器访问本地端口,把崩溃信息发往浏览器展示

    经测试很方便很及时,并且浏览器展示效果也不错;可以高亮本地代码错误行号;

activity启动直接崩溃

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

相关文章

网友评论

    本文标题:一步步实现在app上展示log日志的工具类

    本文链接:https://www.haomeiwen.com/subject/rgxzixtx.html