Android应用仅生产环境出现Resources$NotFoundException资源加载异常
Android应用生产环境(Play Store安装)资源找不到问题排查与解决
问题描述
我的Android Java应用仅在生产环境出现问题:通过Android Studio直接安装到手机时一切正常,但通过Play Store更新同一款手机上的应用后,抛出如下异常:
Process: com.iddeos.planningbuilder, PID: 31989 android.content.res.Resources$NotFoundException: Resource ID #0x0问题出自以下代码:
int iconRessource = getResources().getIdentifier("drawable/"+menu.getIcon(), "drawable", getPackageName()); Drawable image = ContextCompat.getDrawable(getApplicationContext(), iconRessource); menuBottomConfig.add(android.view.Menu.NONE, menu.getId(), android.view.Menu.NONE, menu.getTitle()).setIcon(image);
核心原因
- Play Store资源优化误删动态引用资源:Play Store默认会对发布的应用做资源压缩,移除静态分析认为“未被引用”的资源。而
getIdentifier是动态获取资源,静态检测工具识别不到这些引用,导致图标资源被误删。Android Studio直接安装的debug包不会开启严格的资源压缩,所以不会出现这个问题。 - getIdentifier参数错误:第一个参数不需要加
drawable/前缀,第二个参数已经指定了资源类型为drawable,加前缀会导致无法匹配到正确的资源ID,返回0(即0x0),最终触发找不到资源的异常。
解决步骤
修正getIdentifier调用:
去掉前缀,正确写法如下:int iconRessource = getResources().getIdentifier(menu.getIcon(), "drawable", getPackageName());阻止资源被误删:
在res/raw/目录下创建keep.xml文件,标记需要保留的动态引用图标资源:<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/icon_name1,@drawable/icon_name2" />如果是批量图标,可使用通配符(比如
@drawable/menu_icon_*),确保所有动态调用的图标都被保留。增加容错逻辑:
在代码里判断资源是否存在,避免崩溃:int iconRessource = getResources().getIdentifier(menu.getIcon(), "drawable", getPackageName()); if (iconRessource != 0) { Drawable image = ContextCompat.getDrawable(getApplicationContext(), iconRessource); menuBottomConfig.add(android.view.Menu.NONE, menu.getId(), android.view.Menu.NONE, menu.getTitle()).setIcon(image); } else { // 资源不存在时用默认图标兜底 menuBottomConfig.add(android.view.Menu.NONE, menu.getId(), android.view.Menu.NONE, menu.getTitle()).setIcon(R.drawable.default_menu_icon); }本地验证release包:
本地打包release版本安装到手机测试,确认问题是否解决,不要只依赖debug包测试。
内容的提问来源于stack exchange,提问作者Benoit Brice
相关产品推荐
相关产品推荐

