ProGuard混淆配置:全项目各模块路径下model类的保留方法
原规则的实际生效范围判断
你写的配置没法完全实现跨模块所有model包类不混淆的预期效果,虽然核心匹配逻辑方向是对的,但存在会导致规则失效、范围失控的细节问题。
原规则的匹配逻辑拆解
你写的原始配置:
-keep class **.model.**{ *; }
从ProGuard通配符的设计逻辑来看,这套写法本来就是为了覆盖多模块分散存储的model目录设计的:
- 规则开头的
**可以匹配任意层级的前置包路径,不管你的model文件夹是直接放在类路径根目录下,还是嵌套在com.app.module.home、com.app.module.user等不同业务模块的任意层级里,只要包结构里存在一个独立的、名字叫model的包段,不管前置路径有多少层都能被识别匹配 - 规则中
.model.**部分的后置**,可以匹配model包下的任意层级子包,也能匹配直接放在model包根目录下的类——ProGuard的**通配符本身支持匹配单段类名,不会出现“漏掉model包根目录下直接存放的类”的常见误区 - 大括号内的
*;配置,代表对匹配到的类,保留全部字段、方法、内部类等成员,不对这些成员做重命名、移除处理
无法达到预期的具体问题
- 存在无差别误匹配
规则只靠包段名做匹配,不区分包的实际用途。只要项目任意位置存在独立命名为model的包段,包内的所有类都会被强制保留。比如工具包路径com.app.util.model.JsonConverter,虽然根本不是需要保护的POJO数据目录,也会被这条规则强制keep,平白增加混淆后的包体积。 - 存在格式导致的解析失效风险
规则里的类匹配段和大括号之间没有加空格分隔,虽然多数新版构建插件可以正常解析,但低版本ProGuard、AGP插件会出现解析截断,直接导致整条规则不生效;加上成员块没有统一缩进,后续维护时容易出现符号写错、规则被意外删除的问题,进一步降低规则可靠性。
可稳定生效的优化配置
针对分散在各模块的model目录保护需求,调整后的可直接使用的配置如下:
# 补充分隔空格修复解析问题,统一代码块缩进 -keep class **.model.** { *; }
如果需要减少误匹配范围,可以在规则基础上补充排除配置,跳过model包下不需要保护的非POJO类。
内容的提问来源于stack exchange,提问作者Android Developer
相关产品推荐
相关产品推荐

