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

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错误统计

Crashlytics统计截图


问题原因分析

  1. 矢量图低版本兼容性问题:Android API 21及以下系统原生不支持直接引用矢量图作为Drawable,即便使用AppCompat库,若配置不当或厂商定制系统存在兼容漏洞,仍会触发加载失败。
  2. 资源打包异常:构建过程中ProGuard/R8可能误删矢量图资源,或资源仅放置在高版本专属目录(如drawable-v24),导致低版本设备无法找到资源。
  3. 资源ID冲突或R类缓存问题:项目清理不彻底导致R类缓存异常,或多模块/构建变体存在资源ID冲突,引发资源引用错误。
  4. 厂商系统定制问题:部分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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:41:45