【发布时间】:2014-02-21 19:35:25
【问题描述】:
我有一个使用 MediaPlayer 播放哔哔声的活动,它可以正常工作,并且即使在 proguarded 生产版本中也可以正常工作。在最新版本中,它现在突然崩溃了
Caused by: android.content.res.Resources$NotFoundException: File res/raw/beep.ogg from drawable resource ID #0x7f060000
at android.content.res.Resources.openRawResourceFd(Resources.java:994)
at android.media.MediaPlayer.create(MediaPlayer.java:855)
at com.digikey.mobile.activity.CaptureActivity.onCreate(SourceFile:135)
at android.app.Activity.performCreate(Activity.java:5206)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064)
... 11 more
Caused by: java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
at android.content.res.AssetManager.openNonAssetFdNative(Native Method)
at android.content.res.AssetManager.openNonAssetFd(AssetManager.java:428)
at android.content.res.Resources.openRawResourceFd(Resources.java:991)
... 16 more
我尝试了多种不同的加载和播放声音的方法,包括将其存储在资产中而不是原始 res/raw 中,当我在未经过保护的应用程序中使用它们时它们都可以工作,但它们都在发布时失败proguarded/zipaligned 和签名的版本。
我的 proguard 文件相当大,它确实包含经常建议的修复
-keepclassmembers class **.R$* {public static <fields>;}
-keep class **.R$*
以前有人有任何想法或遇到过类似的事情吗?
更新:我也尝试过使用 mp3 文件,但也有同样的问题。
更新 2:有趣的是,这条消息似乎需要很长时间(接近 1 秒)才能崩溃。好像它正在搜索或处理某些文件或其他东西..但是文件真的很小所以很奇怪。
【问题讨论】:
-
这个文件有多大?另外,您是否在某些自定义构建脚本中摆弄过任何
aapt开关? -
它非常小,我没有摆弄过 aapt 开关。但正如你想象的那样,我正在使用 Android Maven 插件。是否有任何可能有用的 aapt 开关?
-
更多的是感觉这个文件在不应该压缩的时候被压缩了。
aapt以前总是知道.ogg文件并且没有压缩它们。我不知道 ProGuard/zipalign 为什么/如何影响它。如果您使用 DexGuard 而不是 ProGuard,则例外情况,因为我不知道他们的资源加密可能会对事情产生什么影响。 -
顺便说一句,mp3 文件也出现了同样的问题。并且只使用 ProGuard。
标签: android android-mediaplayer proguard assets android-maven-plugin