ProGuard para Android y GSON

Estoy configurando ProGuard para mi proyecto de Android. Mi proyecto también utiliza GSON.

He investigado las configuraciones de ProGuard para la compatibilidad con GSON y Android y me encontré con este ejemplo ofrecido por google-gson https://code.google.com/p/google-gson/source/browse/trunk/examples/android-proguard– Ejemplo / proguard.cfg .

Configuración de ProGuard copiada a continuación:

##---------------Begin: proguard configuration common for all Android apps ---------- -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers -dontpreverify -verbose -dump class_files.txt -printseeds seeds.txt -printusage unused.txt -printmapping mapping.txt -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -allowaccessmodification -keepattributes *Annotation* -renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable -repackageclasses '' -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 -dontnote com.android.vending.licensing.ILicensingService # Explicitly preserve all serialization members. The Serializable interface # is only a marker interface, so it wouldn't save them. -keepclassmembers class * implements java.io.Serializable { static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } # Preserve all native method names and the names of their classes. -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); } # Preserve static fields of inner classes of R classes that might be accessed # through introspection. -keepclassmembers class **.R$* { public static <fields>; } # Preserve the special static methods that are required in all enumeration classes. -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep public class * { public protected *; } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } ##---------------End: proguard configuration common for all Android apps ---------- ##---------------Begin: proguard configuration for Gson ---------- # Gson uses generic type information stored in a class file when working with fields. Proguard # removes such information by default, so configure it to keep all of it. -keepattributes Signature # For using GSON @Expose annotation -keepattributes *Annotation* # Gson specific classes -keep class sun.misc.Unsafe { *; } #-keep class com.google.gson.stream.** { *; } # Application classes that will be serialized/deserialized over Gson -keep class com.google.gson.examples.android.model.** { *; } ##---------------End: proguard configuration for Gson ---------- 

Preguntas:

  1. Veo que este archivo no se ha actualizado desde 2011, todavía se recomienda su uso? Pregunto porque Android / GSON ha cambiado un poco desde entonces, así que no sé cuánto de lo anterior en innecesaria o incorrecta.

  2. Si no se recomienda, ¿hay una nueva configuración de ProGuard recomendada para GSON en Android?

Creo que la mayoría de las configuraciones que tienes ya están incluidas en el SDK de Android de forma predeterminada.

Así que puede quitar la mayoría de ellos, dejando en la sección dedicada a GSON.


Estoy desarrollando en Eclipse con Android SDK Tools 22.6.3 y cualquier versión de ProGuard con eso.

Esto es lo que estoy usando para GSON 2.2.4 ( según su ejemplo ):

 ##---------------Begin: proguard configuration for Gson ---------- # Gson uses generic type information stored in a class file when working with fields. Proguard # removes such information by default, so configure it to keep all of it. -keepattributes Signature # Gson specific classes -keep class sun.misc.Unsafe { *; } #-keep class com.google.gson.stream.** { *; } # Application classes that will be serialized/deserialized over Gson # -keep class mypersonalclass.data.model.** { *; } 

Parece exactamente lo mismo que lo que tienes, excepto que no necesito la línea sobre las anotaciones.


Puedes ver que he comentado algunas clases que he añadido. Si serializa / deserializa sus propias clases, debe declararlas aquí en lugar de la referencia a mypersonalclass.data.model . Esto es realmente importante, ya que no desea que ProGuard ofusque los nombres de campo o clase que GSON utiliza para la serialización.

Siempre dejo esos tipos de comentarios allí, así que sé cómo configurar la siguiente biblioteca o aplicación.

En mi caso agregué lo anterior, pero aún así tengo un error hasta que en mi gradle de nivel de aplicación he cambiado de compile 'org.immutables:gson:2.4.6' a provided 'org.immutables:gson:2.4.6' . Tal vez alguien más iluminado puede explicar por qué, pero esto resolvió mi problema.

  • Proguard con Crashlytics
  • El método debe anularse en si se llama "en Android Studio
  • Problema con proguardFile, null devuelto: 1
  • Proguard: Excluir proyecto de biblioteca en Android
  • Cómo utilizar retrace.bat en android
  • No se puede generar APK firmado desde el estudio de Android "Error de ejecución para la tarea": ​​packageRelease '"
  • ProGuard para Android "java.lang.nosuchfielderror: Toast" excepción
  • Exportar aplicación de Android con ProGuard da error de ParseException
  • Android: la aplicación se bloquea en dispositivos Pre-Lollipop
  • Error al exportar la aplicación después de actualizar a Proguard 4.8
  • Eliminar localizaciones no utilizadas de APK
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.