今天正好在搞个新项目,安卓端突然抽风打不开了。掏出吃灰的测试机点开APP,闪个启动画面就直接闪退,给我整懵了。随手捞起桌上半凉的咖啡灌了一口,开始抓日志。
一、先看错误长啥样
- 连上Android Studio跑debug模式
- 点启动按钮瞬间红了一片报错
- 日志里明晃晃写着Attempt to invoke virtual method on null object reference
小编温馨提醒:本站只提供游戏介绍,下载游戏推荐89游戏,89游戏提供真人恋爱/绅士游戏/3A单机游戏大全,点我立即前往》》》绅士游戏下载专区
这玩意儿我太熟了,十次崩溃有八次是空指针。但这回堆栈信息指向个诡异的地方:
*.*()at *.onCreate()
权限工具类里调相机权限居然报空?扯淡这不是!前天刚在这台手机上测试过相机功能。
二、排查骚操作全记录
- 翻commit记录:最近三天没人动过权限相关代码
- 查机型兼容:测试机是Android 10系统,权限动态申请明明写对了
- 暴力打印:在checkCameraPermission()第一行塞Log.d("TAG", "到这里了吗")
重新编译安装后,日志里居然没打印!说明方法根本没执行到就崩了。头皮开始发麻,这不符合常理。
突然瞟到onCreate()里有段新代码:
if (*) {* = true;
同事说为了方便测试跳过权限检查。但今天打的是release包!*自动变成false,skipPermissionCheck根本不会赋值!
后面代码直接调用:
if (!*) {checkCameraPermission();
好家伙,skipPermissionCheck默认是false,条件成立去调方法,但release包没初始化PermissionUtils里的静态变量!
三、血压飙升的修复过程
- 早上9点把同事从会议室拽出来对质
- 他坚持说"测试包明明没问题"
- 我当场用他电脑打了个release包安装,手机直接变砖头
- 改成在Application里初始化静态变量
- 测试组重新跑全机型测试,折腾到下午三点
最绝的是,等修完上线后才发现:这破功能根本还没接入相机!提前写的权限检查纯属摆设,白搭进去七个小时。
现在看见权限工具类就想掀桌。等今年绩效打完了,我非把这段垃圾代码彻底重写不可。上次这么上火还是去年六月,那会儿...
(突然停顿猛拍键盘)去年搞支付sdk接入也是!第三方文档写回调在子线程,我们直接在回调里更新UI,测试机全系列不崩溃,就华为mate40疯狂闪退。后来才知道华为把线程检测开关藏开发者选项里了,测试大姐顺手给关了。
那天从早到晚都在听产品经理叨叨:"其他机型好好的呀~"。半夜改完代码,在茶水间咬着面包发版本,听见测试组在隔壁打王者连赢五把。
不过最坑的还是前公司那个项目。接手时前任跑路三个月,留的代码全是硬编码。有次改个按钮颜色值,整个下载模块瘫痪了。后来发现这货把服务器地址拼接在颜色字符串里,用正则替换的时候误伤了URL。
查问题时老板蹲我工位旁催进度,汗珠子顺着后脖颈往下淌。修完当晚就去医院挂急诊,说是长期压力导致植物神经紊乱。出院后火速提离职,现在手机里还存着当时的医嘱照片:"避免熬夜及情绪激动"。
所以今天看见权限报错,我直接先吞了两粒逍遥丸。这行干久了才知道,安卓开发终极解决方案是速效救心丸。