如何强制ProGuard混淆指定包下所有类名及成员(除保留类)
ProGuard配置:默认混淆指定包下所有类及成员(仅排除指定类)
核心配置思路
要实现默认混淆目标包下所有类的类名和成员,关键是明确排除需要保留的类,同时关闭对目标包类及成员的默认保留规则,开启类名与成员混淆的必要选项。
具体配置步骤
- 排除需要保留的类
通过-keep规则指定不需要混淆的类/子包,其余类默认进入混淆流程:
# 替换为你需要排除的类或子包,例如不需要混淆的工具类、对外接口类 -keep class com.package.excluded.** { *; }
- 关闭目标包的类名保留
确保ProGuard不会保留目标包下类的原始名称:
# 不保留com.package包下所有类的原始类名 -dontkeepnames class com.package.**
- 确保成员被混淆
不对目标包下的类成员设置任何保留规则,默认就会混淆所有成员:
# 不对com.package包下类的成员做保留,默认混淆所有字段、方法 -keepclassmembers class com.package.** { }
- 开启类名混淆的必要选项
添加这些选项确保混淆后的类名合法、唯一,且代码可正常执行:
# 可选:将混淆后的类合并到根包(空字符串)或指定包,不写则保留原包结构 -repackageclasses '' # 允许修改类成员的访问修饰符,避免混淆后出现访问权限问题 -allowaccessmodification # 确保每个类成员的混淆名称唯一 -useuniqueclassmembernames # 可选:自定义混淆标识符文件,比如用a、b、c等短字符命名,需提前创建proguard-obfuscation.txt文件 -obfuscationdictionary proguard-obfuscation.txt
完整配置示例
# 通用优化配置 -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 排除需保留的类 -keep class com.package.excluded.** { *; } # 混淆目标包下所有类及成员 -dontkeepnames class com.package.** -keepclassmembers class com.package.** { } # 类名混淆相关配置 -repackageclasses '' -allowaccessmodification -useuniqueclassmembernames -obfuscationdictionary proguard-obfuscation.txt
验证方法
混淆完成后,查看生成的mapping.txt文件,确认com.package下非排除的类名已被替换(如AdvisorReport2变为AA),类成员也被替换为短标识符(如id变为a)。
内容的提问来源于stack exchange,提问作者Tapa Save
相关产品推荐
相关产品推荐

