android - Proguard 破坏 Assets 或原始音频文件

标签 android android-mediaplayer proguard assets android-maven-plugin

我有一个使用 MediaPlayer 播放蜂鸣声的 Activity ,即使在 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

我尝试了多种加载和播放声音的不同方式,包括将其存储在 Assets 中而不是原始的 res/raw 中,当我在未被保护的应用程序中使用时它们都可以工作,但它们都在发布时失败proguarded/zipaligned 和签名的版本。

我的 proguard 文件相当大,它确实包含经常建议的修复

-keepclassmembers class **.R$* {public static <fields>;}
-keep class **.R$*

有人有任何想法或以前遇到过类似的事情吗?

更新:我也试过 mp3 文件,它有同样的问题。

更新 2:一件有趣的事情是,这条消息似乎需要很长时间(接近 1 秒)才能崩溃。好像它正在搜索或处理某个文件或其他东西..但是文件真的很小所以很奇怪。

最佳答案

错误表明 zip 条目 beep.ogg 被压缩了,而它不应该被压缩。

可以选择压缩 zip 文件中的单个条目。这种压缩通常对读取 zip 文件的应用程序是透明的。但是,Android 直接访问某些类型的文件(如 .ogg 和 .mp3),而无需解压缩它们,这仅在它们未压缩时才有效。

你可以看到哪些条目被压缩了

unzip -lv MyApplication.apk

在“方法”列中,“Defl”表示压缩,“存储”表示未压缩。

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 ;-)

关于android - Proguard 破坏 Assets 或原始音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21440572/

相关文章:

android - 用户输入后的时间延迟

java - Android java 单元测试,用于检查代码的可用性

android - GCMIntentService onMessage 触发时如何播放声音文件?

android - 退出应用程序-android-后如何消除声音

android - 切换到 Gradle : why do I have to keep custom views from being obfuscated?

java - 在构建 "maven-plugin"包时如何使用 Proguard 混淆?

android - 如何在同一 View 中启动子 Activity ?

Android - 将 rtsp (h264) 流保存到 mp4 文件

android - 创建版本 android apk 时出现 Proguard 异常

android - 根据我在屏幕上滑动手指的距离和速度旋转 View /对象(Android