最近一次迭代上线后,用户反馈在华为P30,mate 20 pro等较新的手机上打开app出现了“系统检测到xx应用多次异常退出,建议卸载”的弹窗,但是从用户使用感知的角度来看“似乎”是没有崩溃的。一开始我是抗拒的,不过既然会弹出这样的提示还是先看看日志找找原因吧!
不同手机提示还不一样,有的手机提示xxxx屡次停止,有的手机提示xxxx已停止运行,oppo应用市场提示“使用时可能会出现闪退的问题”
问题定位
在华为云测的mate 20 pro机器上复现了这个现象,通过查看日志,友盟的channel
进程中application
的onCreate
中的某个初始化报了NullPointerException
,channel
进程挂掉并不会导致主进程挂掉。
集成过友盟推送的应该都知道,友盟推送会有一个channel
进程,而多进程启动会导致application
的oncreate
的再次调用,所以在做多进程Application
初始化的时候要特别小心,不仅要避免不必要的资源加载,还要额外注意全局context
的引用。
这里报了NullPointerException
的原因就是只在主进程的Application
中创建了全局的context
,在channel
进程中没有初始化全局context
,然后调用context.getSharedPreferences
的报了NullPointerException
,而这个context.getSharedPreferences
实际上应该只在主进程调用,不应该在channel
进程调用!
问题解决
- 普通解决:
context.getSharedPreferences
只放在主进程初始化就行了。 - 终极解决:华为渠道不使用友盟推送,因为我们项目里已经集成了华为推送,集成友盟推送多此一举!
总结
- 通过这次线上问题可以看出,如果应用出现了异常提示,不要怀疑,一定是你的代码有问题,平时写代码的时候要格外注意。
- 这次的异常提示只在部分华为手机上出现,因为华为不同手机EMUI版本不一致,
framework
层做的修改也不一致,所以导致只在部分华为手机出现。 - 能复现尽量复现,查日志定位问题。没有莫名其妙的bug,只有导致bug的代码。
网友评论