Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何删除“;标签";使用ProGuard的类中的字段?_Java_Android_Proguard - Fatal编程技术网

Java 我如何删除“;标签";使用ProGuard的类中的字段?

Java 我如何删除“;标签";使用ProGuard的类中的字段?,java,android,proguard,Java,Android,Proguard,我正在尝试让我的android ProGuard配置正常工作。到目前为止,我对结果非常满意,但有一件事真的让我感到困扰;即使没什么大不了的 我复制了proguard android optimize.txt文件,并使用以下命令修改该文件以删除我的日志记录 -assumenosideeffects class com.my.package.Logger { *; } 我知道,*是“坏”的,但它是我自己的日志类,所以如果wait之类的内容被删除,这并不重要。上述方法可以很好地删除所有日志记录,但我

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

我复制了
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应该能够删除它。