我有一个使用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文件夹中,它们在未经混淆的应用程序中使用时都有效,但它们在经过混淆、zipalign和签名的发布版本中均失败了。
我的proguard文件非常大,并且其中包含了常见的修复方法。
-keepclassmembers class **.R$* {public static <fields>;}
-keep class **.R$*
有人有任何想法或遇到过类似的情况吗?
更新:我也尝试了MP3文件,结果出现相同的问题。
更新2:有趣的是,似乎需要相当长的时间(接近1秒)才会崩溃并显示此消息。好像正在搜索或处理某个文件之类的东西,但这个文件实际上很小,所以很奇怪。
aapt
开关? - CommonsWareaapt
** 以前总是知道.ogg
文件并且不会压缩它们。我不知道为什么/如何 ProGuard/zipalign 会影响到这一点。除非你使用的是 DexGuard 而不是 ProGuard,因为我不知道他们的资源加密可能会对此产生什么影响。 - CommonsWare