如何使用 Proguard 或其他工具删除未使用的重写 toString() 方法?
How to remove unused overridden toString() methods with Proguard or other tools?
我的 Android 项目和我的 Java 应用程序服务器项目中都有一些共享代码。在服务器项目中,我覆盖了一些 toString()
日志记录方法,这些方法在 Android 项目中不需要。然后我用 ProGuard 优化了我的 Android 项目中的代码。但是当我反编译生成的APK的classes.dex时,toString()
方法仍然存在。如果我不删除它们,它可能会保留为易于逆向工程的缺陷。
我试过 -assumenosideeffects
选项,但它不起作用。有没有办法通过编辑 ProGuard 配置或 Android 项目配置来删除这些 toString()
方法?
没有。 Proguard 不会删除引用它的代码。
您最好的选择是 "force" 编译器删除以下行:
使用 BuildConfig.DEBUG 或自定义常量并将调用包装在其中。
如果编译器找到计算结果为 false 的常量表达式,它可能会丢弃嵌套代码。
没有简单的用法检测,任何 Object.toString 都可以调用您的 class' toString。
用您自己的编译时注释标记每一个有启发性的 toString
,例如
@DevelopOnly
@Override
public String toString() { ...
然后使用注释处理器 (apt) 删除方法。
那里有很多很好的例子。
收集 AbstractProcessor 中的 classes 并使用 ASM 或其他库删除这些方法。
我的 Android 项目和我的 Java 应用程序服务器项目中都有一些共享代码。在服务器项目中,我覆盖了一些 toString()
日志记录方法,这些方法在 Android 项目中不需要。然后我用 ProGuard 优化了我的 Android 项目中的代码。但是当我反编译生成的APK的classes.dex时,toString()
方法仍然存在。如果我不删除它们,它可能会保留为易于逆向工程的缺陷。
我试过 -assumenosideeffects
选项,但它不起作用。有没有办法通过编辑 ProGuard 配置或 Android 项目配置来删除这些 toString()
方法?
没有。 Proguard 不会删除引用它的代码。
您最好的选择是 "force" 编译器删除以下行: 使用 BuildConfig.DEBUG 或自定义常量并将调用包装在其中。
如果编译器找到计算结果为 false 的常量表达式,它可能会丢弃嵌套代码。
没有简单的用法检测,任何 Object.toString 都可以调用您的 class' toString。
用您自己的编译时注释标记每一个有启发性的 toString
,例如
@DevelopOnly
@Override
public String toString() { ...
然后使用注释处理器 (apt) 删除方法。 那里有很多很好的例子。
收集 AbstractProcessor 中的 classes 并使用 ASM 或其他库删除这些方法。