我有一项活动的活动,该活动与媒体播放器一起播放蜂鸣声,即使在演奏的生产版本中也可以正常工作,而且还可以正常工作。随着最新版本,它现在突然用
崩溃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秒)。好像它在搜索或处理某些文件或其他内容。但是该文件确实很小,因此很奇怪。
错误表明zip entry beep.ogg被压缩,不应该被压缩。
可以选择压缩zip文件中的各个条目。此压缩通常与读取zip文件的应用程序透明。但是,Android直接访问某些类型的文件(例如.ogg and .mp3),而无需解开包装,这仅在不被压缩时起作用。
您可以看到哪些条目被
压缩unzip -lv MyApplication.apk
列中的"方法"," defl"表示压缩和"存储"表示未压缩。
proguard不执行APK文件的最终包装 - AAPT,APKBuilder,Jarsigner,Zipalign和可能的后处理步骤。在适当的阶段,他们应该离开.ogg和.mp3文件未压缩。您可能需要检查他们在Maven构建过程中的集成。
dexguard偶然地执行了最终包装。它具有一个选项-dontcompress,可以控制哪些文件或文件类型未压缩。默认配置离开.ogg和.mp3文件未压缩。
(我是proguard和dexguard的开发人员)
Manfred Moser的更新:
这确实是问题。事实证明,这与Proguard Integration或Android Maven插件无关。问题是由我使用的Maven Jarsigner插件配置引起的。我已经将RemoveExistIndatures设置为true,这不是默认值,并导致存档中的所有文件被压缩。在此阶段,我认为这是Jarsigner插件的怪异错误。无论如何...默认配置是要将此参数设置为false,因此没有人应该有任何问题...除非您像我一样将其设置为true ;-)
我也有一个类似的情况,即我的应用程序在proguard之后退缩(即使在调试中?尽管我已经明确将其关闭)。
08-30 22:10:32.360 561-18619/? E/FileSource: Failed to open file 'android.resource://com.mycompany.myapp/2131230720'. (No such file or directory)
最终我必须添加keep.xml文件,如在此处建议的自定义要保留哪些资源
与(@/res/raw/keep.xml)这样的东西:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@raw/*">
</resources>
您当然可以更明确地将其设置,但我只有mp3在我的原始文件夹上。
我的 unzip -lv app-release.apk
显示了我的mp3文件为:
0 Stored 0 0% 00-00-1980 00:00 00000000 res/raw/audio.mp3
哪个是奇数(0字节?!)。
我觉得很奇怪,这是一个可绘制的资源:
文件res/raw/beep.ogg从可绘制的资源ID
我认为您需要告诉它也要保留R类。这是我在一个应用程序中使用的内容,该应用程序还从RAW加载.OGG文件。
-keep class *.R
-keepclasseswithmembers class **.R$* {
public static <fields>;
}