web-dev-qa-db-fra.com

Empêcher l'obscurcissement du nom d'un membre de classe par ProGuard

J'ai ma classe ClassMultiPoint avec des sous-classes.

public class ClassMultiPoints
 {
   public String message;
   public List<ClassPoints> data;

   public class ClassPoints
    {
      public String id;
      public List<ClassPoint> points;
      public class ClassPoint
       {
         public String speed;
         public String bearing;
       }
    }
 }

Je vais obtenir la valeur de l'objet oPoints de l'analyse GSON:

oPoints = gson.fromJson( jsonString, ClassMultiPoints.class);

J'essaie d'utiliser oPoints.message.

Lorsque j'exécute mon application sans proguard, l'exécution de l'application est réussie. Lorsque je lance mon application avec proguard mon application se bloque.

Je pense que le problème est: proguard renommer l'attribut 'oPoints.message' De ma classe en court-circuit 'a'.

J'essaie de garder les noms des méthodes et des attributs est constant, mais proguard renomme son:

proguard.cfg:

-injars      bin/classes
-injars      libs
-outjars     bin/classes-processed.jar
-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*
-dontskipnonpubliclibraryclasses
-optimizationpasses 5
-printmapping map.txt
-flattenpackagehierarchy

-keep public class * extends Android.app.Activity
-keep public class * extends Android.app.Application
-keep public class * extends Android.app.MapActivity
-keep public class * extends Android.app.Service
-keep public class * extends Android.content.BroadcastReceiver
-keep public class * extends Android.content.ContentProvider

-libraryjars  libs/commons-io-2.2.jar
-libraryjars  libs/ftp4j-1.7.1.jar
-libraryjars  libs/gson-2.2.2.jar

-keep public class org.Apache.commons.io.**
-keep public class it.sauronsoftware.ftp4j.**
-keep public class com.google.gson.**

-keep public class com.mypackagename.ActivityMonitor$*

-keep public class * extends Android.view.View {
    public <init>(Android.content.Context);
    public <init>(Android.content.Context, Android.util.AttributeSet);
    public <init>(Android.content.Context, Android.util.AttributeSet, int);
    public void set*(...);
}

-keepclasseswithmembers class * {
    public <init>(Android.content.Context, Android.util.AttributeSet);
}

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

-keepclassmembers class * extends Android.content.Context {
   public void *(Android.view.View);
   public void *(Android.view.MenuItem);
}

-keepclassmembers class * implements Android.os.Parcelable {
    static Android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

Quelle est la bonne façon de conserver les noms des méthodes et des attributs de la classe my one (statique)?

65
Tapa Save

Merci Waqas!

Je trouve la solution à mon cas:

-optimizationpasses 5
-dump class_files.txt
-printseeds seeds.txt
-printusage unused.txt
-printmapping mapping.txt
-optimizations !code/simplification/arithmetic,!field/*,!class/merging*/
-allowaccessmodification
-repackageclasses ''

-keep public class * extends Android.app.Activity
-keep public class * extends Android.app.Application
-keep public class * extends Android.app.MapActivity
-keep public class * extends Android.app.Service
-keep public class * extends Android.content.BroadcastReceiver
-keep public class * extends Android.content.ContentProvider

-libraryjars  libs/commons-io-2.2.jar
-libraryjars  libs/gson-2.2.2.jar
-keep public class org.Apache.commons.io.**
-keep public class com.google.gson.**
-keep public class com.google.gson.** {public private protected *;}

##---------------Begin: proguard configuration for Gson ----------
-keepattributes *Annotation*,Signature
-keep class com.mypackage.ActivityMonitor.ClassMultiPoints.** { *; }
-keep public class com.mypackage.ActivityMonitor$ClassMultiPoints     { public protected *; }
-keep public class com.mypackage.ActivityMonitor$ClassMultiPoints$ClassPoints { public protected *; }
-keep public class com.mypackage.ActivityMonitor$ClassMultiPoints$ClassPoints$ClassPoint { public protected *; }
# To support Enum type of class members
-keepclassmembers enum * { *; } 
##---------------End: proguard configuration for Gson ----------

De plus, je n'utilise pas @SerializedName("message") dans ma classe, la configuration supprimée fonctionne correctement sans sérialisation.

27
Tapa Save

Si vous ne voulez pas que vos membres de la classe soient obscurcis, utilisez l'annotation SerializedName fournie par Gson. Par exemple:

public class ClassMultiPoints
{
   @SerializedName("message")
   public String message;
   @SerializedName("data")
   public List<ClassPoints> data;

   ...

}

De plus, assurez-vous d’ajouter la configuration appropriée pour la bibliothèque Gson. Par 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

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

Pour plus d'informations, lisez this .

65
waqaslam

J'ai aussi découvert qu'il me fallait -keepclassmembers Lorsque j'utilise l'option d'optimisation de Dexguard. Sans cela, plusieurs de mes objets modèles n'ont pas réussi à se désérialiser

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

# Application classes that will be serialized/deserialized over Gson, keepclassmembers
-keep class com.myapp.model.** { *; }
-keepclassmembers class com.myapp.model.** { *; }
22
scottyab

Si vous utilisez le @Expose annotation comme moi, vous pouvez dire à ProGuard de conserver tout champ annoté avec:

# keep anything annotated with @Expose
-keepclassmembers public class * {
    @com.google.gson.annotations.Expose *;
}
# Also keep classes that @Expose everything
-keep @com.google.gson.annotations.Expose public class *
7
phreakhead

Il y a un intégré @Keep annotation que vous utilisez, veuillez vous référer à ceci lien

4
Pritesh Mhatre

Pour exclure votre classe de l'obscurcissement, conservez les attributs d'InnerClasses, conservez votre classe et conservez les membres de la classe, par exemple.

-keepattributes InnerClasses
 -keep class com.yourproject.YourClass**
 -keepclassmembers class com.yourproject.YourClass** {
    *;
 }

Pour plus d'informations http://proguard.sourceforge.net/manual/examples.html

4
Arunendra