私は市販されていない(デバッグ証明書で署名された)アプリを持っていますが、私のアプリケーションがクラッシュしたときはいつでもクラッシュログデータを取得したいと思います。アプリがクラッシュした理由のログはどこにありますか。
他の人がアプリをダウンロードしてリモートデバイスでクラッシュしている場合は、Androidエラーレポートライブラリ( this SO post)で参照 =)。自分のローカルデバイス上にある場合は、LogCat.
を使用できます。クラッシュが発生したときにデバイスがホストマシンに接続されていなかった場合でも、デバイスを接続してadb logcat
コマンドを発行すると、 logcat履歴(少なくともログデータの大部分である、バッファリングされる範囲まで、無限ではありません)。これらのオプションのいずれかがあなたの質問に答えますか?そうでない場合は、探しているものをもう少し明確にすることを試みることができますか?
これを行う方法は、Thread.UncaughtExceptionHandler
インターフェースを実装し、それをアクティビティのThread.setDefaultUncaughtExceptionHandler()
の始めにonCreate()
に渡すことです。これが実装クラスTopExceptionHandler
です。
public class TopExceptionHandler implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler defaultUEH;
private Activity app = null;
public TopExceptionHandler(Activity app) {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
this.app = app;
}
public void uncaughtException(Thread t, Throwable e) {
StackTraceElement[] arr = e.getStackTrace();
String report = e.toString()+"\n\n";
report += "--------- Stack trace ---------\n\n";
for (int i=0; i<arr.length; i++) {
report += " "+arr[i].toString()+"\n";
}
report += "-------------------------------\n\n";
// If the exception was thrown in a background thread inside
// AsyncTask, then the actual exception can be found with getCause
report += "--------- Cause ---------\n\n";
Throwable cause = e.getCause();
if(cause != null) {
report += cause.toString() + "\n\n";
arr = cause.getStackTrace();
for (int i=0; i<arr.length; i++) {
report += " "+arr[i].toString()+"\n";
}
}
report += "-------------------------------\n\n";
try {
FileOutputStream trace = app.openFileOutput("stack.trace",
Context.MODE_PRIVATE);
trace.write(report.getBytes());
trace.close();
} catch(IOException ioe) {
// ...
}
defaultUEH.uncaughtException(t, e);
}
}
注意AndroidフレームワークのdefaultUEHで処理します。
あなたのアクティビティの一番上に、このように上記のクラスのインスタンスを登録します。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this));
...
このハンドラはトレースをファイルに保存します。次回ReaderScope
が再起動すると、ファイルを検出し、開発者にメールで送信するかどうかをユーザーに確認します。
スタックトレースを電子メールで送信するには、次のコードを実行して電子メールにまとめます。
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(ReaderScopeActivity.this.openFileInput("stack.trace")));
while((line = reader.readLine()) != null) {
trace += line+"\n";
}
} catch(FileNotFoundException fnfe) {
// ...
} catch(IOException ioe) {
// ...
}
Intent sendIntent = new Intent(Intent.ACTION_SEND);
String subject = "Error report";
String body = "Mail this to [email protected]: " + "\n" + trace + "\n";
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"[email protected]"});
sendIntent.putExtra(Intent.EXTRA_TEXT, body);
sendIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
sendIntent.setType("message/rfc822");
ReaderScopeActivity.this.startActivity(Intent.createChooser(sendIntent, "Title:"));
ReaderScopeActivity.this.deleteFile("stack.trace");
あるいは、ACRA Error Reporting Systemを使用することもできます。単にプロジェクトのlibsにACRA.jarを含め、ランチャーアクティビティクラスの宣言の前に次のコードスニペットを使用してください。
@ReportsCrashes(formKey = "", mailTo = "[email protected];[email protected]", mode = ReportingInteractionMode.SILENT)
またはあなたはコンソールからこれを試すことができます: -
adb logcat -b crash
これはからです http://www.herongyang.com/Android/Debug-adb-logcat-Command-Debugging.html
あなたはadbを使用することができます:
adb logcat AndroidRuntime:E *:S
あなたはコンソールからこれを試すことができます: -
adb logcat -bクラッシュ
Apphanceを使うことができます。これはクロスプラットフォームのサービス(現在は主にAndroid、他のプラットフォームを含むiOS)であり、あらゆるモバイル機器(Android、iOS、現在開発中のもの)をリモートでデバッグできます。ロギング、テスタによる問題の報告、クラッシュログなど、単なるクラッシュログ以上のものです。統合には約5分かかります。現在、クローズドベータへのアクセスをリクエストできます。
免責事項:私はPolidea、Apphanceの背後にある会社とその共同作成者のCTOです。
更新日:Apphanceはもうベータ版を終了していません!アップデート2:Apphanceは http://applause.com オファリングの一部として入手可能です。
これはクラッシュログのための別の解決策です。
Androidマーケットには「Crash Collector」という名前のツールがあります
詳細については、次のリンクを確認してください。
http://kpbird.blogspot.com/2011/08/Android-application-crash-logs.html
Eclipseを使用している場合は、必ずdebugを使用し、実行しないでください。デバッグパースペクティブ(右上)にいることを確認します。ログを印刷するには、 'Resume'(F8)を数回押す必要があります。クラッシュログは下部のLogcatウィンドウに表示されます。ダブルクリックすると全画面表示になり、必ず下部までスクロールします。エラーの赤いテキストが表示されます。クラッシュトレースは次のようになります。
09-04 21:35:15.228: ERROR/AndroidRuntime(778): Uncaught handler: thread main exiting due to uncaught exception
09-04 21:35:15.397: ERROR/AndroidRuntime(778): Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dazlious.Android.helloworld/com.dazlious.Android.helloworld.main}: Java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2268)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2284)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at Android.app.ActivityThread.access$1800(ActivityThread.Java:112)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1692)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at Android.os.Handler.dispatchMessage(Handler.Java:99)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at Android.os.Looper.loop(Looper.Java:123)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at Android.app.ActivityThread.main(ActivityThread.Java:3948)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at Java.lang.reflect.Method.invokeNative(Native Method)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at Java.lang.reflect.Method.invoke(Method.Java:521)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:782)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:540)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at dalvik.system.NativeStart.main(Native Method)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: Java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.example.Android.helloworld.main.onCreate(main.Java:13)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1123)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2231)
09-04 21:35:15.397: ERROR/AndroidRuntime(778): ... 11 more
これにとって重要な部分は
09-04 21:35:15.397: ERROR/AndroidRuntime(778): Caused by: Java.lang.ArrayIndexOutOfBoundsException
09-04 21:35:15.397: ERROR/AndroidRuntime(778): at com.example.Android.helloworld.main.onCreate(main.Java:13)
onCrateメソッドのmain.Javaの13行目で、境界外例外が発生したことがわかります。
ACRAは this から使用できます。このライブラリをあなたのプロジェクトに含めて設定することで、あなたは(あなたのEメールやGdocsに)彼らのクラッシュレポートを受け取ることができます。私の悪い英語ですみません。
基本的なクラッシュ報告ツールを探しているなら、 crashlytics を試してください。
より高度なレポート作成ツールが必要な場合は、チェックアウト Gryphonet を使用してください。クラッシュの原因となったコードの正確な行と、クラッシュ前にユーザーが行った手順などを示す自動マーカーとともに、発生したすべてのクラッシュを記録します。
がんばろう!
Androidアプリのためのアクラクラッシュレポーターを使用してください.. アクラlib
これはテキストファイルにすべてのログをダンプするのを助けることができる解決策です
adb logcat -d > logs.txt
ライブラリを使うこともできます crashcatcher
電話機をコンピュータに接続しているときにクラッシュログを探しているだけの場合は、EclipseのDDMSビューを使用すると、デバッグ中にアプリケーションがクラッシュしたときにDDMS内のLogCatにレポートが表示されます。
1)USB経由で電話を差し込む(開発者デバッグオプションが有効になっている)
2)ターミナルを開き、Android SDK(Macの場合)に移動します。
cd ~/Library/Android/sdk/platform-tools
3)そのディレクトリから(端末で)Logcatを実行して、ログの一定のフローを生成します(Macの場合):
./adb logcat
4)クラッシュするアプリを開いてクラッシュログを生成する
5)Ctrl + Cを押して端末を停止し、クラッシュしたアプリに関連するログを探します。次のようなメッセージが表示される場合があります。
AndroidRuntime: FATAL EXCEPTION: main
私はあなたの問題をすべて解決するためにこのライブラリを作成しました。 Crash Reporterはクラッシュをすべて記録してデバイスにローカルに記録するのに便利なツールです
この依存関係を追加するだけでいいのです。
compile 'com.balsikandar.Android:crashreporter:1.0.1'
ローカルでデバイス内のすべてのあなたのクラッシュを見つけて、あなたの都合の良いときにそれらを修正してください。クラッシュは追跡しやすい日付と時刻の形式で保存されます。加えて、下記のメソッドを使ってLogged ExceptionsをキャプチャするためのAPIも提供します。
CrashRepoter.logException(Exception e)