You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:06:21