2010-01-15 2 views
35

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

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

ответ

43

Вы не должны использовать 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 журнальные сообщения с вашего производства сборки. Самый простой способ - use ProGuard to remove Log.[dv] calls из вашего кода.

+11

похоже, что 'Util.stackTraceWriter' больше нет. В любом случае это ['Log.getStackTraceString'] (http://developer.android.com/reference/android/util/Log.html#getStackTraceString%28java.lang.Throwable%29) – superjos

+0

Вам запрещено использовать журналы, когда вы хотите опубликовать приложение! –

+0

@SoheilSetayeshi Почему вы так думаете? Проверьте журналы вашего телефона; вы увидите много журналов из установленных приложений. –

0

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

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

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

:)

Это только хорошего чувства (стиль) вещь.

+0

Я понял, что Android игнорирует его ... это правильно? – helios

3

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

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

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

2

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

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

1

Ну printStackTrace() зарегистрирует его в операционную систему, в результате чего ваш Andorid (или компьютер) приложение, чтобы прекратить (принудительное закрытие), вместо этого, сделать что-то вроде этого:

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

Используйте это, чтобы удалить журналы из выпуска apk

if (BuildConfig.DEBUG) Log.d(TAG, "your meseage"); 
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

Для того, чтобы использовать 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)); 
} 
Смежные вопросы