我在发布代码前是否应该删除e.printStackTrace()?

44

我正在阅读Android出版文档,他们建议从我的代码中删除所有的 Log 调用。 我的代码中有一些调用 e.printStackTrace(),这些调用可以作为程序正常运行的一部分进行打印(例如,如果文件尚不存在)。

我是否也应该删除这些调用呢?

8个回答

50

您不应该直接使用e.printStackTrace(),这样会将信息发送到Android日志中而不显示来自哪个应用程序(日志标记)。

正如其他人所提到的那样,继续捕获相关的Exception,但使用其中一个android.util.Log方法来记录。 您可以仅记录消息而不是堆栈跟踪,或者使用详细记录来记录堆栈跟踪:

try {
    Object foo = null;
    foo.toString();
} catch (NullPointerException ex) {
    Log.w(LOG_TAG, "Foo didn't work: "+ ex.getMessage());
    Log.d(LOG_TAG, Util.stackTraceWriter(ex));
}

您应该从生产版本中剥离DEBUGVERBOSE的日志信息。最简单的方法是使用ProGuard来删除代码中的Log.[dv]调用


11
看起来 Util.stackTraceWriter 已经不存在了。无论如何,可以使用 Log.getStackTraceString 来代替。 - superjos
发布应用程序时,禁止使用日志! - Soheil Setayeshi
@SoheilSetayeshi 你是怎么想到的?检查一下你手机的日志,你会看到很多安装应用程序的日志。 - Christopher Orr
1
@ChristopherOrr:兄弟,看看这个。这是“准备发布应用程序”的第一步。 - Soheil Setayeshi
3
@SoheilSetayeshi 嗯,禁止使用日志和推荐清单之间是有区别的 :) Google Play会阻止可调试的应用程序(我相信),但他们不会阻止人们在生产中调试他们的应用程序。 - Christopher Orr
实际上,堆栈跟踪会打印应用程序名称,至少在 v.21 版本中是这样的。 - igorepst

3
如果允许异常传播到操作系统,则操作系统将记录它并弹出“强制关闭”窗口,从而终止应用程序。如果捕获它,则可以防止应用程序被强制关闭。
如果您希望用户能够向您发送他们遇到的错误信息,则应记录堆栈跟踪。然后,他们可以通过像Log Collector这样的应用程序将日志发送给您。
如果要避免可能将堆栈跟踪信息暴露给用户,则捕获异常并不要记录它。

2

1

好的,printStackTrace()会将其记录到操作系统中,导致您的安卓(或计算机)应用程序终止(强制关闭),因此,请尝试像这样做:

public void nullPointerExceptionCauser()
{
      try
      {
           Object example = null;
           example.toString();
      }
      catch (Exception e)
      {
           Logger.log(Level.SEVERE, "Caught Exception: {0}", e.getStackTrace());
      }
}

0
如果您想保持安全,即不允许任何人窥探读取异常日志,您可以执行以下操作:
private void hideExceptionsInReleaseMode()
{
    final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();

    if(!BuildConfig.DEBUG)
    {
        Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
          {
              @Override
              public void uncaughtException(Thread thread, Throwable ex)
              {
                  defaultHandler.uncaughtException(thread, new RuntimeException("Something went wrong :p"));
              }
          });
    }
}

0

在我谦虚的意见中(我不是Android开发者)

这应该很好。我不知道Android的日志选项,但我相信你有一些可配置的东西来输出(或不输出)你的跟踪信息。

如果你不使用printStackTrace(),Android就不会忽略它而不做任何处理。

:)

这只是一种好感(风格)的事情。


0
为了更安全地使用printStackTrace,我会使用StringWritePrintWriter
    ...
catch (final Exception e)
{
   final StringWriter sw = new StringWriter();
   final PrintWriter pw = new PrintWriter(sw);
   e.printStackTrace(pw);
   Log.e("TAG", sw.toString());
}

或者,另外一种选择是:

 catch (final Exception e)
 {
    Log.e(TAG, Log.getStackTraceString(e));
 }

-1
使用此方法可以从发布版apk中删除日志。
if (BuildConfig.DEBUG) Log.d(TAG, "your meseage");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接