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.
- Constantes para tipos de recursos en Android
- Android cómo exportar jar con recursos?
- Cómo obtener una matriz de bytes de un recurso extraíble?
- Extraer el icono de la aplicación del archivo apk
- Manejo de diferentes tamaños de pantalla (Android)
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.
- Android: conversión entre cadenas, SpannedStrings y Spannablestrings
- WebView, agrega el archivo .CSS local a una página HTML?
- ¿Por qué setImageResource no muestra nada?
- ¿Por qué no se actualizan mis archivos de activos?
- Java: Acceso a recursos y la ley de Demeter
- Error de diseño de Android: "Id de recurso <res_id> no es del tipo STYLE (en lugar de attr)"
- Cómo realizar 3D Curve Wall con jQuery o js
- Reproducir archivos multimedia ubicados en la carpeta de activos
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>; }
- Cómo implementar un ContentObserver en un fragmento utilizando CursorAdapter y LoaderCallbacks?
- ¿Es posible cambiar el tamaño del icono dentro de EditText