关键是要用-keep精准保留被反射、序列化、框架回调或外部调用依赖的方法,如onCreate、writeObject、无参构造器等,否则会引发NoSuchMethodException或ClassNotFoundException;需按Android生命周期、Serializable、JSON库等约定配置对应规则。

关键不是“不擦除”,而是让混淆工具明确知道哪些方法必须保留——尤其当它们被反射、序列化、框架回调或外部调用依赖时。一旦这些标准方法(如 onCreate、writeObject、toString、自定义事件回调、JSON反序列化所需的无参构造等)被裁剪或重命名,就会直接触发 NoSuchMethodException、ClassNotFoundException 或运行时逻辑中断。
识别哪些方法属于“标准方法”
这类方法通常不靠显式调用,而是由系统或框架按约定自动触发:
- Android 四大组件生命周期方法:如
Activity.onCreate(Bundle)、Fragment.onViewCreated、Service.onStartCommand - 序列化相关方法:如
readObject、writeObject、serialPersistentFields,以及实现了Serializable的类的无参构造器 - JSON 库(如 Newtonsoft.Json、System.Text.Json)要求的成员:如属性 getter/setter、带参数/无参构造函数、
[JsonProperty]标记的方法 - WPF/UWP/XAML 绑定依赖的 public 属性和 INotifyPropertyChanged 实现
- ASP.NET Core MVC/WebAPI 中通过反射绑定的 Action 参数、ModelBinder 构造函数、
IActionResult子类的 public 方法
ProGuard / R8 配置要点
适用于 Android 和 Java 项目,核心是用 -keep 精准锁定签名:
- 保留整个生命周期类及其所有成员:
-keep public class * extends android.app.Activity { *; }-keep public class * extends androidx.fragment.app.Fragment { *; } - 只保留特定方法签名(更轻量):
-keepclassmembers class * { public void onCreate(android.os.Bundle); } - 保留 JSON 可序列化类的构造与访问器:
-keepclassmembers class * implements java.io.Serializable { public static final long serialVersionUID; private static final java.io.ObjectStreamField[] serialPersistentFields; private void writeObject(java.io.ObjectOutputStream); private void readObject(java.io.ObjectInputStream); java.lang.Object writeReplace(); java.lang.Object readResolve(); } - 避免误删注解驱动的方法:
-keepclassmembers class * { @com.google.gson.annotations.SerializedName <fields>; @androidx.annotation.Keep <methods>; }
Dotfuscator 配置关键项
针对 .NET 程序集,尤其在启用 Trimming 时需主动声明“保留点”:
- 在
.dcproj的<Obfuscation>节点中添加<Keep>规则:<Keep Name="OnCreate" Signature="void (Android.OS.Bundle)" /><Keep Name="get_.*" Signature=".* ()" />(正则匹配所有 getter) - 对反射高频类(如
JsonConvert使用的 DTO)使用<KeepClass Name="MyApp.Models.User" />,并设Preserve="true" - 务必关闭
DisableRenaming(即设为 Yes)——否则即使保留了,重命名后接口调用仍会失败,如你提到的STBRefleshWebApi.dll场景 - 若使用 SDK 风格项目,在 MSBuild 中注入规则:
<DotfuscatorKeep Include="MyApp.Api.Controllers.*" />
通用避坑建议
不靠猜,靠验证:
- 生成 mapping 文件(ProGuard 的
mapping.txt,Dotfuscator 的renaming.xml),搜索关键类名或方法名,确认是否出现在“保留列表”中 - 对发布包做最小路径测试:启动 App → 进入含反射/序列化的页面 → 执行网络请求/本地存储 → 触发权限/广播回调
- 禁用混淆后能跑通,开启后报错?优先检查
-dontwarn是否掩盖了真正该-keep的项;-dontwarn是临时止痛,不是解决方案 - 第三方库务必查官方文档——如 AppIntro 明确要求
-keep class com.github.appintro.** { *; },Newtonsoft.Json 推荐保留DefaultContractResolver相关类型

















