首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用ProGuard从类中删除“标记”字段?

如何使用ProGuard从类中删除“标记”字段?
EN

Stack Overflow用户
提问于 2014-08-22 22:02:19
回答 1查看 1.2K关注 0票数 1

我正在努力使我的android ProGuard配置正常工作。到目前为止,我对结果很满意,但是有一件事让我很困扰:即使这不是什么大事。

我复制了proguard-android-optimize.txt文件并对其进行了修改,以便使用以下方法删除日志记录

代码语言:javascript
运行
复制
-assumenosideeffects class com.my.package.Logger { *; }

我知道*;是“坏的”,但是它是我自己的日志类,所以如果删除wait之类的东西并不重要。上面的工作原理很好,可以删除所有的日志记录,但是我正在尝试从所有类中删除剩余的TAG变量。TAG变量的定义如下:

代码语言:javascript
运行
复制
private static final String TAG = thisClass.class.getSimpleName();

我试着用这样的配置来删除它们

代码语言:javascript
运行
复制
-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字段有任何建议?

一些附加信息():对记录器的调用没有连接任何字符串,也就是说日志消息和标记是这样使用的。

代码语言:javascript
运行
复制
com.my.package.Logger.log(TAG, "debug message");
//NOT log(TAG + "debug message");

运行ProGuard后,在技术上不再使用生成的TAG字段,但ProGuard将其优化为

代码语言:javascript
运行
复制
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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-25 00:48:42

配置

代码语言:javascript
运行
复制
-assumenosideeffects class com.my.package.Logger { *; }

确实是不好的,因为它包含所有的对象方法,比如Object#wait()。您可能不希望ProGuard从您的应用程序中删除这些调用。您应该显式地列出日志记录方法。

通常,为了摆脱调用getSimpleName,它可能有助于指定

代码语言:javascript
运行
复制
-assumenosideeffects class java.lang.Object {
    java.lang.String getSimpleName();
}

在本例中,字段访问不会从方法中删除(使用ProGuard 5.0)。这是基于一些内部规则,这些规则必须考虑到访问字段可能有副作用。这个简单的案子应该得到处理。我会看看怎么改进的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25456167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档