gpt4 book ai didi

java - 如何使用 ProGuard 从类中删除 "TAG"字段?

转载 作者:行者123 更新时间:2023-11-29 21:02:57 25 4
gpt4 key购买 nike

我正在尝试让我的 android ProGuard 配置正常工作。到目前为止,我对结果非常满意,但有一件事真正困扰着我;即使这没什么大不了的。

我复制了 proguard-android-optimize.txt 文件并修改它以使用以下命令删除我的日志记录

-assumenosideeffects class com.my.package.Logger { *; }

我知道 *; 是“坏的”,但它是我自己的日志记录类,所以删除 wait 之类的东西并不重要。上面的方法非常适合删除我的所有日​​志记录,但我正在尝试从我的所有类中删除剩余的 TAG 变量。 TAG 变量定义如下:

private static final String TAG = thisClass.class.getSimpleName();

我试过用这样的配置删除它们

-assumenosideeffects class com.my.package.** { static final *** TAG; }
-assumenosideeffects class com.my.package.** { static final java.lang.String TAG; }
-assumenosideeffects class com.my.package.thisClass { static final java.lang.String TAG; }

我也尝试通过尝试删除对 getSimpleName 的所有调用来实现它,但这也没有用。有没有人对如何删除这些不再使用的 TAG 字段有任何建议?

一些附加信息:对记录器的调用没有连接任何字符串,也就是说日志消息和标签是这样使用的

com.my.package.Logger.log(TAG, "debug message");
//NOT log(TAG + "debug message");

运行 ProGuard 后,生成的 TAG 字段在技术上不再使用,但 ProGuard 对此进行了优化

public void method()
{
String _tmp = a; //was Logger.log(TAG, "test");
//_tmp is never used anywhere else in this method
}

private static final String a = com/my/package/thisClass/getSimpleName();

最佳答案

配置

-assumenosideeffects class com.my.package.Logger { *; }

确实很糟糕,因为它包括所有 Object 方法,例如 Object#wait()。您可能不希望 ProGuard 从您的应用程序中删除这些调用。您应该明确列出您的日志记录方法。

一般来说,要摆脱调用getSimpleName,可能有助于指定

-assumenosideeffects class java.lang.Object {
java.lang.String getSimpleName();
}

在这种情况下,字段访问不会从方法中删除(使用 ProGuard 5.0)。这是基于许多内部规则,这些规则必须考虑到访问字段可能会产生副作用。这个简单的案例应该得到处理。我会看看如何改进它。

关于java - 如何使用 ProGuard 从类中删除 "TAG"字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25456167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com