web-dev-qa-db-fra.com

ProGuard pour Android et GSON

Je configure ProGuard pour mon projet Android. Mon projet utilise également GSON.

J'ai recherché les configurations ProGuard pour la compatibilité avec GSON et Android et j'ai rencontré cet exemple proposé par google-gson https://code.google.com/p/google-gson /source/browse/trunk/examples/Android-proguard-example/proguard.cfg .

Configuration ProGuard copiée ci-dessous:

##---------------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  ----------

Questions:

  1. Je constate que ce fichier n'a pas été mis à jour depuis 2011, son utilisation est-elle toujours recommandée? Je demande parce qu'Android/GSON a beaucoup changé depuis lors, donc je ne sais pas combien de ce qui précède est inutile ou incorrect.

  2. Si ce n'est pas recommandé, existe-t-il une nouvelle configuration ProGuard recommandée pour GSON dans Android?

30
AtariPete

Je pense que la plupart de ces paramètres que vous avez sont déjà inclus dans le SDK Android par défaut.

Vous pouvez donc supprimer la plupart d'entre eux, en laissant simplement dans la section consacrée à GSON.


Je développe dans Eclipse en utilisant Android SDK Tools 22.6.3 & quelle que soit la version de ProGuard fournie avec cela.

Voici ce que j'utilise pour GSON 2.2.4 ( selon leur exemple ):

##---------------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.** { *; }

Il ressemble exactement à ce que vous avez, sauf que je n'ai pas besoin de la ligne concernant les annotations.


Vous pouvez voir que j'ai commenté certaines classes que j'ai ajoutées moi-même. Si vous sérialisez/désérialisez vos propres classes, vous devez les déclarer ici à la place de la référence à mypersonalclass.data.model. Ceci est vraiment important, car vous ne voulez pas que ProGuard masque les noms de champ ou de classe que GSON utilise pour la sérialisation.

Je laisse toujours ces types de commentaires là-dedans, donc je sais comment configurer la prochaine bibliothèque ou application.

68

Utiliser -keep est une mauvaise pratique et vous ne devriez jamais le faire. Vous ne voulez presque jamais utiliser -keep; si vous avez besoin d'une règle ProGuard, vous voulez généralement l'une des variantes les plus spécifiques

-keepclassmembers - Cela protège uniquement les membres de la classe contre le rétrécissement et l'obscurcissement.

-keepnames - Cela permet de réduire les classes et les membres, mais pas l'obscurcissement. Autrement dit, tout code inutilisé va être supprimé. Mais le code conservé conservera ses noms d'origine.

-keepclassmembernames - Les classes inutilisées sont supprimées, les classes restantes sont renommées, les membres inutilisés de ces classes sont supprimés, mais les membres restants conservent leurs noms d'origine.

Pour plus d'informations, veuillez lire ceci

PS - c'est ce que j'ai fait pour Gson

-keepclassmembernames class rscom.pojo.** { <fields>; }
1
Kaustubh Bhagwat

Dans mon cas, j'ai ajouté ce qui précède, mais j'ai quand même eu une erreur jusqu'à ce que dans mon niveau d'application, je change compile 'org.immutables:gson:2.4.6' à provided 'org.immutables:gson:2.4.6'. Peut-être que quelqu'un de plus éclairé peut expliquer pourquoi, mais cela a résolu mon problème.

0
GotaloveCode