본문 바로가기

PROGRAMING/Android

Android log 저장방법 UncaughtExceptionHandler 구현과 android.app.application

최근에 개인 공부를 위해 만들고 있는 안드로이드 어플이 있는데

집에 오면서 사용하는 도중 Sorry Pop이 발생하였다.


에러를 잡고 싶었는데 로그 없어서 에러를 확인하지 못하는 상황이 발생되었다.


런타임 에러로그를 파일로 남기면 좋게다는 생각이 들어 구글링을 하게되었다.


결론은 자바에서 제공하는 "Thread.UncaughtExceptionHandler" 인터페이스를

안드로이드의 android.app.application을 상속 받아 구현한 custom Application에 구현하는 것이

해결 방법이었다. (Thread.setDefaultUncaughtExceptionHandler(this);)


참고자료


http://blog.csdn.net/liuhe688/article/details/6584143#

중국자료 application 과 Thread.UncaughtExceptionHandler 를 이용 sd카드에 로그남김

http://www.java2s.com/Code/Android/Development/CustomExceptionHandlerimplementsUncaughtExceptionHandler.htm

Thread.UncaughtExceptionHandler로 얻어온 자료를 웹서버에 올리는 로직이 더 있음


http://lasiejxluv.blogspot.kr/2012/07/android-how-to-start-new-activity-from.html

실제 테스트해보았을 때 동작 안됨. Dailog 팝업 띄우는 내용 application객체에서 AlertDialog를 띄우려고 할때 token ..null 이란 에러 발생. --- 포기. 안되는 것 같음.


http://kokufu.blogspot.kr/2013/01/android-uncaughtexceptionhandler-anr.html

일본자료 매우 심플하나 요점이 잘 정리되어있음 

중국 자료가 일본자료 보다 더 크다. 중국자료를 기본으로 내용을 정리했다.


기타 자료

http://blog.tomtasche.at/2012/10/use-built-in-feedback-mechanism-on.html

영미권 개발자의 블로그

ApplicationErrorReport에 관해 사용하면 되다고 자랑하고 있지만

실질적으로 intent를 보낸것을 보니 Google play에 리포트 하는것 이었다.



찻던 소스에서 팝업을 띄우고 아래 명령어로 어플을 종료하는 것이 있었다.

그러나 ...

android.os.Process.killProcess(android.os.Process.myPid());  

System.exit(1);  

소스상 종료구문이 위 내용은 현재 android 4.1.2(jb)버전에서는 오동작을 일으킨다.

종료가 되면 잘못된 종료라고 판단하여 어플을 다시 실행시킨다. (내가 나를 종료시킬 때 이런 현상이 일어나는 것 같다 향후 좀더 살펴보아야 겠다.)

onCreate문에서 오류가 발생한다고 가정하면 오류가 무한 반복될것 이다.

실제로 여러 자료를 조사해본결과 어플을 종료시킬수 있는 방법은 존재하지 않는다.

참고 자료 http://huewu.blog.me/110089551997

ActivityManager am = (ActivityManager) getSystemService(Activity.ACTIVITY_SERVICE);

List<RunningTaskInfo> tasks =am.getRunningTasks(Integer.MAX_VALUE);

Log.e(CLASS_NAME, "tasks.size() : " +tasks.size());

for(int i=0;i<tasks.size();i++) {

String packageName = tasks.get(i).baseActivity.getPackageName();

Log.e(CLASS_NAME, "packageName : " +packageName);

if(getPackageName().equals(packageName)) {

Log.e(CLASS_NAME, "mContext.getPackageName() : " +getPackageName());

am.killBackgroundProcesses(packageName);

}

}

killBackgroundProcesses 메소드도 전면에 떠있는 activity를 종료할수 없었다.