Android Resources$NotFoundException:矢量图资源缺失问题求助
资源ID缺失导致InflateException问题排查
问题背景
已将矢量图/PNG Drawable放置在对应资源目录中,但部分Android设备仍触发Resources$NotFoundException(资源ID#0x7f0800aa),进而引发InflateException,影响部分用户使用。
崩溃日志
Fatal Exception: android.view.InflateException: Binary XML file line #42 in com.ex.abc:layout/my_layout: Binary XML file line #42 in com.ex.abc:layout/my_layout: Error inflating class <unknown> Caused by android.content.res.Resources$NotFoundException: Resource ID #0x7f0800aa at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:295) at android.content.res.Resources.getValue(Resources.java:1516) at androidx.appcompat.widget.ResourceManagerInternal.c(ResourceManagerInternal.java:19) at androidx.appcompat.widget.ResourceManagerInternal.getDrawable(ResourceManagerInternal.java:235) at androidx.appcompat.widget.ResourceManagerInternal.getDrawable(ResourceManagerInternal.java:2) at androidx.appcompat.content.res.AppCompatResources.getDrawable(AppCompatResources.java:4) at com.google.android.material.resources.MaterialResources.getDrawable(MaterialResources.java:13) at com.google.android.material.button.MaterialButton.<init>(MaterialButton.java:87) at java.lang.reflect.Constructor.newInstance0(Constructor.java) at java.lang.reflect.Constructor.newInstance(Constructor.java:343) at android.view.LayoutInflater.createView(LayoutInflater.java:873) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1061) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1016) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1178) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1139) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1181) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1139) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1181) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1139) at android.view.LayoutInflater.inflate(LayoutInflater.java:696) at android.view.LayoutInflater.inflate(LayoutInflater.java:548) at com.ex.abc.databinding.MyLayoutBinding.a(MyLayoutBinding.java:4) at com.ex.abc.fragments.BSDialog.Q(BSDialog.java:6) at androidx.fragment.app.Fragment.b0(Fragment.java:20) at androidx.fragment.app.DialogFragment.performCreateView(DialogFragment.java) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:223) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:154) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1069) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:91) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:74) at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:3) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:257) at android.app.ActivityThread.main(ActivityThread.java:8218) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:626) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1015)
布局文件片段(涉及问题Drawable的行)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/messageBehaviorView" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp" app:behavior_hideable="true" app:behavior_peekHeight="0dp"> <HorizontalScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="5dp" android:orientation="horizontal"> <FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="0dp" android:layout_marginEnd="10dp" android:background="#afafaf"> <Spinner android:id="@+id/spColorStyle" style="@style/spinner" android:contentDescription="@string/style" /> </FrameLayout> <com.google.android.material.button.MaterialButton android:id="@+id/btnAngle" style="@style/ButtonStyle.Circle.Small" android:layout_marginStart="0dp" android:layout_marginEnd="10dp" android:contentDescription="@string/rotate" app:icon="@drawable/ic_arrow_angle" /> </LinearLayout> </HorizontalScrollView>
矢量图代码
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24" android:tint="#FFFFFF"> <path android:fillColor="@android:color/white" android:pathData="M12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8S16.41,20 12,20M12,22c5.52,0 10,-4.48 10,-10c0,-5.52 -4.48,-10 -10,-10C6.48,2 2,6.48 2,12C2,17.52 6.48,22 12,22L12,22zM11,12l0,4h2l0,-4h3l-4,-4l-4,4H11z"/> </vector>
资源目录截图

Crashlytics错误统计

问题原因分析
- 矢量图低版本兼容性问题:Android API 21及以下系统原生不支持直接引用矢量图作为Drawable,即便使用AppCompat库,若配置不当或厂商定制系统存在兼容漏洞,仍会触发加载失败。
- 资源打包异常:构建过程中ProGuard/R8可能误删矢量图资源,或资源仅放置在高版本专属目录(如
drawable-v24),导致低版本设备无法找到资源。 - 资源ID冲突或R类缓存问题:项目清理不彻底导致R类缓存异常,或多模块/构建变体存在资源ID冲突,引发资源引用错误。
- 厂商系统定制问题:部分Android厂商修改了系统资源加载逻辑,对矢量图的解析或加载存在异常。
解决办法
1. 配置矢量图低版本兼容
在Module级别的build.gradle中添加兼容配置:
android { defaultConfig { // 启用矢量图兼容库 vectorDrawables.useSupportLibrary = true } }
同时确保布局中使用AppCompat相关组件,或通过代码调用AppCompatResources.getDrawable(context, R.drawable.ic_arrow_angle)获取资源。
2. 保护资源避免混淆
在ProGuard/R8规则文件中添加:
// 保护AppCompat和Material资源加载类 -keep class androidx.appcompat.content.res.AppCompatResources { *; } -keep class com.google.android.material.resources.MaterialResources { *; } // 保留目标矢量图资源 -keepdrawable ic_arrow_angle
3. 检查资源目录与构建缓存
- 将矢量图放置在通用的
drawable目录,而非仅高版本专属目录,确保所有设备都能访问。 - 执行清理构建命令:
./gradlew clean assembleDebug,清除R类缓存。
4. 生成PNG fallback资源
为低版本设备生成对应的PNG图片,放置在drawable-mdpi、drawable-hdpi等分辨率目录,系统会自动根据设备选择合适资源,规避矢量图加载风险。
5. 验证库版本兼容性
确保com.google.android.material:material与androidx.appcompat:appcompat版本匹配,避免因版本不兼容导致资源加载异常。
内容的提问来源于stack exchange,提问作者Pratik
相关产品推荐
相关产品推荐

