Android API23设备运行报错Resources$NotFoundException,API27正常
解决Android API 23设备上的Resources$NotFoundException崩溃问题
嘿,我之前也碰到过一模一样的情况!你这是在API23(Android 6)设备上触发了资源找不到的致命崩溃,但高版本正常运行,这种问题基本都和不同API级别下的资源兼容性处理有关,下面给你几个靠谱的排查和解决方向:
1. 先确认资源是不是只放在了高版本专属目录里
Android允许我们给不同API级别创建单独的资源目录,比如drawable-v24、layout-v27这类。如果报错里的0x7f080066对应的资源(不管是drawable、layout还是string)只存在于高于23的资源目录中,那API23设备自然找不到它。
- 解决步骤:
- 先找到这个资源ID对应的名称:去项目的
R.java文件里搜索0x7f080066,就能定位到具体是R.xxx.yyy(比如R.drawable.my_custom_icon)。 - 检查这个资源有没有放在通用资源目录(比如
drawable、layout)里,如果没有,把它复制一份到通用目录,或者给低版本设备准备好替代资源。
- 先找到这个资源ID对应的名称:去项目的
2. 排查Vector Drawable的兼容问题
API23及以下系统默认不支持直接在布局里用Vector Drawable(就是vector标签定义的资源),如果缺失的资源是Vector Drawable,又没做兼容处理,肯定会崩。
- 解决步骤:
- 在Module级别的
build.gradle里加这段配置,开启Vector Drawable的兼容支持:android { defaultConfig { vectorDrawables.useSupportLibrary = true } } - 布局里引用这个资源时,用
app:srcCompat代替android:src,同时确保你的Activity是继承自AppCompatActivity的。
- 在Module级别的
3. 检查资源压缩/混淆是不是误删了资源
如果你的项目开了资源压缩(shrinkResources true),编译器可能会误判,把低版本设备需要的资源删掉了——尤其是那种看似只在高版本代码里引用,但低版本其实也依赖的资源。
- 解决步骤:
- 先临时关掉资源压缩测试:在
build.gradle里把shrinkResources改成false,重新打包装到API23设备上看看还崩不崩。 - 如果关掉后正常,就需要在
res/raw/keep.xml里加规则,把这个缺失的资源保留下来:<?xml version="1.0" encoding="utf-8"?> <resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/your_resource_name" />
your_resource_name换成你实际的资源名) - 先临时关掉资源压缩测试:在
4. 检查动态加载资源的代码有没有问题
如果你的代码里有用getResources().getIdentifier()这类动态获取资源的逻辑,可能在API23下因为资源名称、类型的差异导致找不到资源。
- 解决步骤:
- 仔细检查动态加载的代码,确保资源名称、类型在所有API级别下都是一致的,别用那种只在高版本才有效的命名方式。
内容的提问来源于stack exchange,提问作者RageCode
相关产品推荐
相关产品推荐

