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)?
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.
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 .
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.** { *; }
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 *
Il y a un intégré @Keep
annotation que vous utilisez, veuillez vous référer à ceci lien
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