上周线上崩溃率突然飙到5%,用户反馈一打开就闪退。紧急排查,最后只改了3行代码,崩溃率降到0.1%。
问题现象
安卓8.0以下机型必崩
崩溃日志指向 Resources$NotFoundException
但资源文件明明在包里。
排查过程
第一步:怀疑资源打包
用APK Analyzer检查,资源文件存在,路径正确。不是打包问题。
第二步:怀疑动态加载
项目用了插件化,部分资源动态加载。但崩溃机型都没装插件,不是这个原因。
第三步:发现真正原因
看崩溃日志的详细堆栈,发现是 VectorDrawable 兼容问题。
安卓8.0以下不支持某些矢量图属性,直接解析会抛异常。但日志被上层捕获,显示为 Resources$NotFoundException 。
解决方案
3行代码:
imageView.setImageResource(R.drawable.ic_svg);
// 修改后
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
imageView.setImageResource(R.drawable.ic_svg);
} else {
imageView.setImageResource(R.drawable.ic_png); // 降级用PNG
}
或者更彻底,用 AppCompat 的矢量图支持:
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
然后XML里用 app:srcCompat 代替 android:src 。
教训
- 矢量图要检查兼容性,不是所有属性都向下兼容
- 崩溃日志要看完整堆栈,别被表面异常误导
- 老机型测试不能省,安卓碎片化严重
总结
有时候大问题只需要小改动。关键是定位准确,别在错误方向浪费时间。