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)
原因分析
- 三星系统资源加载兼容性:三星部分定制系统版本对
android:drawableStart属性或VectorDrawable的处理存在bug,导致资源加载失败。 - 资源变体缺失:部分设备的密度、语言等配置下,
ic_search的对应变体资源缺失,系统无法找到适配的Drawable。 - 编译缓存导致资源ID异常:构建过程中R文件生成错误,或缓存未清理,导致运行时资源ID无法映射到实际资源。
- 资源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
相关产品推荐
相关产品推荐

