APK启动时弹出“持续停止运行”提示且logcat报错如何修复?
APK启动时Resources$NotFoundException排查与修复方案
你遇到的报错是android.content.res.Resources$NotFoundException,本质是App运行时尝试加载不存在的资源文件触发的崩溃,可按以下步骤排查修复:
排查步骤
- 核对资源文件是否存在
检查报错日志里指向的资源ID对应的文件,重点查看drawable、layout、values等资源目录下,是否存在对应名称的文件,注意区分大小写,Android资源命名对大小写敏感,比如ic_back.png和Ic_back.png会被识别为不同资源。 - 检查资源限定词适配问题
如果你把资源只放在了特定限定词的目录下(比如仅放在drawable-xxhdpi、values-v31这类目录),在低于对应版本、不符合限定词的设备上运行时,就会找不到资源。需要确认资源是否在默认目录(比如drawable、values)下也有备份,或者适配范围覆盖了你的App支持的最低设备版本。 - 排查构建缓存问题
有时候构建缓存异常会导致资源没有被正确打包进APK,先执行./gradlew clean清理缓存后重新打包,再安装测试是否复现。 - 检查动态加载资源逻辑
如果你的代码里有用Resources.getIdentifier()动态获取资源ID,核对传入的资源名称、类型、包名是否正确,这类方法如果传参错误会返回0,直接用0作为资源ID加载就会触发该异常。 - 核对混淆配置
如果你开启了资源混淆(比如用了AndResGuard),检查是否有资源被错误混淆移除,或者保留规则配置错误导致需要的资源被裁剪。
通用修复方案
- 缺失的资源直接补到对应目录,严格按照小写+下划线的命名规范,避免大小写问题。
- 特殊版本限定的资源,要在默认目录下放兜底的资源文件,避免低版本设备找不到。
- 动态获取资源的代码处增加判空逻辑:
int resId = getResources().getIdentifier("res_name", "drawable", getPackageName()); if (resId != 0) { // 正常加载资源 } else { // 加载兜底资源或者走异常处理逻辑 } - 资源混淆配置文件中添加需要保留的资源白名单,避免合规资源被误裁剪。
内容的提问来源于stack exchange,提问作者ANJANA
相关产品推荐
相关产品推荐

