我发现似乎有两种通用解决方案:
- 不要混淆通过反射 API 引用的内容 [ Retroguard , Jobfuscate ]
- 用混淆名称替换反射 API 调用中的字符串。
这些解决方案仅适用于同一项目中的调用——客户端代码(在另一个项目中)可能不使用反射 API 来访问非公共 API 方法。
在 2 的情况下,它也仅在反射 API 与编译时已知的字符串一起使用时才有效(私有方法测试?)。在这些情况下,dp4j还提供了一种在混淆后注入反射代码的解决方案。
阅读Proguard 常见问题解答时,我想知道 2 是否总是有效,当它说:
ProGuard 会自动处理 Class.forName("SomeClass") 和 SomeClass.class 等结构。引用的类在收缩阶段被保留,字符串参数在混淆阶段被正确替换。
使用可变字符串参数,通常无法确定它们的可能值。
问:粗体字是什么意思?有什么例子吗?