我正在努力使我的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();
发布于 2014-08-25 00:48:42
配置
-assumenosideeffects class com.my.package.Logger { *; }
确实是不好的,因为它包含所有的对象方法,比如Object#wait()
。您可能不希望ProGuard从您的应用程序中删除这些调用。您应该显式地列出日志记录方法。
通常,为了摆脱调用getSimpleName
,它可能有助于指定
-assumenosideeffects class java.lang.Object {
java.lang.String getSimpleName();
}
在本例中,字段访问不会从方法中删除(使用ProGuard 5.0)。这是基于一些内部规则,这些规则必须考虑到访问字段可能有副作用。这个简单的案子应该得到处理。我会看看怎么改进的。
https://stackoverflow.com/questions/25456167
复制相似问题