tutorial studio sourcesets minifyenabled features android proguard

android - studio - ¿Cómo decirle a ProGuard que guarde todo en un paquete en particular?



proguard xamarin (2)

Mi aplicación tiene muchas actividades y también usa una biblioteca nativa. Con la configuración predeterminada de ProGuard que Eclipse genera ProGuard se eliminan muchas cosas: métodos OnClick, miembros estáticos, métodos de devolución de llamada que usa mi biblioteca nativa ... ¿Hay alguna manera simple de ordenar a ProGuard que NO elimine nada de mi paquete? Eliminar cosas ahorra solo aproximadamente el 2.5% del tamaño de la aplicación, pero rompe completamente mi aplicación. Configurarlo, probarlo y mantenerlo clase por clase en la configuración de ProGuard sería una molestia.


Como resultado final encontré que simplemente mantener a todos los miembros de la clase no es suficiente para el correcto trabajo de mi aplicación, ni es necesario. Agregué al archivo de configuración esto:

-keepclasseswithmembers class * { void onClick*(...); } -keepclasseswithmembers class * { *** *Callback(...); }

El caso con onClick * es para todos los métodos que abordo en android: onClick atributo en archivos de diseño .xml (comienzo los nombres de todos esos métodos con ''onClick'').

El caso con * Devolución de llamada es para todos los métodos de devolución de llamada que llamo desde mi código nativo (a través de JNI). Coloco un sufijo ''Devolución de llamada'' al nombre de cada uno de esos métodos.

También agregué algunas filas para algunos casos especiales con variables que uso del código nativo, como:

-keep class com.myapp.mypackage.SomeMyClass { *** position; }

(para una variable con el nombre ''posición'' en una clase con el nombre ''SomeMyClass'' del paquete com.myapp.mypackage)

Todo esto se debe a que estos onClick, callback, etc. no solo deben estar presentes sino que también deben mantenerse con sus nombres originales. Las otras cosas que ProGuard puede optimizar libremente.

El caso con los métodos nativos también es importante, pero para ello había una declaración en el archivo generado desde Eclipse:

-keepclasseswithmembernames class * { native <methods>; }


Creo que debe agregar estas banderas como mínimo (modifique para cada nombre de paquete individual):

-keep class javax.** { *; } -keep class org.** { *; } -keep class twitter4j.** { *; }

Además, agregue estos indicadores:

-dontshrink -dontoptimize -dontpreverify

Aquí está mi archivo de configuración completo: de mi Proguard.cfg:

-dontshrink -dontoptimize -dontpreverify -verbose -dontwarn javax.management.** -dontwarn java.lang.management.** -dontwarn org.apache.log4j.** -dontwarn org.apache.commons.logging.** -dontwarn org.slf4j.** -dontwarn org.json.** -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keep class javax.** { *; } -keep class org.** { *; } -keep class twitter4j.** { *; } -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }