一、问题背景
我们公司开发了一款App,一部小部分用户反映在开APP授权通知权限之后会出现闪退的情况,但是我们通过几台测试机的测试,都无法复现这个问题,比较棘手。
二、遇到的挑战
由于我们是创业型的公司,没有太多的预算购买很多种类的测试机,安卓机每个品牌只有一个型号的测试机,而且系统版本也没办法覆盖完全,苹果机也是一样的情况。出现闪退的情况,光靠用户的描述是比较难定位到错误的地方,用户内存占用过多?磁盘空间不足?抑或是逻辑上的问题导致的闪退?而且,我们使用的是混合开发,框架使用的是ionic,大部分页面和逻辑都是混合开发。由于App涉及到蓝牙连接相关的SDK和DFU固件升级,而ionic在这一块没有封装相应的接口,所以这部分的内容我们还是通过在原生上面进行开发,再使用ionic去调用原生的内容。这更加增加了debug的难度。
三、解决问题的步骤
为了找到导致crash的地方,我们先排除掉机器内存和磁盘空间不足导致的问题,我们通过上传用户手机的内存总大小、剩余内存的大小、磁盘总空间和磁盘剩余空间,排除掉了这个因素。之后我们就考虑是不是因为代码逻辑上的一些问题导致的,于是我们尝试使用友盟的U-APM产品,它里面有一个很好的崩溃分析工具,可以看到crash的一些信息,包括错误的类型、具体哪一行导致了报错、出现的频率和机器相关的参数,这对我们的debug有很大的帮助,于是我们尝试安装友盟的SDK,设置了邮件和钉钉的错误提醒,并发布了新版本APP。两天后,这部分用户再次打开App之后,也出现了授权权限之后闪退的情况,与此同时,我们也收到了来自友盟的错误提醒邮件和钉钉提醒。点击进去之后发现U-APM帮忙定位了错误的地方,如下图,在MainActivity.java的第93行,出现了ArrayIndexOutOfBoundsException,也就是数组下标超过了数组长度-1,而且具体的crash时间和机器参数也同时总结了出来,帮我们总结了很有用的信息,我们发现这个现象只有在荣耀系列的手机里才会出现,于是我们加强了荣耀系列手机的测试,在一次手动在系统中关闭权限之后打开app的用例中重现了这个问题,也找到了根本的原因,因为当用户手动关闭某些权限的时候,回调返回的是一个空数组,而我们去取下标为1的值的时候就会导致报错了。
修复之后我们继续使用友盟去观察这个问题有没有解决,自从修复了这个问题并发布了新版本之后,就不会再报这个错了。
四、问题总结
有些时候遇到crash的情况,而且无法复现,作为开发者确实挺头疼的,使用友盟的U-APM产品,可以帮助我们更快速地定位问题,总结相应的情况,帮助我们更主动地去发现问题、解决问题,进而提高用户的体验。
作者:梁立坤