我正在努力让我的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();
答案 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)也不会从方法中删除字段访问。这是基于许多内部规则,必须考虑访问字段可能有副作用。应该处理这个简单的案例。我会看看它是如何改进的。