Android, ProGuard y keepclasseswithmembernames

Un patrón común en las configuraciones de ProGuard para aplicaciones de Android es preservar las clases de View personalizadas, ya que probablemente sólo se hace referencia a ellas desde el formato XML en lugar del código de la aplicación.

Después de la creación del proyecto, el ADT añade estas reglas al proguard.cfg de un proyecto:

 -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } 

Supongo que la idea aquí es decir que cada vez que una clase define un constructor que puede ser llamado por un inflador de diseño, entonces preservarlo. Sin embargo, de acuerdo con los documentos de ProGuard, el keepclasseswithmembernames calificador es taquigrafía para keepclasseswithmembers y allowshrinking , que si entiendo correctamente significa: se permite eliminar estas clases, pero si se mantienen, no ofuscar sus nombres de miembro (probablemente no Romper enlaces entre nombres de atributos XML y setters de clase).

Pero eso no significa que esas clases todavía se eliminarán durante la fase de encogimiento (allowhrinking = true), a menos que se hagan referencia directamente en el código? De hecho, eso es lo que sucedió con un widget personalizado que estamos utilizando en nuestra aplicación, y podría arreglar el problema mediante el establecimiento de la regla a keepclasseswithmembers simplemente ya que simplemente conservar las clases coincidentes por completo (vale la pena señalar que esto es lo que el ProGuard oficial Ejemplo de Android , también).

¿Estoy interpretando mal los documentos de ProGuard o es un error en el asistente de proyecto ADT?

La configuración en el SDK de Android (al menos hasta la versión 11) no es del todo correcta.

La configuración de Android en la documentación de ProGuard especifica correctamente "-contemporariosconmembros", no "-contemporariosconmiembros".

Cuando probé por primera vez el proguard integrado con Ant, mi aplicación siguió fallando con errores de ejecución en los clickhandlers. (Siempre lo configuro en XML). Asumí que debía estar haciendo algo mal, no podía resolver qué, por lo que añadió la línea

 -dontshrink 

En la parte superior de la proguard.cfg.

Tal vez esto no es óptimo, pero se detuvo los errores de tiempo de ejecución!

Apéndice

De hecho, he comprobado esto mediante el uso de usage.txt. Los clickhandlers fueron enumerados allí antes de que agregué la opción de dontshrink, después de que la agregué, usage.txt estaba vacío como era de esperar.

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