應用的crash是讓人很蛋疼的問題,在開發測試的時候還能根據日志輸出什么的進行排查修復,但是應用發布以后,用戶的隨意性訪問出現測試時未知的Bug導致我們的程序crash,此時我們是無法直接獲取的錯誤log的,也就無法修復Bug。所以這時候我們就需要一個能全局捕獲異常,并且將這個異常信息上傳到服務器的功能,以便根據收集到的異常信息,在后期的版本中進行修復,改善用戶體驗。
UncaughtExceptionHandler
實現這個功能我們只要自定義一個實現了Thread.UncaughtExceptionHandler接口的異常處理類,并在應用初始化的時候注冊這個類就可以了。
public class CrashHandler implements Thread.UncaughtExceptionHandler
{
private static CrashHandler ourInstance = new CrashHandler();
public static CrashHandler getInstance()
{
return ourInstance;
}
private CrashHandler()
{
}
@Override
public void uncaughtException(Thread thread, Throwable ex)
{
//TODO
}
}
這邊呢,我們一般將CrashHandler寫成單例模式,重寫上面的uncaughtException方法自定義對異常的處理,然后呢,Application或者Activity的onCreate方法里注冊這個異常處理類就可以了
Thread.setDefaultUncaughtExceptionHandler(CrashHandler.getInstance());
這邊呢再貼一點uncaughtException中處理異常的代碼,給大家參考一下
public void uncaughtException(Thread thread, Throwable ex)
{
dumpEx2SdCard(ex);//將錯誤日志導入到SD卡中
upEx2server();//將日志上傳到服務器
if (mDefaultHandler != null)
{
mDefaultHandler.uncaughtException(thread, ex);
}
else
{
Process.killProcess(Process.myPid());//做一些退出或者提醒處理
}
}
private void dumpEx2SdCard(Throwable ex)
{
//...
PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(file)));
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);
ex.printStackTrace(printWriter);
printWriter.print(ex.getCause());
printWriter.print(time);
printWriter.print(ex.getMessage());
printWriter.print("APP版本:"+ packageInfo.versionName+"_"+packageInfo.versionCode);
printWriter.print("android 版本:"+ Build.VERSION.RELEASE+"_"+Build.VERSION.SDK_INT);
printWriter.print("制造商:"+Build.MANUFACTURER);
//...
}
一般這邊的代碼都是將錯誤日志和設備信息寫到SD卡中然后再上傳到服務器中,具體實現就不貼那么多的代碼啦,注重流程就是啦。
開發者服務
集成一些第三方服務可以大大的加快我們的開發速度,諸如此類的統計功能我們只要集成一些像百度云推送,極光推送,友盟+等等的第三方SDK,然后做一些初始化,幾行代碼就搞定了。而且這些平臺提供的各種強大方便的服務,確實是我們開發者的福音。像下圖展示的友盟應用管理中心,各種統計功能基本上都能滿足我們的需求了。
再推薦一個網站。DevStore 移動互聯網企業運營解決方案整合平臺這里面總結了各種強大的第三方服務平臺,建議收藏哦。