【问题标题】:How to tell Proguard to comment some lines in code?如何告诉 Proguard 注释代码中的某些行?
【发布时间】:2015-12-22 22:39:11
【问题描述】:

在我的应用程序中,我使用 Cs 类来执行日志记录部分。 它已经有一个 DEBUG 字段,根据构建类型设置为 true/false。

到目前为止一切都很好,但我想稍微改进一下,所以我试图找到自动评论这些行的方法。这将避免一些可能由于日志而出现的问题。 例如:

1. StringBuilder messages = getSomeMessages()
2. Cs.e(TAG, messages.toString());

当第 2 行被注释时,如果 messages 为空,应用程序不会崩溃。 此外,如果我在发布中删除这些行但将它们保留在调试版本中,将很难从堆栈跟踪中检测到错误,因为行号将不再匹配。

我的问题是:是否可以告诉 Proguard 注释所有以某些字符开头的行(在我的例子中是 Cs)?

谢谢

【问题讨论】:

    标签: android proguard


    【解决方案1】:

    此外,如果我在发布中删除这些行但将它们保留在调试版本中,则很难从堆栈跟踪中检测到错误,因为行号将不再匹配。

    首先,您假设注释行将使其进入已编译的类/dex 文件is incorrect。这在调试和发布版本之间没有区别。

    其次,通过优化和/或混淆,Proguard 很可能会修改您的代码,使行号不再与您的原始源匹配。这正是它生成 mapping 文件的原因(通常只是 mapping.txt):以便可以对堆栈跟踪进行去混淆处理(或:retraced)。

    当第 2 行被注释时,如果消息为空,应用程序不会崩溃。

     StringBuilder messages = getSomeMessages()
     Cs.e(TAG, messages.toString());
    

    正确。但是,如果您想要改进您的代码及其稳健性,为什么不用null 检查来保护日志?

    例如:仅在确实有消息时才记录一些内容:

    if (messages != null) Cs.e(TAG, messages.toString());
    

    或者:记录一些没有消息的迹象:

    Cs.e(TAG, messages != null ? messages.toString() : "<empty>");
    

    我不确定Cs 包装的是哪种记录器,但可以考虑利用Android 自己的Log 类的功能。也就是说,如果您真的出于开发目的记录错误,则使用 VerboseDebug 日志级别会更有意义。这些会被自动剥离(分别在编译时和运行时),因此您不必担心在记录时在生产构建中意外生成异常。

    或者,您还可以通过检查自动生成的 BuildConfig.DEBUG 标志来轻松包装任何调试日志 - 听起来您已经在这样做了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多