2015-08-05 4 views
12

Мой код отлично работает без защиты, но GSON не работает, когда включена функция proguard.Использование GSON с защитой proguard

Это часть кода, где она не работает журнал печатает

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

mainfragment в нуль

# 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 

Это мои правила 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 

Это пораженной класс

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

} 

ответ

28

Как Gennadii говорит, имена переменных затемненные, оставив вас с

private String a; 

Вместо

private String descripcionCategoria; 

Я сходил с его помощью этих правил

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

Если имя класса POJO также используются для анализа, то вы должны также добавить правило

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

В вашем случае, аннотации не являются используется, вам понадобится это, если вы сделаете это

# Keep the annotations 
-keepattributes *Annotation* 
+0

Аналогичного [вопрос] (http://stackoverflow.com/questions/23826171/proguard-for- Android-и-gson) –

3

Когда вы применяете скрипт proguard к классам модели, он обфускает их имена и имена их свойств. Поэтому после обфускации String descripcionCategoria; у вас будет что-то вроде String aaaa;

Gson работает через java-отражение, и он попытается использовать имя свойства при анализе данных. Таким образом, после применения обфускации к классам модели вы не сможете анализировать свои данные.

Итак, исключите классы моделей из вашего скрипта proguard, и вы сможете снова разобрать.

8

Вы должны исключить запутывание ваших модели классов, как показано ниже, где я исключил все классы модели в пакете in.intellicode.webservices.models

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

Если вы хотите, чтобы ваши модели все еще запутывались, используйте аннотация @SerializedName("name_of_json_field"). Это позволит gson знать настоящее имя поля.

Я считаю, что вы также будете нуждаться в

-keepattributes *Annotation*

держать аннотации от запутывания

Смежные вопросы