如何在ProGuard中保留JedisPubSub抽象类以避免代码丢失
解决ProGuard混淆JedisPubSub匿名内部类逻辑丢失的问题
你的问题核心是ProGuard误删了继承自JedisPubSub的匿名内部类的重写方法,并且将该匿名类混淆成了Object,之前的配置仅保留了JedisPubSu父类本身,没有覆盖到子类(你的匿名内部类)的方法保留规则。
正确的ProGuard配置方案
添加以下规则到你的proguard.cfg文件中:
# 保留JedisPubSu父类的所有公共/保护方法,确保回调接口结构完整 -keep class redis.clients.jedis.JedisPubSub { public protected *; } # 关键规则:保留所有继承自JedisPubSub的类(包括你的匿名内部类)及其重写方法 # 防止子类被混淆成Object,同时避免重写的onMessage等方法被删除 -keep class * extends redis.clients.jedis.JedisPubSub { public protected *; } # 可选:如果你的匿名内部类引用了外部类的成员(比如示例中的this),需保留外部类对应成员 # 替换your.package.YourOuterClass为实际的外部类全限定名 -keepclassmembers class your.package.YourOuterClass { public protected *; }
配置说明
- 第一条规则:确保JedisPubSu父类的方法结构不被混淆或删除,为子类提供正确的继承基础。
- 第二条规则:这是解决问题的核心,它覆盖了所有继承自JedisPubSub的子类(包括你编写的匿名内部类),强制ProGuard保留这些类的结构以及它们的公共/保护方法,这样
onMessage方法就不会被误删,匿名类也不会被混淆成Object。 - 第三条规则:如果你的匿名内部类依赖外部类的变量或方法(比如示例代码中的
this),需要保留外部类的对应成员,避免混淆后出现引用缺失的问题。
配置完成后重新执行混淆,你的subscribe方法内的匿名内部类结构和onMessage方法逻辑会被完整保留。
内容的提问来源于stack exchange,提问作者remme
相关产品推荐
相关产品推荐

