google的gson三方包混淆问题,附上通用proguard-rules.pro

Android开发中混淆后Gson序列化、反序列化的那些坑,零基础android入门 Android进阶学习全套手册Android对标阿里P7学习视频BATJ大厂Android高频面试题最后,借用我最喜欢的乔布斯语录,作为本文的结尾:人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。 阅读详情

碰到个头疼的问题,一个朋友项目混淆后打包编译出错,debug模式下正常。

断点模式下一步步检查发现:json解析以后数据放到javabean中去的,放进去的字符串是对的,解析出来的,但是javabean却是空,节操碎一地,多方查找原因后知道他项目json使用了google的gson三方包,于是猜想混淆的时候出了问题。

然后陪同一起查看混淆文本,一番下来基本的混淆文件都没问题,然后查找第三方包,
他说明明已经按照gson的官方文档,把混淆脚本加上去了,却还是出问题。

我后面又去查了次官方文档:google官方的proguard的文档如下,请大家一定要注意倒数第二行,class 后方到**签名的 这一段包名应该是你所有的java bean定义的目录,其实官方注释也写明了“Application classes that will be serialized/deserialized over Gson”(将通过Gson序列化/反序列化的应用程序类),通常我们cope后直接就用了没有去注意这个细节(lll¬ω¬),然后打包时Gson不能正常使用。ps:建议大家在写代码时把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.** { *; } ##这里包名需要改成自己的java bean包

##---------------End: proguard configuration for Gson  ----------

以上就是Gson混淆解决方法,记录下以免自己也犯同样错误。


当然写篇文章不可能就这么短,那么接下来整理下混淆相关知识

混淆过程会有如下几个功能:

  1. 压缩。移除无效的类、类成员、方法、属性等;
  2. 优化。分析和优化方法的二进制代码;根据proguard-android-optimize.txt中的描述,优化可能会造成一些潜在风险,不能保证在所有版本的Dalvik上都正常运行。
  3. 混淆。把类名、属性名、方法名替换为简短且无意义的名称;
  4. 预校验。添加预校验信息。这个预校验是作用在Java平台上的,Android平台上不需要这项功能,去掉之后还可以加快混淆速度。

这四个流程默认开启。在 Android 项目中我们可以选择将“优化”和“预校验”关闭,对应命令是-dontoptimize、-dontpreverify(当然,默认的 proguard-android.txt 文件已包含这两条混淆命令,不需要开发者额外配置)。

科普下混淆基本指令区指令的含义,也是查资料得到的了(^_^)

  • 代码混淆的压缩比例,值在0-7之间
    -optimizationpasses 5
  • 混淆后类名都为小写
    -dontusemixedcaseclassnames
  • 指定不去忽略非公共的库的类
    -dontskipnonpubliclibraryclasses
  • 指定不去忽略非公共的库的类的成员
    -dontskipnonpubliclibraryclassmembers
  • 不做预校验的操作
    -dontpreverify
  • 生成原类名和混淆后的类名的映射文件
    -verbose
    -printmapping proguardMapping.txt
  • 指定混淆是采用的算法
    -optimizations !code/simplification/cast,!field/,!class/merging/
  • 不混淆Annotation
    -keepattributes Annotation,InnerClasses
  • 不混淆泛型
    -keepattributes Signature
  • 抛出异常时保留代码行号
    -keepattributes SourceFile,LineNumberTable

以上可以了解,有兴趣的可以去调试下((lll¬ω¬)—>自己很多都没用过)

接下来介绍下比较常用的:

  • -keep 防止类和成员被移除或者被重命名
    • -keep class XXXX 保留类名不变,也就是类名不混淆,而类中的成员名不保证
  • -keepnames 防止类和成员被重命名
  • -keepclassmembers 防止成员被移除或者被重命名
  • -keepnames 防止成员被重命名
  • -keepclasseswithmembers 防止拥有该成员的类和成员被移除或者被重命名
    • -keepclasseswithmembers class XXXX保留类名和成员名。当然也可以是类中特定方法
  • -keepclasseswithmembernames 防止拥有该成员的类和成员被重命名

想要继续了解的可以参考以下几篇文章:

Android安全攻防战,反编译与混淆技术完全解析(下)
Android混淆从入门到精通
Android代码混淆之ProGuard

最后附上稍作整理的 proguard-rules.pro 文档,各位可以在此基础上更改或添加以用于自己项目

#指定代码的压缩级别
-optimizationpasses 5

#包明不混合大小写
-dontusemixedcaseclassnames

#不去忽略非公共的库类
-dontskipnonpubliclibraryclasses

 #优化  不优化输入的类文件
-dontoptimize

 #预校验
-dontpreverify

 #混淆时是否记录日志
-verbose

#保护注解
-keepattributes *Annotation*

# 保持哪些类不被混淆
-keep public class * extends android.app.Fragment
-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

#如果有引用v4包可以添加下面这行
-keep public class * extends android.support.v4.app.Fragment

#忽略警告
-ignorewarning

##记录生成的日志数据,gradle build时在本项目根目录输出##
#apk 包内所有 class 的内部结构
-dump proguard/class_files.txt
#未混淆的类和成员
-printseeds proguard/seeds.txt
#列出从 apk 中删除的代码
-printusage proguard/unused.txt
#混淆前后的映射
-printmapping proguard/mapping.txt
########记录生成的日志数据,gradle build时 在本项目根目录输出-end######

#如果引用了v4或者v7包
-dontwarn android.support.**

####混淆保护自己项目的部分代码以及引用的第三方jar包library-end####

#保持 native 方法不被混淆
-keepclasseswithmembernames class * {
    native <methods>;
}

#保持自定义控件类不被混淆
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

#保持自定义控件类不被混淆
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

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

#保持 Parcelable 不被混淆
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

#保持 Serializable 不被混淆
-keepnames class * implements java.io.Serializable

#保持 Serializable 不被混淆并且enum 类也不被混淆
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    !private <fields>;
    !private <methods>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

#保持枚举 enum 类不被混淆
-keepclassmembers enum * {
  public static **[] values();
  public static ** valueOf(java.lang.String);
}

-keepclassmembers class * {
    public void *ButtonClicked(android.view.View);
}

#不混淆资源类,保持R文件不被混淆,否则,你的反射是获取不到资源id的  
-keepclassmembers class **.R$* {
    public static <fields>;
}

#避免混淆泛型(不写可能会出现类型转换错误,一般情况把这个加上就是了,如果混淆报错建议关掉)
#-keepattributes Signature

#移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用,另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制,也可以自己写日志文件
#-assumenosideeffects class android.util.Log {
#    public static *** v(...);
#    public static *** i(...);
#    public static *** d(...);
#    public static *** w(...);
#    public static *** e(...);
#}

###############################  以上通用也可根据需求修改 ################################     
#####################################################################################



#####################################################################################
#########################  第三方包混淆选项,根据需求添加 ################################            

#一般查看官方文档都有

#####################################  第三方end #####################################
#####################################################################################




############# js互调的类,工程中没有直接跳过。#############

#一般你可以这样写
-keep class 你的类所在的包.** { *; }

#如果是内部类的话,你可以这样
-keepclasseswithmembers class 你的类所在的包.父类$子类 { <methods>; }

############# js互调的类end #############



# 如果使用了Gson之类的工具要使被它解析的JavaBean类即实体类不被混淆。
##---------------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.** { *; } ##这里包名需要改成自己的java bean包

##---------------End: proguard configuration for Gson  ----------


#如果在当前的application module或者依赖的library module中使用了第三方的库,并不需要显式添加规则
#-libraryjars xxx
#添加了反而有可能在打包的时候遭遇同一个jar多次被指定的错误,一般只需要添加忽略警告和保持某些class不被混淆的声明。
#以libaray的形式引用了开源项目,如果不想混淆 keep 掉,在引入的module的build.gradle中设置

如有错误请指正,十分感谢!


为了向别人、向世界证明自己而努力拼搏,而一旦你真的取得了成绩,才会明白:人无须向别人证明什么,只要你能超越自己。

Android开发中混淆后Gson序列化、反序列化的那些坑,安卓开发实战 Item 中增加了一个内部类 PageConfig。 这里敲黑板了: 1.Item 里面的字段、Item 里面引用到的类和 Item 里面的内部类 PageConfig 都需要实现序列化 (implements Serializable); 如果不是 implements Serializable 实现序列化,而是给每个字段加上 @SerializedName 注解,那么务必注意:Item 里面的字段、Item 里面引用到的类的和 Item 里面的内部类的字段都需要加上 @SerializedName 注 阅读详情

相关推荐

Android ProGuard混淆实战:从入门到精通,手把手教你配置proguard-rules.pro

本文详细介绍了Android ProGuard混淆的实战配置,从基础语法到高级技巧,手把手教你如何配置proguard-rules.pro文件。涵盖保留规则、JNI方法处理、第三方库集成及调试优化,帮助开发者全面提升应用安全性。

weixin_30314793的博客 484

gson容易混淆的几处

使用gson,后台如果返回类似:data:[]   伪代码: A为一个类  private List parseResultInfo(String jsonString) {         Gson gson = new Gson();         Type type = new TypeToken>() {         }.getType();         return

qice675563721的专栏 1847

安卓ProGuard/R8混淆规则详解与ClassNotFoundException解决方案

代码混淆作为移动应用安全加固的核心技术,通过名称替换和代码删减实现APK体积优化与反编译防护。其底层原理基于AST语法树分析与字节码转换,在编译流程中执行shrink、optimize、obfuscate三阶段处理。在安卓生态中,ProGuard和R8作为主流工具链组件,广泛应用于release构建流程。典型工程问题集中在反射调用、JNI交互等需要保留原始签名的场景,ClassNotFoundException往往源于混淆后名称映射失效。通过合理配置-keep规则和@Keep注解,开发者可以平衡安全性与功能

weixin_30383279的博客 382

android开发中混淆后Gson序列化、反序列化的那些坑

GSON的序列化与反序列化 GSON是一个很好的工具,使用它我们可以轻松的实现序列化和反序列化.但是当它一旦遇到混淆,就需要我们注意了. 一个简单的类Item,用来处理序列化和反序列化 public class Item { public String name; public int id; } 序列化的代码 Item toSerializeItem = new Item(); toSerializeItem.id = 2; toSerializeItem.name = "

Dream It Possible 4422

Python实战:如何用高德API批量获取POI数据(附完整代码)

本文详细介绍了如何使用Python通过高德API批量获取POI数据,包括API基础准备、核心功能模块设计、高级功能实现及实战应用案例。文章提供了完整代码示例,帮助开发者高效解决商业网点分析、公共设施规划等实际项目中的数据采集需求。

stem5的博客 318

四足机器人通用运动控制策略:强化学习与PD参数优化

运动控制是机器人实现稳定行走和复杂动作的核心技术,其关键在于精确调节关节的刚度和阻尼特性。PD控制器作为基础控制单元,通过比例(P)和微分(D)增益参数直接影响系统响应速度与稳定性。在四足机器人领域,强化学习(RL)通过模拟环境自主学习,能够有效解决传统控制方法难以适应不同形态机器人的痛点。该技术通过非对称Actor-Critic架构,结合状态估计网络和自适应参数采样策略,实现了跨平台的通用运动控制。典型应用包括工业检测、灾害救援等需要高适应性移动能力的场景,其中PD增益优化和形态参数自适应采样成为提升硬件

weixin_30307921的博客 298

Android开发中混淆后Gson序列化、反序列化的那些坑

其实很简单就下面这张图,含概了Android所有需要学的知识点,一共8大板块:架构师筑基必备技能Android框架体系架构(高级UI+FrameWork源码)360°Androidapp全方位性能调优设计思想解读开源框架NDK模块开发移动架构师专题项目实战环节移动架构师不可不学习微信小程序混合开发的flutterAndroid学习的资料我呢,把上面八大板块的分支都系统的做了一份学习系统的资料和视频,大概就下面这些,我就不全部写出来了,不然太长了影响大家的阅读。

m0_55030688的博客 818

SAP入门技术分享四:模块化程序

SAP入门技术分享三:模块化程序

ITxiaoangzai的博客 1152

google gson 使用proguard混淆代码注意事项

这里不介绍怎样开启代码混淆功能。具体方法可以参照: http://developer.android.com/tools/help/proguard.html http://proguard.sourceforge.net/#manual/usage.html 主要介绍混淆使用 google gson的代码的时候需要注意的问题和解决方法。 在使用Android Studio

yuxiaohui78的专栏 1万+

UE5高斯泼溅落地全链路:从PLY导入到实时渲染的工程实践

3D高斯泼溅(3D Gaussian Splatting)正从NeRF后处理技术演进为新一代隐式几何渲染范式,其核心在于以可微椭球体替代传统三角面片,通过协方差矩阵与球谐系数实现高质量体素化渲染。该技术突破点云精度瓶颈,但与UE5现有资产管线存在根本性不兼容——静态网格导入器无法解析scale/rot/sh系数等非标顶点语义,标准光栅化管线亦无法执行高斯核采样计算。XV3DGS-UEPlugin通过自定义资产类型、StructuredBuffer GPU数据流与专用材质节点,将高斯泼溅重构为可编辑、可LOD

weixin_33692177的博客 356

【数据集】全球陆地表面反照率Albedo

【数据集】全球陆地表面反照率Albedo

WW、forever的博客 1453

别再乱写proguard-rules.pro了!Android混淆保活Gson、EventBus、OkHttp的保姆级配置清单

本文提供Android开发中Gson、EventBus和OkHttp三大主流库的ProGuard混淆配置全攻略,解决因混淆导致的网络请求失效、数据解析异常等问题。包含可直接复用的配置模板、诊断命令和验证技巧,帮助开发者精准保活关键功能,避免发布后的运行时错误。

weixin_30315435的博客 395

Python白色飘雪(完整代码)

Python绘制白色飘雪动画的完整代码。

AIGC 3万+

如何为GSON、Jackson等JSON库配置ProGuard:android-proguard-snippets最佳实践

在Android应用开发中,ProGuard代码混淆是发布版本的重要步骤,它能有效保护代码安全并减小应用体积。然而,为JSON库配置ProGuard往往让开发者头疼不已。今天,我将分享如何使用android-proguard-snippets项目为GSON、Jackson等主流JSON库配置ProGuard,让你的应用既安全又稳定!🚀 ## 为什么JSON库需要特殊ProGuard配置? J

gitblog_00678的博客 365

【PINN物理信息网络】基于PINN物理信息网络求解圆柱坐标中的热方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解圆柱坐标中的热方程(python)

k8291121的博客 2271

mbedtls | 01 - 移植mbedtls库到STM32的两种方法

一、mbedtls 开源库 1. mbedtls是什么 Mbed TLS是一个开源、可移植、易于使用、代码可读性高的SSL库。可实现加密原语,X.509证书操作以及SSL / TLS和 DTLS 协议,它的代码占用空间小,非常适合用于嵌入式系统。 mbedtls遵循 Apache 2.0 开源许可协议,目前由 TrustedFirmware 维护(Linaro主持的一个治理开放社区项目),在Github上已收获 2.6k star,目前Github上发布的最新版本为 2.24.0 版本,开源仓库地址为:

Mculover666的博客(嵌入式) 1万+

DataHub 数据血缘全景指南:查看、编辑与摄取血缘的完整实践

本文基于 DataHub 官方的血缘功能指南([lineage.md](https://link.gitcode.com/i/70cd67e1142a92e0d2732a48a6ffa4fb)),系统讲解 DataHub 数据血缘的查看方式(Lineage 可视化、列级血缘、数据管道血缘)、三种建立血缘的途径(摄取源自动提取、UI 手动编辑、API 编程写入),并结合开源仓库源码剖析 `incre

gitblog_00246的博客 496

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android代码混淆实战:ProGuard配置与优化技巧

代码混淆是Android应用安全加固的核心技术,通过重命名类名、方法名等标识符,有效防止反编译和逆向工程。ProGuard作为官方推荐工具,集成了代码压缩、优化和混淆功能,能显著减小APK体积并提升安全性。在工程实践中,合理的ProGuard配置可解决第三方库兼容性、资源ID冲突等典型问题,特别适用于金融、电商等对安全性要求较高的应用场景。通过结合mapping文件管理和CI/CD集成,可以构建持续可靠的混淆体系。本文以电商App优化案例为基础,详解如何通过-keep规则保留关键类,使用增量混淆提升大型项目

weixin_33747129的博客 407

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

终极Android混淆配置清单:使用android-proguard-snippets保护你的应用

你是否正在为Android应用的混淆配置而烦恼?😫 想要保护你的应用代码,却不知道如何为各种第三方库配置正确的ProGuard规则?别担心!android-proguard-snippets项目为你提供了完整的解决方案!这个开源项目收集了众多常用Android库的ProGuard配置片段,让你的混淆配置变得简单而高效。 ## 🔍 什么是android-proguard-snippets?

gitblog_01004的博客 584

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

为什么你的Android应用会崩溃?android-proguard-snippets帮你解决混淆问题

Android应用崩溃是开发者最头疼的问题之一,而ProGuard混淆配置错误往往是罪魁祸首。**android-proguard-snippets**提供了一套完整的Android库ProGuard配置方案,帮助开发者轻松解决因混淆导致的应用崩溃、功能异常等问题,让你的应用在发布时保持最佳性能和稳定性。 ## 什么是ProGuard混淆?为什么它会导致应用崩溃? ProGuard是Andro

gitblog_00514的博客 243

Android ProGuard Snippets:Retrofit、OkHttp等网络库混淆配置详解

在Android应用开发中,**ProGuard混淆配置**是发布版本优化的关键步骤。然而,为各种第三方库配置正确的混淆规则常常让开发者头疼不已。Android ProGuard Snippets项目正是为了解决这一痛点而生!这个开源项目收集了**Retrofit、OkHttp、Gson**等主流Android库的精确混淆配置,让你轻松实现代码优化而不必担心兼容性问题。 ## 📱 什么是And

gitblog_00630的博客 239

别再乱写proguard-rules.pro了!Android混淆避坑指南与最佳实践(附完整配置清单)

本文深入解析Android混淆规则,提供ProGuard配置的避坑指南与最佳实践。从反射调用、数据模型类保护到第三方库集成,详细讲解如何正确编写proguard-rules.pro文件,并分享模块化配置方案与高级调试技巧,帮助开发者避免常见混淆陷阱。

weixin_30314813的博客 483

Android代码混淆实战:ProGuard与R8配置详解

代码混淆是移动应用安全的重要技术,通过对字节码进行名称替换和结构优化,能有效防止反编译导致的源码泄露。在Android开发中,ProGuard作为官方工具链组件,提供代码压缩、优化和混淆三位一体的保护机制,配合Gradle构建系统可实现自动化处理。随着R8编译器的推出,开发者能获得更快的编译速度和更小的APK体积。实际工程中需要特别注意第三方库兼容性、反射调用处理等场景,通过合理配置-keep规则保留关键类成员。典型应用场景包括商业级APP发布、SDK开发等对代码安全性要求较高的领域,能有效防范逆向工程和功

weixin_34005042的博客 715

如何快速配置Android ProGuard:android-proguard-snippets完全指南

在Android应用开发中,ProGuard是保护代码安全和减小APK体积的重要工具。**android-proguard-snippets**项目提供了针对常见Android库的ProGuard配置模板,帮助开发者快速实现混淆配置,避免因错误配置导致的运行时异常。本文将详细介绍如何使用这个开源项目,让你的Android应用混淆配置变得简单高效。 ## 📋 什么是android-proguar

gitblog_01160的博客 230

10个常见Android库的ProGuard配置技巧:android-proguard-snippets实战教程

想要为Android应用进行代码混淆,却总是遇到各种库的兼容性问题?ProGuard配置是Android开发中必不可少的一环,但面对众多第三方库时,配置起来往往令人头疼。android-proguard-snippets项目为你提供了完整的解决方案,这个开源项目收集了超过70个常见Android库的ProGuard配置片段,让你的混淆配置变得简单高效。 ## 为什么需要专门的ProGuard配置

gitblog_00078的博客 253
上一篇: Kotlin学习系列----类和继承,补充? ?: ?. !!符号
下一篇: 个人中心--圆形头像--拍照--裁剪
皮小智
博客等级 码龄10年 56粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值