Android Publishing docsを読んでいて、コードからすべてのLog呼び出しを削除するように言われました。コード内にe.printStackTrace()
への呼び出しがあり、一部として印刷できます私のプログラムの通常の実行の(すなわち、ファイルがまだ存在しない場合)。
これらの通話も削除する必要がありますか?
とにかくe.printStackTrace()
を直接使用するべきではありません。そうすると、情報がAndroidログに送信され、どのアプリケーション(ログタグ)か)が表示されません。
他の人が述べたように、問題のException
を引き続きキャッチしますが、Android.util.Log
メソッドの1つを使用してロギングを行います。スタックトレースではなくメッセージのみをログに記録するか、スタックトレースに詳細ログを使用できます。
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]
呼び出しを削除する をコードから削除することです。
例外がOSまで伝播することを許可すると、OSはそれをログに記録し、[強制終了]ウィンドウをポップアップして、アプリケーションを強制終了します。キャッチした場合、アプリケーションが強制的にクローズされるのを防ぐことができます。
ユーザーが取得したエラーをユーザーに送信できるようにしたい場合は、スタックトレースをログに記録します。その後、 Log Collector のようなアプリを介してログを送信できます。
スタックトレース情報をユーザーに公開する可能性を避けたい場合は、例外をキャッチしてログに記録しないでください。
メッセージの出力にはLogクラスを使用します。アプリに留まることが重要だと思われるログの場合-エラーの警告にはLog.iを使用します-Log.e Log.w Log.dをデバッグするには-アプリケーションがデバッグモードの場合は、基本的にオフにすることができます。
http://developer.Android.com/reference/Android/util/DebugUtils.html
まあprintStackTrace()
はOSにログを記録し、Android(またはコンピューター)アプリを終了(強制終了)します。代わりに、次のようにします。
public void nullPointerExceptionCauser()
{
try
{
Object example = null;
example.toString();
}
catch (Exception e)
{
Logger.log(Level.SEVERE, "Caught Exception: {0}", e.getStackTrace());
}
}
控えめな意見ですが(Android開発者)ではありません)
いいはずです。 Androidのログオプションはわかりませんが、トレースを出力する(または出力しない)ための構成可能なものがあると確信しています。
そして、もしあなたがprintStackTrace()を行わなければ、Androidはそれを無視するという汚い仕事をしません。
:)
それは気持ちの良い(スタイルの)ものだけです。
より安全な方法で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));
}
安全にしたい場合、つまりスヌーピングに例外ログの読み取りを許可しない場合は、次のようなことができます
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"));
}
});
}
}