안드로이드 개발 비정상 종료시 에러 남기는 방법

안드로이드 개발

안드로이드 개발 비정상 종료시 에러 남기는 방법

 

환경: Android Studio

 

앱의 비정상적인 오류로 인해 종료되는 시점에서 사용자가 별도의 기능을 처리할 수 있을 까요? 모든 소스에 try catch 를 씌울 수도 있겠지만 비효율적입니다. java 는 스레드 객체에서 비정상적인 오류가 발생하면 UncaughtException 이벤트를 실행합니다. 안드로이드는 java 언어를 기반으로 만들어 졌기 때문에 UncaughtException 이벤트를 받을 수 있는 핸들러 등록이 가능합니다.

 

기본 사용법은 Thread.UncaughtExceptionHandler 핸들러를 Thread static 함수인 setDefaultUncaughtExceptionHandler() 에 등록하는 것입니다. 그러면 비정상적으로 종료하는 순간 이벤트를 받을 수 있습니다.

안드로이드 개발 비정상 종료시 에러 남기는 방법

 

UncaughtException Thread 별로 관리가 가능하기 때문에 각 Activity 마다 등록이 가능합니다. 샘플에서는 나누기 에러를 이용해서 Thread.UncaughtExceptionHandler 를 통해 이벤트를 받아 로그를 출력했습니다

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

public class UncaughtExceptionActivity extends AppCompatActivity {
    private String TAG = UncaughtExceptionActivity.class.getSimpleName();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_uncaught);

        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler());

        int a = 10 / 0;
    }

    public class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            // 이곳에서 로그를 남기는 작업을 하면 된다.
            Log.e(TAG, "error -----------------> " + ex.toString());

            // 종료
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(10);

            //androidDefaultUEH.uncaughtException(thread, ex);
        }
    }
}


앱 전체에서 발생하는 예외를 처리하기 위해서는 Application 에 등록을 해야 합니다. 먼저 Application 상속받아서 자신만의 클래스를 만듭니다. 그리고 AndroidManifest.xml 에 등록합니다

안드로이드 개발 비정상 종료시 에러 남기는 방법

 

등록한 Application 클래스의 전체 내용은 다음과 같습니다

import android.app.Application;
import android.util.Log;

public class MyApplication extends Application {
    private String TAG = MyApplication.class.getSimpleName();
    private Thread.UncaughtExceptionHandler androidDefaultUEH;
    private UncaughtExceptionHandler uncaughtExceptionHandler;

    public UncaughtExceptionHandler getUncaughtExceptionHandler() {
        return uncaughtExceptionHandler;
    }
    
    @Override
    public void onCreate() {
        androidDefaultUEH = Thread.getDefaultUncaughtExceptionHandler();
        uncaughtExceptionHandler = new UncaughtExceptionHandler();

        Thread.setDefaultUncaughtExceptionHandler(uncaughtExceptionHandler);
        super.onCreate();
    }

    public class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            // 이곳에서 로그를 남긴다
            Log.e(TAG, "error -----------------> " + ex.toString());
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(10);
        }
    }
}


Posted by 녹두장군