Android应用修改显示分辨率后触发Resources$NotFoundException崩溃排查
问题分析与解决方案
问题背景
用户在小米Mi 11 Ultra设备上从Google Play安装应用后,在屏幕分辨率1440x3007、DPI 560环境下使用无异常;但切换至屏幕分辨率1080x2255、DPI 420后,启动应用出现Resources$NotFoundException崩溃。
应用通过App Bundle生成针对屏幕密度的配置APK,安装时会匹配当前DPI对应的资源包。核心疑问:
- DPI变更是否是崩溃的直接原因(缺少新DPI对应的资源)?
- 若是,该如何避免此类崩溃?
补充信息:无对应设备测试,仅了解该设备支持修改显示分辨率;知晓MissingSplitsManager接口,但该接口已废弃,官方说明翻译如下:
此接口已废弃,该功能现已过时。在启用Play Protect或运行Android 10及以上系统的设备上,缺少拆分包的安装操作会被阻止。
结论:DPI变更确实是崩溃的直接原因
当用户通过Google Play安装App Bundle构建的应用时,系统仅会下载当前设备DPI对应的资源拆分包(即初始安装时560dpi对应的资源)。当用户手动切换DPI至420dpi后,系统会尝试以新的DPI加载资源,但设备中并未包含420dpi对应的资源拆分包,最终触发Resources$NotFoundException。
避免崩溃的解决方案
- 保留通用密度资源作为兜底:在
build.gradle(或build.gradle.kts)中配置App Bundle,始终保留通用密度资源(如mdpi)不参与拆分,当系统无法匹配当前DPI的资源时,会自动降级使用通用资源。配置示例:
android { bundle { density { exclude("mdpi") } } }
- 完全禁用密度拆分:如果应用资源体积在可接受范围内,可直接禁用密度拆分,让所有设备下载完整的资源包。此方法能彻底避免DPI切换导致的资源缺失问题,但会增加APK整体体积。配置示例:
android { bundle { density { enableSplit = false } } }
- 监听DPI变更并引导重新安装(备选):在应用中监听屏幕DPI变更事件,当检测到当前DPI与安装时的DPI不一致时,提示用户前往Google Play重新安装应用以获取对应DPI的资源包。此方法用户体验较差,仅作为兜底方案。
内容的提问来源于stack exchange,提问作者mkostadinov
相关产品推荐
相关产品推荐

