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

Android崩溃:Resources$NotFoundException(Drawable资源缺失)求助

Resources$NotFoundException 崩溃排查与解决

问题概述

遭遇Resources$NotFoundException崩溃,该问题主要出现在三星设备,且仅针对Drawable资源。代码在绝大多数设备上运行正常,但仍有约0.1%的用户出现崩溃,涉及不同设备厂商和系统版本,无明显规律。

相关代码

布局代码

<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/screen_bg_color_secondary">

    <androidx.cardview.widget.CardView
        android:id="@+id/cardInputSearch"
        style="@style/AppSearchInputContainer">

        <EditText
            android:id="@+id/inputSearch"
            style="@style/AppSearchInputField"
            android:hint="@string/product_search_input_hint" />

    </androidx.cardview.widget.CardView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

样式代码(styles.xml)

<style name="AppSearchInputField" parent="AppFontRegular">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">45dp</item>
    <item name="android:textSize">16sp</item>
    <item name="android:textColor">@color/text_color_black</item>
    <item name="android:textColorHint">@color/input_hint_color</item>
    <item name="android:background">@null</item>
    <item name="android:drawableStart">@drawable/ic_search</item>
    <item name="android:paddingStart">12dp</item>
    <item name="android:paddingEnd">7dp</item>
    <item name="android:drawablePadding">7dp</item>
    <item name="android:layout_marginStart">@dimen/screen_horizontal_space</item>
    <item name="android:layout_marginLeft">@dimen/screen_horizontal_space</item>
    <item name="android:layout_marginEnd">@dimen/screen_horizontal_space</item>
    <item name="android:layout_marginRight">@dimen/screen_horizontal_space</item>
    <item name="android:maxLines">1</item>
    <item name="android:inputType">text</item>
    <item name="android:textCursorDrawable">@null</item>
</style>

注:ic_search.xml已存在于drawable目录中

崩溃日志

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xyz.app/com.xyz.abs.ui.product.SomeListActivity}: android.view.InflateException: Binary XML file line #26 in com.xyz.app:layout/activity_list: Binary XML file line #26 in com.xyz.app:layout/activity_list: Error inflating class EditText
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4169)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4325)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2574)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:226)
       at android.os.Looper.loop(Looper.java:313)
       at android.app.ActivityThread.main(ActivityThread.java:8757)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)

Caused by android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f070278
       at android.content.res.ResourcesImpl.getResourceName(ResourcesImpl.java:281)
       at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:949)
       at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:724)
       at android.content.res.Resources.loadDrawable(Resources.java:1072)
       at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:1017)
       at android.content.res.TypedArray.getDrawable(TypedArray.java:991)
       at android.widget.TextView.<init>(TextView.java:1475)
       at android.widget.EditText.<init>(EditText.java:99)
       at android.widget.EditText.<init>(EditText.java:95)
       at androidx.appcompat.widget.AppCompatEditText.<init>(AppCompatEditText.java:100)
       at androidx.appcompat.widget.AppCompatEditText.<init>(AppCompatEditText.java:95)
       at androidx.appcompat.app.AppCompatViewInflater.createEditText(AppCompatViewInflater.java:243)
       at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:160)
       at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1678)
       at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1729)
       at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1083)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1019)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:983)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:1145)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1106)
       at android.view.LayoutInflater.rInflate(LayoutInflater.java:1148)
       at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1106)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:692)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:544)
       at androidx.databinding.DataBindingUtil.inflate(DataBindingUtil.java:126)
       at androidx.databinding.ViewDataBinding.inflateInternal(ViewDataBinding.java:1409)
       at com.praxinfo.quotationpro.databinding.ActivityProductListBinding.inflate(ActivityProductListBinding.java:100)
       at com.praxinfo.quotationpro.databinding.ActivityProductListBinding.inflate(ActivityProductListBinding.java:86)
       at com.praxinfo.quotationpro.ui.product.ProductListActivity.createBinding(ProductListActivity.kt:249)
       at com.praxinfo.quotationpro.ui.product.ProductListActivity.createBinding(ProductListActivity.kt:25)
       at com.praxinfo.quotationpro.ui.base.BaseActivity.onCreate(BaseActivity.kt:39)
       at com.praxinfo.quotationpro.ui.product.ProductListActivity.onCreate(ProductListActivity.kt:39)
       at android.app.Activity.performCreate(Activity.java:8591)
       at android.app.Activity.performCreate(Activity.java:8570)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4150)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4325)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:101)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2574)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:226)
       at android.os.Looper.loop(Looper.java:313)
       at android.app.ActivityThread.main(ActivityThread.java:8757)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)

原因分析

  1. 三星系统资源加载兼容性:三星部分定制系统版本对android:drawableStart属性或VectorDrawable的处理存在bug,导致资源加载失败。
  2. 资源变体缺失:部分设备的密度、语言等配置下,ic_search的对应变体资源缺失,系统无法找到适配的Drawable。
  3. 编译缓存导致资源ID异常:构建过程中R文件生成错误,或缓存未清理,导致运行时资源ID无法映射到实际资源。
  4. 资源ID冲突:偶发的资源ID冲突,尤其是在多模块项目或第三方库引入时,可能导致目标资源被覆盖。

解决方案

  • 使用AppCompat兼容属性:将样式中的android:drawableStart替换为app:drawableStartCompat,避免原生属性的兼容性问题:

    <style name="AppSearchInputField" parent="AppFontRegular">
        <!-- 其他属性不变 -->
        <item name="app:drawableStartCompat">@drawable/ic_search</item>
    </style>
    

    同时在布局根元素添加命名空间:

    xmlns:app="http://schemas.android.com/apk/res-auto"
    
  • 确保资源变体完整:如果ic_search是位图资源,确保所有密度目录(drawable-mdpi、drawable-hdpi、drawable-xhdpi等)都有对应资源;如果是VectorDrawable,在build.gradle中开启兼容支持:

    android {
        defaultConfig {
            vectorDrawables.useSupportLibrary = true
        }
    }
    
  • 清理构建缓存:执行以下命令清理并重新构建项目,解决R文件异常问题:

    ./gradlew clean build
    
  • 动态加载Drawable并捕获异常:不在XML中设置Drawable,改为在代码中动态加载,同时捕获资源加载异常:

    try {
        val searchDrawable = ContextCompat.getDrawable(this@ProductListActivity, R.drawable.ic_search)
        inputSearch.setCompoundDrawablesWithIntrinsicBounds(searchDrawable, null, null, null)
    } catch (e: Resources.NotFoundException) {
        // 异常处理:设置默认图标或忽略
        Log.e("DrawableLoad", "Failed to load ic_search drawable", e)
    }
    
  • 检查资源ID映射:通过aapt工具查看崩溃日志中资源ID(0x7f070278)对应的实际资源,确认是否存在异常:

    aapt dump resources your-app.apk | grep 0x7f070278
    

内容的提问来源于stack exchange,提问作者Andyson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:37:10