web-dev-qa-db-fra.com

Utilisation de GSON avec proguard activé

Mon code fonctionne parfaitement sans proguard, mais GSON ne fonctionne pas lorsque proguard est activé.

C'est la partie du code où cela ne fonctionne pas

JSONArray mensaje = response.getJSONArray("categorias");
// Parsear con Gson
Categorias[] categorias = gson.fromJson(mensaje.toString(), Categorias[].class);
Log.d("mainfragment","desc categoria "+categorias[0].getDescripcionCategoria());

le journal du mainfragment imprime null

# Output
D/Dato categorias﹕ Respuesta: {"categorias":[{"idCategoria":"22","imagenCategoria":"ic_aseguradora","descripcionCategoria":"Aseguradoras"},{"idCategoria":"24","imagenCategoria":"ic_bar","descripcionCategoria":"Bares"},{"idCategoria":"12","imagenCategoria":"ic_boutique","descripcionCategoria":"Boutiques"},{"idCategoria":"6","imagenCategoria":"ic_cafe","descripcionCategoria":"Cafeterias"},{"idCategoria":"21","imagenCategoria":"ic_ciber","descripcionCategoria":"Ciber"},{"idCategoria":"10","imagenCategoria":"ic_estetica","descripcionCategoria":"Estéticas"},{"idCategoria":"1","imagenCategoria":"ic_farmacia","descripcionCategoria":"Farmacias"},{"idCategoria":"7","imagenCategoria":"ic_ferreteria","descripcionCategoria":"Ferreterias"},{"idCategoria":"16","imagenCategoria":"ic_gas","descripcionCategoria":"Gas"},{"idCategoria":"23","imagenCategoria":"ic_gasolinera","descripcionCategoria":"Gasolineras"},{"idCategoria":"4","imagenCategoria":"ic_gym","descripcionCategoria":"Gimnasios"},{"idCategoria":"2","imagenCategoria":"ic_hotel","descripcionCategoria":"Hoteles"},{"idCategoria":"15","imagenCategoria":"ic_lavanderia","descripcionCategoria":"Lavanderias"},{"idCategoria":"19","imagenCategoria":"ic_muebleria","descripcionCategoria":"Mueblerias"},{"idCategoria":"25","imagenCategoria":"ic_optica","descripcionCategoria":"Ópticas"},{"idCategoria":"20","imagenCategoria":"ic_pasteleria","descripcionCategoria":"Pastelerias"},{"idCategoria":"17","imagenCategoria":"ic_pizza","descripcionCategoria":"Pizzerías"},{"idCategoria":"13","imagenCategoria":"ic_purificadora","descripcionCategoria":"Purificadoras de agua"},{"idCategoria":"5","imagenCategoria":"ic_restaurant","descripcionCategoria":"Restaurantes"},{"idCategoria":"11","imagenCategoria":"ic_ropa","descripcionCategoria":"Ropa"},{"idCategoria":"9","imagenCategoria":"ic_salon","descripcionCategoria":"Salones de fiestas"},{"idCategoria":"3","imagenCategoria":"ic_sonido","descripcionCategoria":"Sonidos"},{"idCategoria":"28","imagenCategoria":"ic_taqueria","descripcionCategoria":"Taquería"},{"idCategoria":"8","imagenCategoria":"ic_taxi","descripcionCategoria":"Taxis"},{"idCategoria":"14","imagenCategoria":"ic_tortilleria","descripcionCategoria":"Tortillerias"},{"idCategoria":"27","imagenCategoria":"ic_veterinaria","descripcionCategoria":"Veterinarias"},{"idCategoria":"18","imagenCategoria":"ic_vinateria","descripcionCategoria":"Vinaterías"},{"idCategoria":"26","imagenCategoria":"ic_zapateria","descripcionCategoria":"Zapaterías"}],"estado":1}
D/mainfragment﹕ desc categoria null

Ce sont mes règles de proguard

#GoogleMaps
-keep class * extends Java.util.ListResourceBundle {
    protected Object[][] getContents();
}

-keep public class com.google.Android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}

-keepnames @com.google.Android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @ccom.google.Android.gms.common.annotation.KeepName *;
}

-keepnames class * implements Android.os.Parcelable {
    public static final ** CREATOR;
}



#Volley?

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*


-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

-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();
 }


 -keepclasseswithmembernames class * {
     native <methods>;
 }


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


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


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

 -keepclassmembers class * extends Android.app.Activity {
    public void *(Android.view.View);
 }


 -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 *;
 }

 -keep class Android.support.v7.widget.SearchView
 -keep class Android.support.v7.widget.**{*;}
 -keep class Android.support.v4.app.** { *; }
 -keep interface Android.support.v4.app.** { *; }
 -keep class com.actionbarsherlock.** { *; }
 -keep interface com.actionbarsherlock.** { *; }
 -keep class com.Android.volley.** { *; }
 -keep interface com.Android.volley.** { *; }
 -keepattributes *Annotation*


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

# 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 Categorias.data.model.** { *; }
 -keep class Categorias.** { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.Android.model.** { *; }
-keep class com.puertosoft.appcomercialdelpuerto.Android.model.** { *; }
-keep class com.puertosoft.appcomercialdelpuerto.model.** { *; }
-keep class com.puertosoft.appcomercialdelpuerto.model.User { *; }

# Add the gson class
-keep public class com.google.gson

# Add any classes the interact with gson
-keep class com.puertosoft.appcomercialdelpuerto.models.ChatModel { *; }
-keep class com.puertosoft.appcomercialdelpuerto.models.FeedModel { *; }
-keep class com.puertosoft.appcomercialdelpuerto.Android.models.ChatModel { *; }
-keep class com.puertosoft.appcomercialdelpuerto.Android.models.FeedModel { *; }

-libraryjars /build/intermediates/pre-dexed/debug/gson-2.3-08958b96da94c86264ec30e35a9d524bac95d2df.jar




-printmapping outputfile.txt
-renamesourcefileattribute SourceFile
#-keepattributes SourceFile,LineNumberTable

Ceci est la classe affectée

public class Categorias {

    private String idCategoria;
    private String descripcionCategoria;
    private String imagenCategoria;

    public Categorias(String idCategoria, String descripcionCategoria, String imagenCategoria){
        this.idCategoria=idCategoria;
        this.descripcionCategoria=descripcionCategoria;
        this.imagenCategoria=imagenCategoria;
    }

    public String getIdCategoria(){
        return idCategoria;
    }

    public String getDescripcionCategoria(){
        return descripcionCategoria;
    }

    public String getImagenCategoria(){
        return imagenCategoria;
    }

}
24

Les noms de variables seront masqués avec proguard, vous laissant avec quelque chose comme

private String a;

Au lieu de

private String descripcionCategoria;

Vous pouvez ajouter des règles de proguard afin que certaines classes ne soient pas obscurcies. Je m'en suis sorti en utilisant ces derniers:

-keepattributes Signature
# POJOs used with GSON
# The variable names are JSON key values and should not be obfuscated
-keepclassmembers class com.example.apps.Android.Categorias { <fields>; }
# You can apply the rule to all the affected classes also
# -keepclassmembers class com.example.apps.Android.model.** { <fields>; }

Si votre nom de classe POJO est également utilisé pour l'analyse, vous devez également ajouter la règle

-keep class com.example.apps.Android.model.** { <fields>; }

Dans votre cas, les annotations ne sont pas utilisées, vous en aurez besoin si vous le faites

# Keep the annotations
-keepattributes *Annotation*

ne autre façon pour résoudre ce problème est d'utiliser l'annotation SerializedName et de laisser la classe être obscurcie. Pour cela, vous aurez toujours besoin du -keepattributes *Annotation* règle.

import com.google.gson.annotations.SerializedName

@SerializedName("descripcionCategoria")
private String descripcionCategoria;
59
Sebastian

Si vous voulez que vos modèles soient toujours obscurcis, utilisez l'annotation @SerializedName("name_of_json_field"). Il permettra à gson de connaître le vrai nom du champ.

Je crois que vous aurez également besoin

-keepattributes *Annotation*

pour garder vos annotations de l'obscurcissement

22
ar-g

Vous devez exclure le brouillage de vos classes de modèle comme ci-dessous où j'ai exclu toutes les classes de modèle dans le package in.intellicode.webservices. des modèles

-keep class in.intellicode.webservices.models.** { *; }
-keep class in.intellicode.models.** { *; }
-keep class in.intellicode.events.*{ *; }

-keepattributes Signature
-keepattributes *Annotation*
-keep class Sun.misc.Unsafe { *; }
14
Kirtan

Lorsque vous appliquez le script proguard à vos classes de modèle, il masque leurs noms et les noms de leurs propriétés. Donc, après obscurcissement de String descripcionCategoria; vous aurez quelque chose comme String aaaa;

Gson fonctionne à travers Java réflexion et il essaiera d'utiliser un nom de propriété lors de l'analyse des données. Ainsi, après avoir appliqué l'obscurcissement aux classes de modèle, vous ne pourrez pas analyser vos données.

Donc, excluez les classes de modèle de votre script proguard et vous pourrez à nouveau analyser.

3
Gennadii Saprykin