我把App的崩溃率从5%降到0.1%,只改了3行代码

5 阅读1分钟

上周线上崩溃率突然飙到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 。

教训

  1. 矢量图要检查兼容性,不是所有属性都向下兼容
  2. 崩溃日志要看完整堆栈,别被表面异常误导
  3. 老机型测试不能省,安卓碎片化严重

总结

有时候大问题只需要小改动。关键是定位准确,别在错误方向浪费时间。