如何告诉Proguard在代码中注释一些行?

时间:2015-09-25 06:48:40

标签: android proguard

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

到目前为止,一切都运转良好,但我想稍微改进一下,所以我试图找到自动评论这些线的方法。这样可以避免因日志而出现的一些问题。 例如:

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

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

我的问题是:有可能告诉Proguard评论所有以某些字符开头的行(在我的情况下为Cs)?

谢谢

1 个答案:

答案 0 :(得分:0)

  

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

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

其次,通过优化和/或混淆,Proguard很可能会修改您的代码,使得行号不再与原始源匹配。这正是它生成映射文件(通常只是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类的功能。也就是说,如果您真的为了开发目的而记录错误,那么使用 Verbose Debug 日志级别会更有意义。这些会被自动删除(在编译时和运行时分配),因此您不必担心在生成日志记录时意外生成异常。

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