我有一个活动,使用MediaPlayer发出哔哔声,工作正常,即使在生产版本中也能正常工作.随着最新发布,它现在突然崩溃了
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;} -keep class **.R$*
以前有人有任何想法或遇到过这样的事吗?
更新:我也试过mp3文件,它有同样的问题.
更新2:一个有趣的事情是,这条消息似乎需要花费很长时间(接近1秒).好像它正在搜索或处理某些文件或其他东西..但文件非常小,所以它很奇怪.
该错误表明压缩条目beep.ogg是压缩的,当它不应该被压缩.
可以选择压缩zip文件中的各个条目.此压缩通常对读取zip文件的应用程序是透明的.但是,Android直接访问某些类型的文件(如.ogg和.mp3),而不解压缩它们,只有在未压缩的情况下才能解析.
您可以查看压缩的条目
unzip -lv MyApplication.apk
在"方法"列中,"Defl"表示压缩,"Stored"表示未压缩.
ProGuard不执行apk文件的最终打包 - aapt,apkbuilder,jarsigner,zipalign以及可能的后处理步骤.在适当的阶段,他们应该保留.ogg和.mp3文件未压缩.您可能需要在Maven构建过程中检查它们的集成.
DexGuard偶然会执行最终包装.它有一个选项-dontcompress来控制哪些文件或文件类型保持未压缩状态.默认配置使.ogg和.mp3文件保持未压缩状态.
(我是ProGuard和DexGuard的开发人员)
Manfred Moser更新:
这确实是问题所在.事实证明,这与proguard集成或Android Maven插件无关.问题是由我使用的Maven Jarsigner插件配置引起的.我将removeExistingSignatures设置为true,这不是默认值,导致归档中的所有文件都被压缩.在这个阶段,我认为这是jarsigner插件的一个奇怪的错误.在任何情况下...默认配置是为了将此参数设置为false,所以没有人应该有任何问题......除非你像我一样将它设置为true ;-)