对于android 中未捕获到的异常可以通过UnCaughtExceptionHandler
来进行捕获
/**
* Implemented by objects that want to handle cases where a thread is being
* terminated by an uncaught exception. Upon such termination, the handler
* is notified of the terminating thread and causal exception. If there is
* no explicit handler set then the thread's group is the default handler.
*/
public static interface UncaughtExceptionHandler {
/**
* The thread is being terminated by an uncaught exception. Further
* exceptions thrown in this method are prevent the remainder of the
* method from executing, but are otherwise ignored.
*
* @param thread the thread that has an uncaught exception
* @param ex the exception that was thrown
*/
void uncaughtException(Thread thread, Throwable ex);
}
他是Thread中的一个内部静态接口,主要通过uncaughtException方法进行处理异常
很显然对这个接口他会抛出get,set方法
/**
* Sets the default uncaught exception handler. This handler is invoked in
* case any Thread dies due to an unhandled exception.
*
* @param handler
* The handler to set or null.
*/
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) {
Thread.defaultUncaughtHandler = handler;
}
/**
* Returns the default exception handler that's executed when uncaught
* exception terminates a thread.
*
* @return an {@link UncaughtExceptionHandler} or <code>null</code> if
* none exists.
*/
public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler() {
return defaultUncaughtHandler;
}
所以我们由此可以自定义一个CrashHandler来实现这个UncaughtExceptionHandler来处理未捕获到的异常
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.widget.Toast;
import com.orhanobut.logger.Logger;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* author:sparkhuu
* email:sparkhuu@gmail.com
*/
public class CrashHandler implements UncaughtExceptionHandler {
private static final String TAG = "CrashHandler";
private static final boolean DEBUG = true;
private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/CrashText/log/";
private static final String FILE_NAME = "crash";
private static final String FILE_NAME_SUFFIX = ".trace";
private static CrashHandler sInstance = new CrashHandler();
private UncaughtExceptionHandler mDefaultCrashHandler;
private Context mContext;
private CrashHandler(){}
public static CrashHandler getsInstance(){
return sInstance;
}
public void init(Context context){
mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
mContext = context;
}
/**
* 当程序中有未捕获的异常,系统会自动调用此方法
* @param thread 出现未捕获异常的线程
* @param ex 未捕获的异常
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) {
try {
//导出异常信息导SD卡
dumpExceptionToSDCard(ex);
//上传异常信息导服务器
uploadExceptionToServer();
} catch (Exception e) {
e.printStackTrace();
}
ex.printStackTrace();
if (null != mDefaultCrashHandler){
mDefaultCrashHandler.uncaughtException(thread, ex);
} else {
Toast.makeText(mContext, ex.getMessage(), Toast.LENGTH_SHORT).show();
}
}
private void uploadExceptionToServer(){
}
private void dumpExceptionToSDCard(Throwable ex) throws IOException {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
if (DEBUG){
Logger.i(TAG + "sdCard unmounted, skip dump exception");
return;
}
}
File dir = new File(PATH);
if (!dir.exists()){
dir.mkdirs();
}
long current = System.currentTimeMillis();
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(current));
File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX);
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
pw.println();
dumpPhoneInfo(pw);
ex.printStackTrace();
pw.close();
}catch (Exception e) {
Logger.e(TAG + "dump crash info failed");
}
}
private void dumpPhoneInfo(PrintWriter pw) throws PackageManager.NameNotFoundException {
PackageManager pm = mContext.getPackageManager();
PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
pw.print("App version:");
pw.print(pi.versionName);
pw.print("-");
pw.println(pi.versionCode);
//Android版本号
pw.print("OS version:");
pw.print(Build.VERSION.RELEASE);
pw.print("-");
pw.println(Build.VERSION.SDK_INT);
// 手机制造商
pw.print("Vendor:");
pw.println(Build.MANUFACTURER);
// 手机型号
pw.print("Model:");
pw.println(Build.MODEL);
//cpu架构
pw.print("CPU ABI:");
pw.println(Build.CPU_ABI);
}
}
最后在Application中进行初始化
CrashHandler.getsInstance().init(this);
也可以通过tencent的bugly集成来满足开发需求地址为
bugly地址