仅当 运行 在特定设备上时才出现资源未找到异常
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 我测试了更多内容。
- 如果我将失败的可绘制对象添加到我的主 activity 它在我的主 activity 中完美运行但仍然无法在 activity 中找到它导致崩溃和仍然导致崩溃
- 我的项目中似乎至少有三个矢量可绘制对象在三个不同的活动中表现相同
- 如果我将崩溃的 activity 中有问题的可绘制对象替换为另一个矢量可绘制对象(不是导致崩溃的其他对象之一),那么有问题的 activity 不会崩溃。
- 如果我将三个崩溃 activity 中的有问题的可绘制对象替换为其他有问题的可绘制对象之一,那么 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>
标签。
我在 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 我测试了更多内容。
- 如果我将失败的可绘制对象添加到我的主 activity 它在我的主 activity 中完美运行但仍然无法在 activity 中找到它导致崩溃和仍然导致崩溃
- 我的项目中似乎至少有三个矢量可绘制对象在三个不同的活动中表现相同
- 如果我将崩溃的 activity 中有问题的可绘制对象替换为另一个矢量可绘制对象(不是导致崩溃的其他对象之一),那么有问题的 activity 不会崩溃。
- 如果我将三个崩溃 activity 中的有问题的可绘制对象替换为其他有问题的可绘制对象之一,那么 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>
标签。