Должен ли я удалить e.printStackTrace () из моего кода перед публикацией - PullRequest
40 голосов
/ 15 января 2010

Я читал документы по публикации Android, и они сказали удалить все вызовы журнала из моего кода. У меня есть некоторые вызовы e.printStackTrace() в моем коде, которые можно распечатать как часть нормального выполнения моей программы (т. Е. Если файл еще не существует).

Должен ли я также удалить эти вызовы?

Ответы [ 8 ]

45 голосов
/ 15 января 2010

Вы все равно не должны использовать e.printStackTrace() напрямую & mdash; при этом информация будет отправлена ​​в журнал 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] вызовов из вашего кода.

3 голосов
/ 15 января 2010

Если вы разрешите распространению исключения до ОС, ОС зарегистрирует его, а также откроет окно принудительного закрытия, убив ваше приложение. Если вы поймете это, вы можете предотвратить принудительное закрытие вашего приложения.

Если вы хотите, чтобы ваши пользователи могли отправлять вам ошибки, которые они получают, то я бы записал трассировку стека. Затем они могут отправить вам журнал через приложение, например Log Collector .

Если вы хотите избежать возможности раскрытия информации о трассировке стека вашим пользователям, то поймайте исключение и не регистрируйте его.

2 голосов
/ 15 января 2010

Я бы использовал класс Log для вывода сообщений. Для журналов, которые вы считаете важными, чтобы оставаться в приложении - используйте Log.i для предупреждения об ошибках - Log.e Log.w Для вас отладка Log.d - и что вы можете включить на базе, если ваше приложение находится в режиме отладки.

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

1 голос
/ 07 мая 2012

Хорошо printStackTrace() зарегистрирует его в ОС, что приведет к завершению (принудительному закрытию) вашего приложения andorid (или компьютера), вместо этого сделайте что-то вроде этого:

public void nullPointerExceptionCauser()
{
      try
      {
           Object example = null;
           example.toString();
      }
      catch (Exception e)
      {
           Logger.log(Level.SEVERE, "Caught Exception: {0}", e.getStackTrace());
      }
}
0 голосов
/ 19 января 2017

Чтобы использовать printStackTrace более безопасным способом, я бы использовал StringWrite и 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));
 }
0 голосов
/ 28 марта 2014

Если вы хотите быть в безопасности, то есть не позволять кому-либо, отслеживающему чтение журналов исключений, вы можете сделать что-то вроде

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 голосов
/ 30 августа 2012

Используйте это для удаления логов с релиза apk

if (BuildConfig.DEBUG) Log.d(TAG, "your meseage");
0 голосов
/ 15 января 2010

по моему скромному мнению (я не разработчик Android)

Это должно быть приятно.Я не знаю параметров ведения журнала для Android, но я уверен, что у вас есть настраиваемая вещь для вывода (или нет) ваших следов.

И если вы не сделаете printStackTrace (), Android не будет делатьгрязная работа - игнорировать его.

:)

Это всего лишь приятная вещь (стиль).

...