답변:
다른 사람이 앱을 다운로드하고 원격 장치에서 충돌하는 경우 Android 오류보고 라이브러리 ( 이 SO post 에서 참조)를 살펴볼 수 있습니다 . 장치가 자신의 로컬 장치 LogCat.
에만있는 경우 충돌이 발생했을 때 장치가 호스트 시스템에 연결되지 않은 경우에도 장치를 연결하고 adb logcat
명령을 실행 하면 전체 logcat 기록을 다운로드합니다 (적어도 그 정도까지). 일반적으로 로그 데이터의 loooot 인 버퍼링되며 무한하지 않습니다). 이러한 옵션 중 하나가 귀하의 질문에 대답합니까? 그렇지 않다면 조금 더 찾고있는 것을 명확히 할 수 있습니까?
adb logcat
adb가있는 디렉토리에서 실행하십시오 . 또는 Eclipse 플러그인에 포함 된 SDK 도구를 사용할 수도 있습니다
$SDK_DIR/platform-tools/
. 오류를 표시하려면 :.\adb.exe logcat -v time *:E
이를 수행하는 방법은 Thread.UncaughtExceptionHandler
인터페이스 를 구현하고 Thread.setDefaultUncaughtExceptionHandler()
Activity의 시작 부분에 인터페이스를 전달하는 것 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 Error Reporting System을 사용할 수도 있습니다. 프로젝트 라이브러리에 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를 사용하는 경우 디버그를 사용하고 실행하지 않아야합니다. 디버그 퍼스펙티브에 있는지 확인하십시오 (오른쪽 상단) 로그를 인쇄하려면 '다시 시작'(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 및 기타 플랫폼을 지원하는 iOS)로 모든 모바일 장치 (Android, iOS-개발중인 다른 기기)를 원격으로 디버깅 할 수 있습니다. 로깅, 테스터에 의한 문제보고, 크래시 로그 등 실제로는 크래시 로그 그 이상입니다. 통합하는 데 약 5 분이 걸립니다. 현재 비공개 베타에 대한 액세스를 요청할 수 있습니다.
면책 조항 : 저는 Apphance 및 공동 제작자 인 Polidea의 CTO입니다.
업데이트 : Apphance가 더 이상 비공개 베타 버전이 아닙니다! 업데이트 2 : Apphance는 http://applause.com 오퍼링의 일부로 제공됩니다
libs
것처럼 apphance.jar을 디렉토리에 두어야 합니다. 이 github 커밋 은 Apphance를 사용하기 위해 WorldMap 앱에 필요한 변경 사항을 보여줍니다.
충돌 로그에 대한 또 다른 솔루션이 있습니다.
Android 마켓에는 "Crash Collector"라는 도구가 있습니다
자세한 내용은 다음 링크를 확인하십시오
http://kpbird.blogspot.com/2011/08/android-application-crash-logs.html
기본 충돌보고 도구를 찾고 있다면 crashlytics를 시도 하십시오 .
고급보고 도구가 필요한 경우 Checkout Gryphonet . 충돌이 발생한 정확한 코드 줄과 함께 충돌을 일으킨 사용자와 충돌 전에 수행 한 단계 등을 보여주는 자동 마커와 함께 발생한 모든 충돌을 기록합니다.
행운을 빕니다!
안드로이드 응용 프로그램에 대한 Acra 충돌 기자를 사용하십시오. Acra 라이브러리
모든 문제를 해결하기 위해이 라이브러리를 만들었습니다. 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));
.....