一些值得记录的bug,以及解决思路与反思

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/X1876631/article/details/52917309

20170106

  • 本地隐私密码页使用过程中的一系列bug
1、本地密码检查页原本使用singleInstance启动模式,在这个页使用startActivityForResult启动的其他页后,
会直接调用当前页的onActivityResult,而不是等待其他页返回result值后才调用(红米note1必现)
【解决办法】把本地密码检查页的启动模式改为standard模式。
2、当本地密码页启动模式改为standard模式,在该页收到推送时,点击跳转到需要检查密码的A页面时又会生成一个新的本地密码页实例,
输入密码后进入A页,从A页返回发现原本的密码检查页没消失,仍要输入密码。
【bug原因】本地密码检查页原本应该栈内复用的,结果为了解决问题1改了启动模式,每次都会生成新的实例而不复用

【解决办法】
跳转到本地密码页时,增加一个flag:Intent.FLAG_ACTIVITY_REORDER_TO_FRONT,
将该页调到栈顶,复用该页,而不是重新生成一个新的实例。
3、视频直播页横竖屏切换后,必定弹起本地密码检查页
【bug原因】
1、首先观察bug复现现象:切换横竖屏时,必定强制检查,而其他页面则不会。说明问题很大概率是切换横竖屏导致的。

2、再打印log查看本地密码检查页的检查参数,发现只要切换了横竖屏,原本已经设置过的检查参数就会被重置,导致强制检查。

3、再看哪里调用了重置方法?
发现只有应用主页面被销毁时,在onDestroy()方法里会调用。
打印主页面的生命周期函数,发现横竖屏切换时,主页面被销毁重建了。
问题到这里就清晰了,导致横竖屏切换后强制检查密码的原因就是:
横竖屏切换时,主页面发生了销毁重建,重置了检查触发参数。

【解决办法】
在AndroidMenifast.xml文件里,设置主页面的configChanges参数。
增加orientation和screenSize,让屏幕方向和大小变化时,不重建页面。



20161028

  • 某个手机厂商的预装版本,升级到最新版后崩溃
【bug原因】
最新版应用的数据库版本是16,而这个手机厂商上预装的版本把数据库版本号改为17了,导致覆盖安装时触发数据库降级操作。

但是应用里又没有重写系统的降级函数SQLiteOpenHelper.onDowngrade(),
结果去调用系统默认onDowngrade()方法,直接抛出异常,导致应用崩溃。

【解决办法】
1.首先必须重写系统的降级函数逻辑,无论升级还是降级,都要重建最新版本的数据库。

这样就解决了本次的bug,但是需要考虑的是另一个问题:
如果之后我们应用的数据库修改了功能后,也将版本号升到17,此时如果用最新版的包去覆盖预装的包,
由于版本号都是17,不会升级也不会降级,数据库就不会重建。这可能会导致逻辑找不到最新版本修改的字段,进而崩溃。

2.所以我们还得提升数据库版本号比预装的包的高(升级到18>预装的17),让新包覆盖预装包时触发升级操作,重建数据库。

【反思】
1.为什么会导致这个bug?
因为单独修改了预装包的数据库版本号。

2.为什么要修改预装包的数据库版本号?
据说是因为这个厂商的预装包要求不允许升级。所以特意去掉了检查更新,并修改了数据库版本号。

3.那要求不能升级为什么还会导致这次的升级覆盖安装?
根据监控日志反馈的数据,影响用户数90、崩溃次数900多,不像是用户自己手动安装导致的。
猜测可能是手机厂商的应用商店自动升级导致的。

4.如何避免类似的问题?
这次出bug是因为预装厂商包的修改是单人负责的,而这个需求又混在一堆预装bug反馈里。
负责人顺手改的(没重视),改完也没有他人review(没review)

所以:
1)预装包功能修改要慎重。
尤其是数据库相关的代码,修改时要多考虑到一些可能影响的功能。
2)修改后需要多人code review。



20161024

  • 更新了第三方sdk(支付宝)导致的bug
    只有某个手机使用支付宝支付时一直提示订单失败,在其他手机上支付宝支付都正常
【bug原因】
【Q1】先debug看看,定位下具体是什么错误?是sdk导致的还是我们自己升级改了逻辑导致的?
【A1】仔细走了边流程发现是支付宝sdk调用它自己的pay函数时,返回了错误。
     错误原因是系统繁忙。
     (没有特别有用的错误信息)

【Q2】看一下升级sdk前后的逻辑有没有什么区别,是不是漏了什么步骤?
【A2】发现逻辑基本没有区别,没有漏掉步骤。
     逻辑上只是pay函数里的传入的参数获取方式有区别。
     老版本是客户端自己计算的,现在变为服务器计算后返回的。
     服务器计算方法和老的客户端一致。
     (排除了逻辑修改的可能,将问题锁定在sdk本身)

【Q3】看一下老版本老的SDK是否正常?是否是sdk服务器异常?
【A3】发现老版本可以正常使用。sdk服务器正常。
     (排除sdk服务器的问题,那就是sdk客户端本身的问题)

【Q4】更换了测试机,发现安装了sdk客户端的测试机可以正常支付。
     但是调用sdk网页的不能正常支付,猜测是网页相关的权限、配置可能有问题
【A4】对比之前的封装的库,发现在新的封装库中没有配置权限和声明sdk页面。
     添加配置和声明后,功能恢复正常。

【解决办法】添加sdk配置和相关页面的声明
【反思】对于第三方sdk的相关问题,如果确定了不是我们的逻辑or数据有问题,则先去看一下sdk配置是否正确
  • 支付类调用方法时报参数为空
【bug原因】
【Q1】debug发现,支付类初始化时在构造函数里确实传入了非空的参数,调用时却发现参数为空,为什么参数进去有值出来用的时候就空了?
【A1】仔细看了初始化的构造函数,发现初始化时调用了3个参数的构造函数。
     3个参数的构造函数里本应使用this调用6个参数的构造函数,结果却去new了构造函数。
     导致传入的参数根本没有在初始化时被赋值进去。

【解决办法】修改构造函数
【反思】构造函数调用要用this而不能用new



20160912

  • 测试服处理图片的相关功能做了一次升级后,发现客户端无法上传图片了,只有android不好使,ios是好使的
【bug原因】
通过抓包发现,发现是上传图片前获取tokenhttp请求有问题。
这个请求的http method,服务器那边需要是get类型的,但是客户端发的是post请求。

那为什么原来好使呢?
因为原来服务器对于get类型的请求,既支持post类型又支持get类型。升级后,get类型不支持post请求了。

【解决办法】修改客户端代码,把请求设置成get类型。
结果修改时发现代码里已经设置类型是get了,但是就是会发post类型的请求。
查看android源码才发现,是由于客户端在代码里给HttpURLConnection设置了setDoOutput为true,导致请求类执行connect()操作时自动将请求方法设置post。

【反思】
写代码时同样的功能不要直接copy,不清楚用途的冗余代码会留坑

20160713

  • 页面打开就崩溃
【bug原因】
【Q1】debug发现是空指针导致崩溃,空指针的原因是父类页面里调用逻辑里使用了一个view,这个view是空的。
【A1】这个view在父类的布局里是有的,在一开始setContent时应该是被实例化了的

【Q2】那为什么会没有实例化呢,再看下子类页面?
【A2】发现在子类里设置了个新的布局,父类逻辑调用时不是去自己的布局。
     而是去子类的新布局找这个控件,子类新布局里没有父类逻辑要用的控件。

【解决办法】修改子类的布局

【反思】
1、导致这种情况的原因就是因为子类重新设置了新布局。

2、子类继承父类页面,本就应该用于流程、页面一样,具体逻辑实现细节不同的情况。
   这样如果要改逻辑和布局,只改父类就好了。
   但是现在子类用了父类的逻辑,又自己搞了个新布局,很容易在修改父类时忽略掉子类。

3、建议:如果流程不一样,则应该再重新抽取基类逻辑、布局。

猜你喜欢

转载自blog.csdn.net/X1876631/article/details/52917309