41

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

我也应该删除这些电话吗?

4

8 回答 8

47

无论如何你都不应该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));
}

您应该从生产构建中剥离DEBUG或记录消息。VERBOSE最简单的方法是使用 ProGuard从代码中删除Log.[dv]调用。

于 2010-01-15T18:28:22.647 回答
3

如果您允许异常传播到操作系统,那么操作系统将记录它并弹出一个强制关闭窗口,终止您的应用程序。如果你抓住它,那么你可以防止你的应用程序被强制关闭。

如果您希望您的用户能够向您发送他们收到的错误,那么我会记录堆栈跟踪。然后,他们可以通过Log Collector之类的应用程序向您发送日志。

如果您想避免将堆栈跟踪信息暴露给用户的可能性,请捕获异常并且不要记录它。

于 2010-01-15T14:38:00.270 回答
2

我会使用 Log 类来输出消息。对于您认为留在应用程序中很重要的日志 - 使用 Log.i 进行错误警告 - Log.e Log.w 为您调试 Log.d - 如果您的应用程序处于调试模式,您可以关闭基础。

http://developer.android.com/reference/android/util/DebugUtils.html

于 2010-01-15T16:01:09.580 回答
1

那么printStackTrace()会将其登录到操作系统中,导致您的 andorid(或计算机)应用程序终止(强制关闭),而是执行以下操作:

public void nullPointerExceptionCauser()
{
      try
      {
           Object example = null;
           example.toString();
      }
      catch (Exception e)
      {
           Logger.log(Level.SEVERE, "Caught Exception: {0}", e.getStackTrace());
      }
}
于 2012-05-07T05:48:46.793 回答
0

在我看来(我不是 Android 开发人员)

应该不错。我不知道 Android 的日志记录选项,但我确信您有一些可配置的东西来输出(或不输出)您的跟踪。

而且,如果您不执行 printStackTrace(),Android 将不会做忽略它的肮脏工作。

:)

这只是一种感觉良好(风格)的东西。

于 2010-01-15T14:23:53.020 回答
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"));
              }
          });
    }
}
于 2014-03-28T17:25:06.683 回答
0

为了以printStackTrace更安全的方式使用,我会使用StringWriteand PrintWriter

    ...
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));
 }
于 2017-01-19T09:16:53.853 回答
-1

使用它从发布 apk 中删除日志

if (BuildConfig.DEBUG) Log.d(TAG, "your meseage");
于 2012-08-30T09:50:07.977 回答