回答:
アプリが他のユーザーによってダウンロードされてリモートデバイスでクラッシュしている場合は、Androidエラー報告ライブラリ(このSOの投稿で参照されている)を調べることをお勧めします。自分のローカルデバイス上にある場合はLogCat.
、クラッシュが発生したときにデバイスがホストマシンに接続されていなくても、デバイスを接続してadb logcat
コマンドを発行すると、logcat履歴全体がダウンロードされます(少なくともバッファリングされます。これは通常、大量のログデータです。無限ではありません)。これらのオプションのどちらかがあなたの質問に答えますか?そうでない場合、あなたが探しているものをもう少し明確にしようとすることができますか?
adb logcat
adbがあるディレクトリから実行します。または、Eclipseプラグインに含まれているSDKツールを使用できます
$SDK_DIR/platform-tools/
ます。エラーを表示するには:.\adb.exe logcat -v time *:E
これを行う方法は、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 appdeveloper@gmail.com: " + "\n" + trace + "\n";
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"readerscope@altcanvas.com"});
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エラー報告システムを使用することもできます。プロジェクトライブラリにACRA.jarを含めるだけで、ランチャーアクティビティクラス宣言の前に以下のコードスニペットを使用できます。
@ReportsCrashes(formKey = "", mailTo = "abc@gmail.com;def@yahoo.com", 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 --buffer=crash
このオプションの詳細:
adb logcat --help
...
-b <buffer>, --buffer=<buffer> Request alternate ring buffer, 'main',
'system', 'radio', 'events', 'crash', 'default' or 'all'.
Multiple -b parameters or comma separated list of buffers are
allowed. Buffers interleaved. Default -b main,system,crash.
Eclipseを使用している場合は、実行せずにデバッグを使用してください。デバッグパースペクティブ(右上)にいることを確認します。ログを印刷するには、 '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行目の境界外の例外であったことを示しています。
Apphanceを使用できます。これはクロスプラットフォームサービス(現在は主にAndroid、iOS、他のプラットフォームが進行中)であり、リモートで任意のモバイルデバイス(Android、iOS-現在開発中の他のデバイス)をデバッグできます。これは単なるクラッシュログだけではなく、実際にはログ、テスターによる問題の報告、クラッシュログなど、はるかに多くのことです。統合には約5分かかります。現在、クローズドベータ版へのアクセスをリクエストできます。
免責事項:私は、Apphanceの背後にあり、その共同作成者であるPolideaのCTOです。
更新:Apphanceはもはやクローズドベータ版です!アップデート2:Apphanceはhttp://applause.comオファリングの一部として利用可能です
libs
れているように、apphance.jarをディレクトリに配置する必要があります。このgithubコミットは、apphanceを使用するためにWorldMapアプリに加える必要がある変更を示しています。
クラッシュログの別のソリューションを次に示します。
Androidマーケットには「クラッシュコレクター」というツールがあります
詳細については、次のリンクを確認してください
http://kpbird.blogspot.com/2011/08/android-application-crash-logs.html
基本的なクラッシュレポートツールを探している場合は、crashlyticsをお試しください。
より高度なレポートツールが必要な場合は、Checkout Gryphonetを使用してください。発生したすべてのクラッシュと、クラッシュを引き起こした正確なコード行、およびユーザーがクラッシュ前に実行した手順などを示す自動マーカーを記録します。
幸運を!
私はあなたのすべての問題を解決するためにこのライブラリを作成しました。 Crash Reporterは、すべてのクラッシュをキャプチャしてローカルのデバイスに記録するための便利なツールです
この依存関係を追加するだけでよいのです。
compile 'com.balsikandar.android:crashreporter:1.0.1'
ローカルでデバイス内のすべてのクラッシュを見つけ、都合のよいときに修正します。クラッシュは、追跡しやすい日付と時刻の形式を使用して保存されます。さらに、以下のメソッドを使用してログに記録された例外をキャプチャするためのAPIも提供します。
CrashRepoter.logException(Exception e)
ライブラリcrashcatcherを使用することもできます
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
このPOSTに基づいて、このクラスを「TopExceptionHandler」の代わりとして使用します
class TopExceptionHandler implements Thread.UncaughtExceptionHandler {
private Thread.UncaughtExceptionHandler defaultUEH;
private Activity app = null;
private String line;
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();
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"kevineyni@gmail.com"});
i.putExtra(Intent.EXTRA_SUBJECT, "crash report azar");
String body = "Mail this to kevineyni@gmail.com: " + "\n" + trace + "\n";
i.putExtra(Intent.EXTRA_TEXT , body);
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
// Toast.makeText(MyActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
// ReaderScopeActivity.this.startActivity(Intent.createChooser(sendIntent, "Title:"));
//ReaderScopeActivity.this.deleteFile("stack.trace");
} catch(IOException ioe) {
// ...
}
defaultUEH.uncaughtException(t, e);
}
private void startActivity(Intent chooser) {
}
}
.....
同じJavaクラスファイル(アクティビティ).....
Public class MainActivity.....
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new TopExceptionHandler(this));
.....