Java 我如何删除“;标签";使用ProGuard的类中的字段?
我正在尝试让我的android ProGuard配置正常工作。到目前为止,我对结果非常满意,但有一件事真的让我感到困扰;即使没什么大不了的 我复制了Java 我如何删除“;标签";使用ProGuard的类中的字段?,java,android,proguard,Java,Android,Proguard,我正在尝试让我的android ProGuard配置正常工作。到目前为止,我对结果非常满意,但有一件事真的让我感到困扰;即使没什么大不了的 我复制了proguard android optimize.txt文件,并使用以下命令修改该文件以删除我的日志记录 -assumenosideeffects class com.my.package.Logger { *; } 我知道,*是“坏”的,但它是我自己的日志类,所以如果wait之类的内容被删除,这并不重要。上述方法可以很好地删除所有日志记录,但我
proguard android optimize.txt
文件,并使用以下命令修改该文件以删除我的日志记录
-assumenosideeffects class com.my.package.Logger { *; }
我知道,*
是“坏”的,但它是我自己的日志类,所以如果wait
之类的内容被删除,这并不重要。上述方法可以很好地删除所有日志记录,但我正在尝试从所有类中删除剩余的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
的所有调用来实现这一点,但这也不起作用。有人对如何删除这些不再使用的标记字段有什么建议吗
一些附加信息:对日志记录器的调用不包含任何字符串,也就是说日志消息和标记就是这样使用的
com.my.package.Logger.log(TAG, "debug message");
//NOT log(TAG + "debug message");
运行ProGuard后,生成的标记
字段在技术上不再使用,但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\wait()
。您可能不希望ProGuard从应用程序中删除这些调用。您应该明确列出日志记录方法
通常,为了摆脱调用getSimpleName
,指定
-assumenosideeffects class java.lang.Object {
java.lang.String getSimpleName();
}
在这种情况下,字段访问不会从方法中删除(使用ProGuard 5.0)。这是基于一些内部规则,这些规则必须考虑到访问字段可能会产生副作用。这个简单的案件本应得到处理。我来看看如何改进。我想您在上述尝试中也尝试过在字段规范中添加private
,对吗?(不是说有必要——我不知道,只是想知道你是否试过。)@Turix是的,当然有。另外,正如您所知(因为您说您不确定),上的ProGuard文档说,除非您想进一步限制您的规则,否则没有必要指定private/public/protected。对不起,值得一试。太糟糕了,ProGuard没有dontkeep
指令;指定assumenosideffects
对于您想要做的事情来说似乎过于间接,因为它是关于删除未使用的方法。(因此,它可以删除日志方法调用的原因是没有副作用的void
方法是多余的。)这可能有些过分,但您可以尝试将TAG
定义为静态方法而不是字段,例如:private static final String TAG(){return getSimpleName();}
。这将减慢调试构建的速度,但ProGuard应该能够删除它。