Gson混淆规则,引发某个module所有类名都被混淆了,但是依旧保留包的路径信息

问题描述

最近改sdk,发现我整个模块都参与了混淆,里面所有的类,都已经变成不规则的名字了,但是整个包的路径依旧还在。

一个Bug发现的问题

服务器说收不到基础参数信息,比如userId,token,我们的基础参数,都由一个BaseModel去接收,然后将model转map,然后再转json,最后传递给服务器

class BaseModel( 
    @SerializedName("userId")
    var userId: String = "",
    @SerializedName("token")
    var token: String = ""
)

我在测试中发现,如果我在最后请求服务器的时候,先去打印userId信息,形如

BaseModel baseModel = new BaseModel();
baseModel.setUserId("");
baseModel.setToken("");
Log.d("Tag",baseModel.getUserId());//打印信息
String jsonStr = new GsonBuilder().create().toJson(baseModel);

服务器竟然就能收到userId的参数信息,但是无法收到token信息,从此我怀疑是打release的时候,get被移除了


image.png

当时想的是,更新一下版本就可以了吧

更新Gson版本

目前使用的Gson版本是2.10.1,使用的混淆规则为

-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.** { *; }
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

更新到2.11.0版本,使用最新版的混淆规则

##---------------Begin: proguard configuration for Gson   gxx ----------
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-dontwarn sun.misc.**
-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}
# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.
-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken
##---------------END: proguard configuration for Gson   gxx ----------

而且2.11.0开始,gson会自动配置混淆,gson.pro文件混淆规则

image.png

使用到最新的版本后,问题就出现了,我的模块 com.gxx.http这路径下面的所有文件都参与了混淆,文件信息都被混淆了,但是路径依旧保留的是com.gxx.http,没有参与到混淆,从这里,我就感觉到时混淆配置文件出了问题,
最终,我从这里发现了端倪

-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

我的源代码里面,有使用TypeToken,再结合上面最新版本的Gson v2.11.0混淆配置信息

  private fun checkUserMap(): MutableMap<String, String> {
        if (userMap == null) {
            val typeToken: TypeToken<MutableMap<String, String>> = object : TypeToken<MutableMap<String, String>>() {}
            userMap = GsonUtils.fromJson(JSON, typeToken.type)
        }
        return userMap!!
    }

再来看看,反编译


image.png
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

1、-keep:指示 ProGuard 保持指定的类及其成员不被混淆或删除。也就是说,TypeToken 类将不会被移除或改变其名称。
2、allowobfuscation:允许该类在混淆过程中被混淆。这意味着 TypeToken 类的名称可以被修改,但其结构和功能保持不变。
3、allowshrinking:允许在最终构建中删除未使用的代码。如果 TypeToken 不再被引用,其声明仍然会被允许删除,前提是其他部分的代码不依赖于它。

我大概可以知道,如果要全部都参与到混淆里面(包括包名),那么需要所有的类+属性+静态内部类,不能有任何一个满足以上混淆配置条件的才行

解决方案

1、回退到2.10.1版本

configurations.all {
        resolutionStrategy.eachDependency { DependencyResolveDetails details ->
            def requested = details.requested
            if(requested.group == "com.google.code.gson" && requested.name == "gson"){
                details.useVersion("2.10.1")
            }
        }
    }

2、使用如下混淆规则

##---------------Begin: proguard configuration for Gson   gxx ----------
-keepattributes Signature
-keepattributes *Annotation*
-dontwarn sun.misc.**
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
#gxx 防止使用了@SerializedName注解后,参数被移除问题
-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}
##---------------END: proguard configuration for Gson   gxx ----------
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容