仅当 运行 在特定设备上时才出现资源未找到异常

Resources Not Found Exception only when running on specific devices

我在 Android Studio 模拟器和 Google 仅针对 oe 设备的 PLay 预启动检查中遇到崩溃。

列出的资源肯定存在于我的源代码中 - 它位于 drawable 文件夹中而不是任何特定的 dpi 文件夹中 - 并且在我尝试过我的应用程序的所有其他设备上都可以找到它,即模拟器设备、预发布测试设备和一些物理设备。

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_amalfi_pro_link.xml from drawable resource ID #0x7f080071

我可以看到与失败的设备的主要区别在于它的分辨率较低 - 因此我检查矢量可绘制对象是否位于可绘制文件夹中,而不是特定的 dpi 文件夹中。

崩溃的设备也是API19,而工作的设备是更高版本。 (我还没有为 API 21 在 Pre Launch teses 中完全调查的不同资源遇到类似的崩溃)。

请注意,我在 build.gradle (app) 中启用了对矢量绘图的传统支持:

    vectorDrawables {
        useSupportLibrary true
    }

我尝试了干净的构建 - 没有变化。

我已尝试使缓存失效并重建 - 没有变化。

我曾尝试将可绘制对象更改为其他内容,然后改回并重新构建 - 没有更改。

我在同一个模拟器测试设备上使用不同的可绘制对象时确实遇到了同样的崩溃,并用不同的可绘制对象替换该可绘制对象避免了第一次崩溃并将我转移到导致崩溃的下一个可绘制对象,所以它似乎确实e 与特定的可绘制对象相关 - 但可绘制对象在那里并且可以在其他设备上工作。

这太令人沮丧了,我只是不知道还能在哪里寻找问题。

更新:

根据以下内容要求澄清所讨论的矢量可绘制对象是否用于任何其他 activity 我测试了更多内容。

我检查了可绘制对象 XML,它与我在此项目中使用的其他矢量可绘制对象相同(路径细节除外),不会导致崩溃。

我找到了问题的原因。

在复合可绘制对象中使用矢量可绘制对象的任何地方都会发生崩溃。

可绘制对象本身没有任何问题,我只是将它们从复合可绘制对象中移出并移入 LinearLayout 中它们自己的 ImageView 以重新创建相同的效果。

布局效率较低,但现在没有崩溃。

release 1.1.0-alpha01 of the AndroidX AppCompat library 开始,复合矢量绘图具有“compat”属性:

  • app:drawableTopCompat
  • app:drawableLeftCompat
  • app:drawableStartCompat
  • 等等

您必须使用 AppCompatTextView 才能利用这些属性。如果您的布局被从 AppCompat 主题构建的 LayoutInflater 膨胀,当您使用 <TextView> 标签时,这将自动发生。否则,您必须将它们明确指定为 <androidx.appcompat.widget.AppCompatTextView> 标签。