YGuard <keep>标签多class配置失效,指定子包类仍被混淆
解决YGuard 规则无法匹配子包类的问题
核心问题
你配置的com.example.protocol.*仅匹配com.example.protocol包下的直接类,无法匹配该包下的子包(比如com.example.protocol.inner)中的类,这就是子包类依然被混淆的原因。
修复方案
1. 用双通配符匹配所有子包层级
YGuard的patternset支持**通配符,可匹配当前包及所有嵌套子包的类,修改include的name配置:
<include name="com.example.protocol.**"/>
2. 完善标签的保留规则
如果需要完整保留这些类的名称、方法和字段,需给
<keep> <class classes="protected" methods="protected" fields="protected"> </class> <!-- 修正后的子包保留规则 --> <class classes="*" methods="*" fields="*"> <patternset> <include name="com.example.protocol.**"/> </patternset> </class> </keep>
classes="*":保留匹配类的完整类名,不被混淆methods="*":保留类的所有方法fields="*":保留类的所有字段
你可以根据实际API需求调整这些属性(比如改成public仅保留公共成员)。
3. 检查规则顺序与冲突
- YGuard的规则执行顺序会影响结果,确保
<keep>规则放在<rename>规则之前,先定义要保留的内容再执行混淆操作 - 排查是否有其他
<patternset>的<exclude>规则意外排除了这些子包类
验证方法
混淆完成后,反编译输出的JAR包,检查com.example.protocol及其子包下的类名、方法名是否未被混淆,以此确认规则生效。
内容的提问来源于stack exchange,提问作者Androiduser14919 Starters
相关产品推荐
相关产品推荐

