【问题标题】:Should I remove e.printStackTrace() from my code before publishing我应该在发布之前从我的代码中删除 e.printStackTrace()
【发布时间】:2011-01-05 12:59:23
【问题描述】:

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

我也应该删除这些调用吗?

【问题讨论】:

    标签: android exception logging production


    【解决方案1】:

    无论如何,您都不应该直接使用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 日志消息。最简单的方法是从您的代码中use ProGuard to remove Log.[dv] calls

    【讨论】:

    • 看起来Util.stackTraceWriter 已经不存在了。反正有这个Log.getStackTraceString
    • 发布应用时不允许使用日志!
    • @SoheilSetayeshi 是什么让你这么认为?检查手机的日志;你会看到很多来自已安装应用的日志。
    • @ChristopherOrr :检查this 出去伙计。 “准备发布申请”中的第一步
    • @SoheilSetayeshi 是的,“不允许”使用日志和推荐列表之间是有区别的 :) Google Play 将阻止可调试的应用程序(我相信),但它们不会防止人们在生产环境中调试他们的应用程序。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          :)

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

          【讨论】:

            【解决方案6】:

            如果您想要安全,即不允许任何人窥探读取异常日志,您可以执行类似的操作

            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"));
                          }
                      });
                }
            }
            

            【讨论】:

              【解决方案7】:

              为了更安全地使用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));
               }
              

              【讨论】:

                【解决方案8】:

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

                if (BuildConfig.DEBUG) Log.d(TAG, "your meseage");
                

                【讨论】:

                  猜你喜欢
                  • 2010-10-08
                  • 1970-01-01
                  • 2011-12-21
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-11-12
                  • 2015-08-12
                  相关资源
                  最近更新 更多