Proguard rompe el archivo de audio en activos o en bruto

Tengo una actividad que reproduce un pitido con MediaPlayer que funciona bien y se utiliza para trabajar bien, incluso en la versión proguarded producción. Con la última versión que ahora se bloquea de repente con

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 

He intentado una serie de diferentes maneras de cargar y reproducir el sonido, incluyendo el almacenamiento en activos en lugar de la original res / raw y todos ellos funcionan cuando utilizo en la aplicación que no ha sido proguarded, pero todos ellos fallan con la versión de lanzamiento que es Proguarded / zipaligned y firmado.

Mi archivo proguard es bastante grande y contiene la sugerida solución de

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

¿Alguien tiene alguna idea o ha encontrado algo como esto antes?

Actualización: También intenté con archivos mp3 y tiene los mismos problemas.

Actualización 2: Una cosa interesante es que parece tomar bastante tiempo (cerca de 1s) para colapsar con este mensaje. Como si estuviera buscando o procesando algún archivo o algo .. pero el archivo es muy pequeño por lo que es extraño.

El error sugiere que la entrada zip beep.ogg está comprimida, cuando no debería ser.

Opcionalmente, las entradas individuales en archivos zip pueden comprimirse. Esta compresión suele ser transparente para la aplicación que lee el archivo zip. Sin embargo, Android accede a algunos tipos de archivos (como .ogg y .mp3) directamente, sin desempaquetarlos, que sólo funciona si no están comprimidos.

Puede ver qué entradas se comprimen con

 unzip -lv MyApplication.apk 

En la columna 'Método', 'Defl' significa comprimido y 'Almacenado' significa sin comprimir.

ProGuard no realiza el empaquetado final del archivo apk: aapt, apkbuilder, jarsigner, zipalign y posibles pasos de post-procesamiento. En las etapas adecuadas, deberían dejar sin comprimir los archivos .ogg y .mp3. Puede que tenga que comprobar su integración en el proceso de generación de Maven.

DexGuard por cierto realiza el embalaje final. Tiene una opción -dontcompress para controlar qué archivos o tipos de archivo se dejan sin comprimir. La configuración predeterminada deja los archivos .ogg y .mp3 sin comprimir.

(Soy el desarrollador de ProGuard y DexGuard)

Actualización de Manfred Moser:

Éste era precisamente el problema. Resulta que esto no tiene nada que ver con la integración de proguard o el complemento de Android Maven. El problema fue causado por la configuración Maven Jarsigner Plugin que usé. Yo había establecido removeExistingSignatures a true, que no es el valor por defecto y causó todos los archivos en el archivo comprimido. Considero esto un extraño bug del plugin jarsigner en esta etapa. En cualquier caso … la configuración predeterminada es para que este parámetro se establezca en falso por lo que nadie debería tener ningún problema … a menos que por supuesto que lo configuró como si lo hiciera 😉

Me parece extraño que te esté diciendo que es un recurso útil:

Archivo res / raw / beep.ogg de ID de recurso extraíble

Creo que tienes que decirle que también mantenga la clase R. Esto es lo que uso en una aplicación que también carga archivos .ogg de raw.

 -keep class *.R -keepclasseswithmembers class **.R$* { public static <fields>; } 
  • ¿Hay una herramienta para encontrar recursos no utilizados en un proyecto de Android?
  • Android Lint - Cómo ocultar una advertencia 'El recurso Xxx parece no estar utilizado'
  • Recursos de importación android de proyecto de biblioteca
  • ¿Cómo agregar el Recurso de Biblioteca al Proyecto Cordova?
  • Cómo identificar dónde el código es incorrecto, si recibo advertencia Convertir a cadena: TypedValue?
  • Cómo excluir archivos en carpeta "/ res" de un proyecto Android Eclipse
  • ¿Cómo puedo obtener el DisplayMetrics correcto de un AppWidget en Android?
  • La razón de los activos y recursos crudos en Android
  • Android strings.xml ¿Buenas prácticas?
  • Lista de palabras reservadas en Android
  • ¿Qué límites hay en el número de recursos de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.