Generación APK firmada con Android: Proguard excepción para la clase / método referenciado no encontrado

Necesito generar un APK firmado para Play Store. (Usando Android Studio) Si lo hago sin proguard (minifyEnabled false en build.gradle) todo funciona bien!

Si lo activo con parámetros predeterminados:

buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 

Recibo estas advertencias

 :app:proguardRelease Warning: com.android.volley.error.VolleyErrorHelper$1: can't find superclass or interface com.google.gson.reflect.TypeToken Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced class com.google.gson.Gson Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced class com.google.gson.Gson Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced method 'java.lang.reflect.Type getType()' in program class com.android.volley.error.VolleyErrorHelper$1 Warning: com.android.volley.error.VolleyErrorHelper: can't find referenced class com.google.gson.Gson Warning: com.android.volley.error.VolleyErrorHelper$1: can't find referenced class com.google.gson.reflect.TypeToken Warning: com.android.volley.error.VolleyErrorHelper$1: can't find referenced class com.google.gson.reflect.TypeToken Warning: com.android.volley.error.VolleyErrorHelper$1: can't find referenced class com.google.gson.reflect.TypeToken Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.JsonSyntaxException Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.JsonSyntaxException Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.Gson Warning: com.android.volley.request.GsonRequest: can't find referenced class com.google.gson.JsonSyntaxException Warning: com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl: can't find referenced method 'long getContentLengthLong()' in program class com.squareup.okhttp.internal.huc.HttpURLConnectionImpl Warning: com.squareup.okhttp.internal.huc.HttpsURLConnectionImpl: can't find referenced method 'long getHeaderFieldLong(java.lang.String,long)' in program class com.squareup.okhttp.internal.huc.HttpURLConnectionImpl Warning: okio.DeflaterSink: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement Warning: okio.Okio: can't find referenced class java.nio.file.Files Warning: okio.Okio: can't find referenced class java.nio.file.Files Warning: okio.Okio: can't find referenced class java.nio.file.Files Warning: okio.Okio: can't find referenced class java.nio.file.Path Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption Warning: okio.Okio: can't find referenced class java.nio.file.Path Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption Warning: okio.Okio: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement Warning: okio.Okio: can't find referenced class java.nio.file.Path Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption Warning: okio.Okio: can't find referenced class java.nio.file.Path Warning: okio.Okio: can't find referenced class java.nio.file.OpenOption Warning: okio.Okio: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement Warning: there were 28 unresolved references to classes or interfaces. You may need to add missing library jars or update their versions. If your code works fine without the missing classes, you can suppress the warnings with '-dontwarn' options. (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass) Warning: there were 3 unresolved references to program class members. Your input classes appear to be inconsistent. You may need to recompile the code. (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember) Exception while processing task java.io.IOException: Please correct the above warnings first. at proguard.Initializer.execute(Initializer.java:473) at proguard.ProGuard.initialize(ProGuard.java:233) at proguard.ProGuard.execute(ProGuard.java:98) at proguard.gradle.ProGuardTask.proguard(ProGuardTask.java:1074) at com.android.build.gradle.tasks.AndroidProGuardTask.doMinification(AndroidProGuardTask.java:137) at com.android.build.gradle.tasks.AndroidProGuardTask$1.run(AndroidProGuardTask.java:113) at com.android.builder.tasks.Job.runTask(Job.java:48) at com.android.build.gradle.tasks.SimpleWorkQueue$EmptyThreadContext.runTask(SimpleWorkQueue.java:41) at com.android.builder.tasks.WorkQueue.run(WorkQueue.java:227) at java.lang.Thread.run(Thread.java:745) :app:dexRelease UP-TO-DATE :app:validateExternalOverrideSigning :app:packageRelease 

Y el proceso de construcción se detiene con este mensaje:

 Error:Execution failed for task ':app:packageRelease'. > Unable to compute hash of ...\app\build\intermediates\classes-proguard\release\classes.jar 

Después de varias tentativas he encontrado una forma de eliminar las advertencias con estas líneas en mi "proguard-rules.pro":

 -dontwarn com.android.volley.** -dontwarn com.squareup.okhttp.** -dontwarn okio.** 

Sin embargo, el proceso de construcción sigue siendo un error! Alguien tiene una solución para este problema?

¡Gracias! Davide

Después de varios intentos … aquí la solución:

Primero configure el dontwarn según lo sugerido por Raymond (quizá esto no es necesario pero lo dejé):

 -dontwarn com.google.gson.** -dontwarn java.nio.file.** -dontwarn org.codehaus.mojo.animal_sniffer.** -dontwarn com.squareup.okhttp.internal.huc.** -dontwarn com.android.volley.error.** 

A continuación, configure Proguard para omitir mi biblioteca:

 -keep class com.android.volley.error.** { *; } -keep class com.squareup.okhttp.internal.huc.** { *; } -keep class okio.** { *; } 

Ather que la compilación estaba bien, pero en tiempo de ejecución de la aplicación se estrelló. Por lo tanto, para evitar este problema, he añadido estas líneas:

 -keep class android.support.design.widget.** { *; } -keep interface android.support.design.widget.** { *; } -dontwarn android.support.design.** 

Basado en una cierta información encontrada de este hilo:

Java.lang.RuntimeException: No se pudo inflar subclase de comportamiento

Con esta configuración puedo generar un APK firmado de mi aplicación.

Usted tiene que aplicar dontwarn a la clase referenciada en su lugar.

Por ejemplo:

 -dontwarn com.google.gson.** -dontwarn java.nio.file.** 
  • Cómo instalar simplemente apk en el dispositivo en Android Studio
  • ¿Por qué adb instala <same-packagename-always-release> falla?
  • Incluir jar en apk con eclipse
  • No se puede deshabilitar la aplicación de producción en la consola de Google Play para desarrolladores en favor de la versión beta.
  • Cómo abrir un archivo APK para todas las versiones de Android
  • Convertir APK en JAR
  • "La conversión al formato Dalvik falló con error 1" - sólo en exportación
  • Intención de instalar el archivo APK - Android Nougat
  • Android programaticamente actualización apk y ver el resultado de la instalación
  • Emitir firmando Android Release Build "No se pudo leer la clave del almacén de claves"
  • Cómo reconocer la compilación específica de apk, incluso si la actualización de usuario apk en Google Play
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.