如何删除" TAG"使用ProGuard从课堂上的字段?

时间:2014-08-22 22:02:20

标签: java android proguard

我正在努力让我的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字段提出任何建议?

一些其他信息:对记录器的调用没有包含任何字符串,也就是说日志消息和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();

1 个答案:

答案 0 :(得分:2)

配置

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

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

通常,要摆脱调用getSimpleName,可能有助于指定

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

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