zoukankan      html  css  js  c++  java
  • Proguard breaking audio file in assets or raw

    http://stackoverflow.com/questions/21440572/proguard-breaking-audio-file-in-assets-or-raw

    Issue:

    I have an activity that plays a beep sound with MediaPlayer that works fine and used to work fine even in the proguarded production version. With the latest release it now suddenly crashes with

    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

    I tried a number of different ways of loading and playing the sound including storing it in assets instead of the original res/raw and they all work when I use in the app that has not been proguarded but they all fail with the release version that is proguarded/zipaligned and signed.

    My proguard file is rather large and it does contain the often suggested fix of

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

    Anybody have any ideas or encountered something like this before?

    Update: I also tried with mp3 files and it has the same problems.

    Update 2: An interesting thing is that it seem to take quite a while (close to 1s) to crash with this message. As if it is searching or processing some file or something .. but the file is really small so its weird.

    Answer:

    The error suggests that the zip entry beep.ogg is compressed, when it shouldn't be.

    Individual entries in zip files can optionally be compressed. This compression is typically transparent to the application that reads the zip file. However, Android accesses some types of files (like .ogg and .mp3) directly, without unpacking them, which only works if they are not compressed.

    You can see which entries are compressed with

    unzip -lv MyApplication.apk

    In the column 'Method', 'Defl' means compressed and 'Stored' means uncompressed.

    ProGuard doesn't perform the final packaging of the apk file -- aapt, apkbuilder, jarsigner, zipalign, and possible post-processing steps do. At the proper stages, they should leave .ogg and .mp3 files uncompressed. You may need to check their integration in the Maven build process.

    DexGuard incidentally does perform the final packaging. It has an option -dontcompress to control which files or file types are left uncompressed. The default configuration leaves .ogg and .mp3 files uncompressed.

    (I am the developer of ProGuard and DexGuard)

    Update by Manfred Moser:

    This was indeed the problem. Turns out that this has nothing to do with the proguard integration or the Android Maven Plugin. The problem was caused by the Maven Jarsigner Plugin configuration I used. I had set removeExistingSignatures to true, which is not the default value and caused all files in the archive to be compressed. I consider this a weird bug of the jarsigner plugin at this stage. In any case... the default config is to for this parameter to be set to false so nobody should have any problem ... unless of course you set it to true like I did ;-)

  • 相关阅读:
    Java基于opencv实现图像数字识别(五)—腐蚀、膨胀处理
    Java基于opencv实现图像数字识别(四)—图像降噪
    Java基于opencv实现图像数字识别(三)—灰度化和二值化
    Java基于opencv实现图像数字识别(二)—基本流程
    通过对表格数据的选择对input的value进行修改
    datagrid可编辑表格
    DataGrid中的事件和方法
    DataGrid中的常用属性
    Spring中AOP(通知)的使用
    ComboTree 的json格式和引用
  • 原文地址:https://www.cnblogs.com/rosepotato/p/5520145.html
Copyright © 2011-2022 走看看