Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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.

  • Cómo configurar proguard para eliminar SOLAMENTE llamadas de registro de android
  • Configuración de Android Proguard para la v7 Support Library ActionBar
  • Pruebas de unidad de Android con proguard activado
  • Google Analytics vuelve a consultar Proguard
  • Métodos de reflexión no funcionan cuando se utiliza proguard para la aplicación de Android
  • Cómo corregir la advertencia proguard 'no se puede encontrar el método de referencia' para los métodos existentes 'clonar' y 'finalizar' de la clase java.lang.Object
  • Android - ¿Cómo comprobar la ofuscación Proguard ha funcionado?
  • Problemas con el uso de la biblioteca jackson-json al usar Proguard
  • One Solution collect form web for “Cambiar a Gradle: ¿por qué tengo que mantener las vistas personalizadas de ser ofuscada?”

    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).

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.