Cambiar a Gradle: ¿por qué tengo que mantener las vistas personalizadas de ser ofuscada?

Estoy moviendo un proyecto de Ant a Gradle, pero hay algo que no puedo entender.


HECHOS

Después de construir una versión APK (es decir, ofuscado), me di cuenta de que la aplicación estaba chocando mal . El error se puede resumir en esto:

java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet] 

Una depuración (es decir, no ofuscada) APK funciona muy bien, así que supuse que tenía que ver con mi configuración de ProGuard / DexGuard.

Intenté mantener la referencia de clase agregando la siguiente declaración:

 -keep class com.mypackage.MyCustomView 

Y, como resultado, el lanzamiento APK funciona muy bien . Luego hice algunas investigaciones y probé esta configuración más específica de ProGuard / DexGuard:

 -keep public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } 

Que también funciona, y es independiente de la clase .


PREGUNTA

Me pregunto:

  1. ¿Por qué no tengo que lidiar con es mientras se usa Ant?
  2. ¿Cuál es la razón exacta para que aparezca ese error? (Sigue la respuesta a la primera pregunta)

RESPONDER

La respuesta de @Blundell fue sustancialmente correcta. Resulta que faltaba una línea de la configuración build.gradle :

 android { ... buildTypes { debug { ... } release { proguardFile getDefaultDexGuardFile('dexguard-release.pro') # <----- this line proguardFile 'dexguard-project.txt' } } } 

Parece que la línea es realmente obligatoria, ya que sirve como un conjunto básico de reglas para ProGuard / DexGuard. De hecho, esto es parte del archivo dexguard-release.pro :

 -keepclassmembers !abstract class !com.google.ads.** extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public void set*(...); } -keepclassmembers !abstract class * { public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.content.Context { public void *(android.view.View); } 

He encontrado la documentación un poco demasiado vaga sobre esto, espero que pueda ser redactado para aclarar cualquier ambigüedad que pueda tener. En conjunto, mi culpa.

Probablemente Ant estaba utilizando un archivo de configuración diferente,

También con Gradle necesita indicar explícitamente que desea utilizar también el archivo de configuración de proguard de Android, es decir, utilizar múltiples archivos de reglas como:

  proguardFile getDefaultProguardFile('proguard-android.txt') proguardFile 'your/sepcific/folder/proguard.cfg' 

(Recuerdo que Ant nunca usó un archivo proguard de SDK y que solía ser recomendado para copiar toda la configuración).

  • Proguard problemas con los archivos jar, ¿cómo encontrar el frasco que falta?
  • ¿Qué hace ciertas clases de android "debe-mantener"?
  • Retrofit2 proguard remove param
  • Proguard busca los números de línea que faltan
  • ¿Cómo verificar los datos de POST se envía desde la aplicación de Android con la firma SHA1 correcta?
  • Proguard no puede encontrar la clase referenciada com.google.ads.internal.state.AdState
  • AppCompat V7 falla al usar shrinkResources
  • Proguard causa un accidente en los servicios de Google Play 'ActivityRecognitionResult getMostProbableActivity
  • Android Studio 0.5.0 reconstrucción no funciona con Proguard
  • ¿Cómo mantener el código de cruce cuando ofusque mi proyecto?
  • Errores de Proguard al exportar el proyecto de Android después de actualizar a ADT 20
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.