Android.content.res.Resources$NotFoundException异常处理及排查求助
资源找不到异常排查方案
Nexus 5X的423ppi属于Android新增的420dpi密度分组,不属于标准xhdpi(320dpi)、xxhdpi(480dpi)区间,Android 8.1在资源匹配逻辑上存在和低版本不一致的行为,是这类偶发崩溃的高发场景,可按以下优先级排查:
- 检查APK构建拆分配置
如果你开启了按密度拆分APK或者使用App Bundle分发应用,旧版本的构建配置可能未覆盖420dpi这个Android 7.0新增的密度分组,导致对应设备下载到的安装包缺失匹配的资源,同时通用drawable文件夹的资源如果被拆分逻辑排除,就会触发找不到异常。你可以解压对应设备下载的APK,确认是否存在header图片的资源文件。 - 验证通用资源文件夹的限定符
确认你存放通用资源的文件夹是纯drawable,没有额外加版本、屏幕方向等限定符,比如误写为drawable-v28会导致Android 8.1系统无法读取该兜底资源。另外如果开启了资源混淆,确认你没有把该drawable资源加入混淆移除列表。 - 排查动态加载资源的代码逻辑
如果你的代码是通过Resources.getIdentifier()动态获取资源ID,注意资源名大小写敏感,部分混淆规则可能会修改资源名的映射关系,导致动态查找返回0,触发异常。建议优先使用R.drawable.header静态引用的方式加载资源,稳定性更高。 - 适配异形密度设备的资源匹配逻辑
Android 8.0及以上系统资源匹配时会优先找最接近的密度桶,找不到时优先向上查找更高密度的资源,而不是向下兼容。你可以补充在drawable-xxhdpi或者drawable-420dpi文件夹放入对应资源,覆盖这类异形密度设备的匹配需求。 - 排查运行环境异常
这类偶发崩溃有小概率是多开、虚拟运行环境、权限管理工具篡改App资源路径导致的,你可以查看崩溃栈的上下文,确认是否有资源路径被拦截、权限被拒绝的相关日志。
临时规避方案:在所有图片加载逻辑外层增加
NotFoundException的捕获,捕获后加载内置的兜底Drawable资源,避免直接触发崩溃。
内容的提问来源于stack exchange,提问作者zionun
相关产品推荐
相关产品推荐

