来自Android应用程序的奇怪的FileNotFoundException异常

时间:2011-10-20 07:14:06

标签: android

我正在开发一款现已投入生产的Android应用,我偶尔会看到例外情况(通过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 ...

在测试中,这个视图肯定适用于多个HDPI设备,因此资源很好。在构建最终的APK之前,我做了一个完整的清理/重建,当然还发送了APK进行内部测试。事实上,每个版本而不是10,000个这样的1-2例外情况表明这个资源肯定是为大多数用户正确打包的。

我完全难以理解并且不确定为什么它不会加载到某些手机上。有没有人在他们的应用程序中看到过这样的东西?

2 个答案:

答案 0 :(得分:2)

我从未跟踪过这个问题的确切原因,但根据我开发相关应用程序的经验,我认为这是因为达到了活动的内存限制。在你的活动耗尽内存之后,似乎会发生各种奇怪的错误,包括这样的事情。

当我对应用程序的内存管理进行其他改进时(特别是使用带有位图的SoftReference),这些类型的异常开始出现频率较低。

答案 1 :(得分:0)

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

来自"Providing the Best Device Compatibility with Resources"上的文档:

  

提供默认资源非常重要,不仅仅是因为您的资源   应用程序可能会运行您没有预料到的配置,但是   也因为Android的新版本有时会添加配置   旧版本不支持的限定符。如果使用新版本   资源限定符,但保持与旧版本的代码兼容性   Android版本,然后当旧版本的Android运行时   应用程序,如果您不提供默认资源,它将崩溃,   因为它不能使用以新限定符命名的资源。 For   例如,如果您的minSdkVersion设置为4,并且您符合所有条件   使用夜间模式(夜晚或非夜晚),您的可绘制资源   在API级别8)中添加,然后API级别4设备无法访问   你的可绘制资源会崩溃。在这种情况下,你可能   希望notnight成为您的默认资源,因此您应该排除它   限定符,所以你的可绘制资源是drawable /或   抽拉晚/.

由于您使用的是-hdpi - 限定符,因此可能会出现问题,因为Android 1.6(API级别4)中引入了这些问题,因此在Android 1.5下无法使用

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

因此,在res/drawable - 文件夹中提供一些fallback-drawbale资源可能会解决您的问题。


基于我最初的想法,接缝是一个Bug,在此处描述:NotFoundException and FileNotFoundException when running app on Android 1.5

它接收了 next 资源的错误。因此,请确保为res/drawable - 文件夹中的每个drawable提供回退。

这解决了Android 1.5的问题,我不确定这在Android 2.3中是否仍然存在问题,但是它会让不同的制造商处理不同的事情。