我正在阅读Android发布文档,他们说要从我的代码中删除所有日志调用。我在代码中调用e.printStackTrace()
,可以打印为程序正常运行的一部分(即,如果文件尚不存在)。
我还应该删除这些电话吗?
答案 0 :(得分:44)
您不应该直接使用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。
答案 1 :(得分:3)
如果允许Exception传播到操作系统,那么操作系统将记录它并弹出强制关闭窗口,从而终止您的应用程序。如果你抓住它,那么你可以阻止你的申请被强制关闭。
如果您希望您的用户能够向您发送他们正在获取的错误,那么我会记录堆栈跟踪。然后,他们可以通过Log Collector等应用向您发送日志。
如果您想避免将堆栈跟踪信息暴露给用户,请捕获异常并且不要记录它。
答案 2 :(得分:2)
我会使用Log类进行消息输出。对于您认为留在应用程序中很重要的日志 - 请使用Log.i 错误警告 - Log.e Log.w 对于您调试Log.d - 并且如果您的应用程序处于调试模式,您可以根据它进行关闭。
http://developer.android.com/reference/android/util/DebugUtils.html
答案 3 :(得分:1)
好printStackTrace()
会将其记录到操作系统中,导致您的Android(或计算机)应用程序终止(强制关闭),而是执行以下操作:
public void nullPointerExceptionCauser()
{
try
{
Object example = null;
example.toString();
}
catch (Exception e)
{
Logger.log(Level.SEVERE, "Caught Exception: {0}", e.getStackTrace());
}
}
答案 4 :(得分:0)
以我的谦虚观点(我不是Android开发人员)
应该很好。我不知道Android的日志记录选项,但我确定你有一些可配置的东西来输出(或不输出)你的跟踪。
如果你不做printStackTrace(),Android将不会做忽略它的肮脏工作。
:)
这只是一种好感(风格)的东西。
答案 5 :(得分: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"));
}
});
}
}
答案 6 :(得分: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));
}
答案 7 :(得分:-1)
使用此选项从发布apk中删除日志
if (BuildConfig.DEBUG) Log.d(TAG, "your meseage");