anroid 使用 Gson 混淆 遇到的bug 总结

news/2025/3/3 20:18:17/
使用Gson了的,在发布包时,如果需要对包进行混淆,那么必须加入如下配置
这里有一点比较坑爹,从google android_proguard_example 的proguard.cfg上考下来的文件必须做一定的修改:


##---------------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  ----------
 
 
这是google官方的proguard的文档,请注意倒数第二行,class 后方到**签名的 这一段包名应该是你所有的java bean 定义的目录(所以自己在写代码时,应该把java  bean 单独放在一个包中)。
 
另外附上,
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

转载:http://blog.sina.com.cn/s/blog_4e1e357d0101ednf.html




解决android使用gson解析json字符串,并使用混淆编译方式打包apk遇到的问题
方法一:
Gson gson = new Gson();
// 将json格式字符串转化为List<对象>
Type listType = new TypeToken<ArrayList<PersonMsgMini>>(){}.getType();
personMsgList = gson.fromJson(jsonObject.getString("list"), listType);
方法二:
public class AttendanceMsgGson
{
//字段名要跟json字符串中的key一致
private ArrayList<AttendanceMsg> list;
public ArrayList<AttendanceMsg> getList()
{
return list;
}
public void setList(ArrayList<AttendanceMsg> list)
{
this.list = list;
}
}
Gson gson = new Gson();
AttendanceMsgGson attGson = gson.fromJson(result, AttendanceMsgGson.class);
下面是重点:
说明:
其中两种gson解析json字符串的方法都没有问题,问题主要是使用了混淆编译的方式进行apk打包(其中不混淆编译进行apk打包则一切正常),因为客户端代码中的 JavaBean(实体类)的字段名称必须与服务端返回json字符串中的key要一致,才能进行解析,而混淆编
译之后,客户端代码中的JavaBean(实体类)的类名与其字段名称全部变成了a、b、c、d等等字符串,这与服务端返回的json字符串中的key不一致,导致解析失败。所以,解决的办法是:在进行混淆编译进行打包apk的时候,过滤掉存放所有JavaBean(实体类)的包不进行混淆编译。经过测试,一切正常。
在proguard.cfg文件中添加:
# removes such information by default, so configure it to keep all of it. 
-keepattributes Signature 
# 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.** { *; }
//这句非常重要,主要是滤掉 com.bgb.scan.model包下的所有.class文件不进行混淆编译
-keep class com.bgb.scan.model.** {*;}

http://www.ppmy.cn/news/419342.html

相关文章

anroid 使用 Gson 混淆 遇到的bug

http://blog.sina.com.cn/s/blog_4e1e357d0101ednf.html

volley混淆之后报错与gson混淆解决

有个项目的部分请求是volley&#xff0c;混淆之后发现&#xff0c;有返回数据&#xff0c;但是请求失败&#xff0c;后来发现是返回数据gson的解析失败&#xff0c;然后去查了一下gson的混淆&#xff0c;这里分享一下 ##---------------Begin: proguard configuration for Gson…

代码混淆 GSON完满解决

头疼的问题&#xff0c;json使用了google的gson三方包&#xff0c;可是混淆的时候出了问题 明明已经按照gson的官方文档&#xff0c;把混淆脚本加上去了&#xff0c;却还是出问题。 今天同事找到一篇博客&#xff0c;关于这个问题的&#xff1a; 我们是将json解析以后放到jav…

N63044-第九周

十七、域名系统 DNS服务 1、名称解析服务和DNS服务实现原理(88分钟) 2、dns服务基础配置实现互联网访问(79分钟) 3、实现正向解析dns服务(57分钟) 4、实现反向DNS解析和从DNS服务器(59分钟) 5、实现子域委派和转发查询(47分钟) 6、GSLB和CDN服务工作原理(50分钟) 十八、Linux防…

React插件ES7+ React/Redux/React-Native snippets的安装与使用

二 、React插件的安装与使用 Vscode插件市场安装ES7 React/Redux/React-Native snippets 1. Basic Methods PrefixMethodimp→import moduleName from moduleimn→import moduleimd→import { destructuredModule } from moduleime→import * as alias from moduleima→import…

01_04_快速排序(Quick Sort)

快速排序&#xff08;Quick Sort&#xff09; 快速排序&#xff08;Quick Sort&#xff09;介绍&#xff1a; 是一种常用的排序算法&#xff0c;它采用分治的策略来对待排序的序列进行排序。快速排序的基本思想是选择一个基准元素&#xff0c;通过一趟排序将序列分割成两个子…

Ubuntu下的自启动(Service启动)

在Ubuntu中设置Python3命令开机自启需要创建一个systemd service文件&#xff0c;步骤如下&#xff1a; 使用任一文本编辑器&#xff0c;打开一个终端窗口。 在终端中输入以下命令&#xff0c;创建一个.service文件&#xff1a; sudo vim /etc/systemd/system/my_script.ser…

基于Java Web的墓地管理系统的设计与实现+第五稿+文档

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 基于Java Web的墓地管理系统的设计与实现第五稿文档 视频演示 视频去哪了呢&#xff1f;_哔哩哔哩_bilibili 系统介绍 3.3 角色分析 本系统一共分为…