我正在开发一款现已投入生产的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例外情况表明这个资源肯定是为大多数用户正确打包的。
我完全难以理解并且不确定为什么它不会加载到某些手机上。有没有人在他们的应用程序中看到过这样的东西?
答案 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中是否仍然存在问题,但是它会让不同的制造商处理不同的事情。