混淆Gson导致无法解析JSON
2016-10-28 本文已影响4710人
IT枫
1.使用Google的Gson解析Jason,需要引入gson-2.24.jar
引入方式修改gradle.build文件
dependencies {
compile 'com.google.code.gson:gson:2.2.4'
}
编译过程会下载该jar到External Libraries
gson-2.2.4
开启混淆模式2.gradle.build release开启混淆
配置不混淆jar配置3.配置混淆文件proguard-rules.pro
打包没问题,运行程序,Gson不能正常使用,Debug模式没问题的,估计混淆的关系
查找原因
这是google官方的proguard的文档,请注意倒数第二行,class 后方到**签名的 这一段包名应该是你所有的java bean 定义的目录(所以自己在写代码时,应该把java bean 单独放在一个包中)。
##---------------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 ----------
另外附上,
1.Serializable 的配置
# 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();
}
-keep public class * implements java.io.Serializable {*;}
2.可以在proguard中 强制使所有混淆失效
-dontobfuscate
-dontoptimize
-keep class com.google.gson.examples.android.model.** { *; }这里就是你定义的要解析的对象所在的包名
我程序中定义对象的包名为:com.jishang.yunji.dao.model
解决混淆完整配置
完整配置