title: ProGuard for Android and GSON
body: <p>I'm setting up ProGuard for my Android project. My project also uses GSON.</p>
  
  <p>I've researched ProGuard configurations for compatibility with GSON and Android and came across this example offered by google-gson <a href="https://code.google.com/p/google-gson/source/browse/trunk/examples/android-proguard-example/proguard.cfg">https://code.google.com/p/google-gson/source/browse/trunk/examples/android-proguard-example/proguard.cfg</a>.</p>
  
  <p>ProGuard config copied below:</p>
  
  <pre><code>##---------------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 &lt;methods&gt;;
  }
  
  -keepclasseswithmembernames class * {
      public &lt;init&gt;(android.content.Context, android.util.AttributeSet);
  }
  
  -keepclasseswithmembernames class * {
      public &lt;init&gt;(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 &lt;fields&gt;;
  }
  
  # 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  ----------
  </code></pre>
  
  <p><strong>Questions:</strong></p>
  
  <ol>
  <li><p>I see that this file has not been updated since 2011, is it still recommended for use? I ask because Android/GSON has changed quite a bit since then so I don't know how much of the above in unnecessary or incorrect.</p></li>
  <li><p>If this is not recommended, is there a new recommended ProGuard configuration for GSON in Android?</p></li>
  </ol>