作为一个测试工程师,经常被一些难以复现的bug困扰很久,理论上不可能出现,但线上确实又有很多用户反馈,比如小编前段时间碰到了一个比较有意思的bug,涉及到一些Android版本变更引发的问题,在这里和大家分享一下:
背景: 最近几个月我们经常收到用户反馈,输入法在不同设备上,英文26键键盘长的不一样,有的有一行数字,有的没有。 其实这里涉及到我们的英文26键数字键盘的开关下发策略: 只针对手机分辨率等于1080*1920的用户,下发网络开关打开英文26键数字键盘(详细背景这里不阐述了)。
处理过程: 策略下发时,我们抽查了几台不同分辨率的手机进行测试,验证没有问题,结果上线后,断断续续的会收到一些用户反馈,也没发现什么规律; 最近我们将线上反馈进行了一些整理,发现华为手机用户较多,于是用公司的几台1080P的华为手机试了一下,发现确实有的生效,有的不生效,emmmmm,这就很有意思了。 考虑到分辨率策略问题,赶紧联系开发同学一起打断点检查,发现不生效的设备我们拿到的分辨率是1080*1792!!!
看到这个值时我们才恍然大悟,一定是虚拟导航栏的缘故,这个差值的高度刚好吻合虚拟导航栏的高度,回头检查出问题的手机都是启用了虚拟导航栏,导致我们获取到的分辨率与原始标准分辨率不一样了。
那么问题来了,为什么我们会获取到错误的分辨率,而不是手机的一个固定分辨率值呢?
经过调查,Android4.2之前是没有虚拟导航栏这个概念的,当时的java函数也不会考虑到这一点,在Android4.2之后才引入了虚拟导航栏,同时采用了一套新的函数来获取真实分辨率。而我们输入法目前仍然使用的是Android4.2之前的方法,详细如下:
我们使用的获取屏幕分辨率的方法是:
用这个方法获取到的屏幕分辨率是会被虚拟导航栏吃掉高度的。 经过网上查询了解到Google已经更新了获取分辨率的方法,使用新方法,无论手机虚拟导航栏是否隐藏都可以正确的获取分辨率。
结论及反思: 问题原因找到了,同步给开发更换方法。 通过这个问题,我们不得不进行思考,虚拟导航键会影响屏幕分辨率获取,那么例如近些年增加的横竖屏分屏模式、异形屏、AB屏、大A屏等等影响因素会不会再次导致我们获取错误参数呢?