Android应用在运行时出现奇怪的FileNotFoundException异常

7

我正在开发一款安卓应用程序,该应用程序现在已经投入生产,并且偶尔会出现异常情况(通过airbrake报告),类似以下信息:

[1.0.4] java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.android/com.mycompany.android.activities.MainActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class <unknown>
... cut lots of stuff ...
### CAUSED BY ###: java.io.FileNotFoundException: res/drawable-hdpi/tab_active.9.png:
AssetManager.java:-2:in `android.content.res.AssetManager.openNonAssetNative'
AssetManager.java:406:in `android.content.res.AssetManager.openNonAsset'
Resources.java:1706:in `android.content.res.Resources.loadDrawable'
... cut lots more stuff ...

在测试中,这个视图在多个高分辨率设备上确实有效,所以那个资源在那里是好的。在构建最终的APK之前,我进行了完整的清理/重建,并当然将APK发送给内部测试。每个版本中出现1-2个异常而不是10,000个异常,这表明对于大多数用户来说,该资源肯定被正确打包了。
我完全被卡住了,不确定为什么它不能在某些手机上加载。有人在他们的应用程序中看到过这样的情况吗?

可能帮助不大,但我有一个拥有超过400k下载量的应用程序,从未看到过这个错误。 - pgsandstrom
2个回答

3
我从未找到这个问题的确切原因,但基于我开发相关应用的经验,我认为它是由于活动达到内存限制所致。当您的活动耗尽内存时,似乎会发生各种奇怪的错误,包括像这样的错误。
当我改进应用的内存管理(特别是使用带有位图的SoftReference)时,这些类型的异常出现的频率就少了。

0

我猜这些设备正在运行Android 1.5

"提供最佳设备兼容性资源"的文档中:

提供默认资源不仅很重要,因为您的应用程序可能在您没有预料到的配置上运行,而且由于新版本的Android有时会添加旧版本不支持的配置限定符。如果您使用新的资源限定符,但保持与旧版Android的代码兼容性,那么当旧版Android运行您的应用程序时,如果您不提供默认资源,它将崩溃,因为它无法使用以新限定符命名的资源。例如,如果您的minSdkVersion设置为4,并且您使用夜间模式(night或notnight)对所有可绘制资源进行限定(这是在API Level 8中添加的),则API级别4的设备无法访问您的可绘制资源并将崩溃。在这种情况下,您可能希望notnight成为您的默认资源,因此您应该排除该限定符,使您的可绘制资源位于drawable/或drawable-night/中。

由于您正在使用-hdpi限定符,这可能是问题的原因,因为它们是在Android 1.6(API级别4)中引入的,因此在Android 1.5下不可用。

请参阅此主题:Drawable-hdpi,Drawable-mdpi,Drawable-ldpi Android

因此,在res/drawable文件夹中提供一些备用可绘制资源可能会解决您的问题。


根据我的原始想法,似乎存在一个错误,其描述在此处:在Android 1.5上运行应用程序时出现NotFoundException和FileNotFoundException

看起来错误是针对下一个资源抛出的。因此,请确保为res/drawable文件夹中的每个可绘制资源提供回退。

这适用于Android 1.5,我不确定在Android 2.3中是否仍然存在此问题,但似乎不同制造商处理这些事情的方式有所不同。


谢谢你的建议。然而,这些设备正在运行Android 2.3,并且我们在drawable/目录中也有备用资源。 - Nik Reiman

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