找不到资源ID为#0x7f080043的Drawable资源。

9
我在Crashlytics中遇到了一个错误,由我的应用程序用户引起:android.content.res.Resources$NotFoundException无法找到Drawable的资源ID#0x7f080043。 我在我的APK(在调试模式下)中检查它,并发现它与drawable“abc_spinner_mtrl_am_alpha”有关。 我在背景中使用此drawable来进行spinner。 我没有自己创建这个drawable,它来自库appcompat-1.4.1。 但是在这个库中,它以多种密度等形式存在。 是否有人遇到过类似的问题并知道解决方案/根本原因?

Drawable ID

Caused by android.content.res.Resources$NotFoundException: Unable to find resource ID #0x7f080043
       at android.content.res.ResourcesImpl.getResourceName(ResourcesImpl.java:253)
       at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:760)
       at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:630)
       at android.content.res.Resources.loadDrawable(Resources.java:886)
       at android.content.res.TypedArray.getDrawableForDensity(TypedArray.java:953)
       at android.content.res.TypedArray.getDrawable(TypedArray.java:928)
       at android.content.res.XResources$XTypedArray.getDrawable(XResources.java:1363)
       at android.view.View.<init>(View.java:4768)
       at android.widget.TextView.<init>(TextView.java:826)
       at android.widget.TextView.<init>(TextView.java:820)
       at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:108)
       at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:103)
       at androidx.appcompat.app.AppCompatViewInflater.createTextView(AppCompatViewInflater.java:201)
       at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:121)
       at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1566)
       at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1617)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
       at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
       at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
       at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:416)
       at android.widget.ArrayAdapter.getView(ArrayAdapter.java:407)
       at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:204)
       at android.widget.Spinner.onMeasure(Spinner.java:602)
       at androidx.appcompat.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:438)
       at android.view.View.measure(View.java:22071)
       at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:811)
       at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:466)
       at androidx.constraintlayout.core.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:372)
       at androidx.constraintlayout.core.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:120)
       at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1594)
       at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1708)
       at android.view.View.measure(View.java:22071)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
       at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:145)
       at android.view.View.measure(View.java:22071)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
       at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:496)
       at android.view.View.measure(View.java:22071)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
       at android.view.View.measure(View.java:22071)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
       at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
       at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
       at android.view.View.measure(View.java:22071)
       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
       at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
       at com.android.internal.policy.DecorView.onMeasure(DecorView.java:724)
       at android.view.View.measure(View.java:22071)
       at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2422)
       at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1504)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1761)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
       at android.view.Choreographer.doCallbacks(Choreographer.java:723)
       at android.view.Choreographer.doFrame(Choreographer.java:658)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
       at android.os.Handler.handleCallback(Handler.java:790)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6494)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

这个回答解决了你的问题吗?Android App Bundle在Android应用中引入了资源未找到崩溃 - George Shalvashvili
1个回答

10
可能是由于资源文件不在默认文件夹中(仅在xxhdpi和ldrtl-xxhdpi文件夹中)导致的。应用程序崩溃的手机可能具有不同的密度,并且该应用程序部署/安装为Android应用程序包(.aab),这使得Google Play可以删除它认为不必要的资源(例如,由于设备具有不同的密度而不需要此资源),以减少捆绑包大小。

解决方法是将该资源复制到您的项目中(最好使用不同的名称以防止其他问题),并将其直接放置在资源/可绘制文件夹下或根据其尺寸放置在所有可绘制文件夹中(如果有)。这应该确保它存在于所有应用程序捆绑包中,无论它们的目标屏幕密度如何。


回复评论:

是的,实际上这是一个错误,尽管Android Gradle插件可能已经在构建日志中记录了有关相关图像未提供所有密度的错误/警告。规则/建议是在drawable文件夹中拥有一个可绘制对象或者在mdpi、hdpi、xhdpi、xxhdpi文件夹中分别拥有比例大小的副本。在这个支持库的情况下,它只提供了一个xxhdpi版本,在运行时库仅在xxhdpi设备上使用该可绘制对象。这是一个9 patch图像,因此可以安全地将其复制到drawables中而不会失去质量。

理想情况下,大多数图形应该由矢量可绘制对象组成,这些对象可以/应该放置在可绘制目录中,而不必担心设备密度。但是,请注意矢量可绘制对象的宽度和高度属性,因为这将确定其在屏幕上的大小,如果缺少这些属性,则大小将从视图的大小中推断出来(wrap_content可能导致可绘制对象不可见)。使用aab格式部署应用程序时,请始终小心提供所有设备配置(密度、屏幕方向等)的资源,因为设备下载的最终存档可能仅具有其密度和/或默认值(可绘制、值)的资源。过去(使用apk格式),当不存在其密度和默认值可绘制对象时,Android运行时会尝试缩小更高密度的可绘制对象。现在(使用aab),高密度可绘制对象被排除在包之外,因此不再可能。

我认为不直接使用第三方库中的资源(如从布局中引用)是一个好的做法,因为它们很容易被重命名、移动或删除(特别是在动态 Gradle 依赖项的情况下),而且由于复杂/非确定性的 Android 构建系统,在发布的应用程序在用户设备上崩溃之前可能并不明显。如果你真的需要库中的某些资源,最好将其复制到你的项目中。总的来说,尽可能少地依赖于你无法控制的东西更加安全。


谢谢您的帮助!我会按照建议来解决这个问题。另外有一个问题:如果Google Play删除他们认为无用的aab资源,那这不是一个错误吗?这样,在我的情况下使用appcompat库中的图片/向量将不再可能。 - Sebastian B
在我的情况下,我直接将图像放在项目中,但 Firebase 上有一些崩溃。所以问题是,为什么其他类似的图像不会崩溃? - George Shalvashvili
@George Shalvashvili 可能是因为图像的分辨率不适合主机设备的屏幕密度。您可以检查崩溃设备的dpi和图像大小。运行时可能认为图像对于主机设备太大而导致崩溃,尝试寻找一个更小/低分辨率的图像,而其他图像可能适合它们出现的设备。 - Crispert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接