收集android的崩潰
主要步驟:
-
實現UncaughtExceptionHandler
我們需要實現UncaughtExceptionHandler接口中的uncaughtException方法。該方法中最常見的操作就是讀取崩潰的stacktrace,然后上報服務器數據便於分析。
實現代碼public class SimpleUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { private static final String LOGTAG = "SimpleUncaughtExceptionHandler"; @Override public void uncaughtException(Thread thread, Throwable ex) { //讀取stacktrace信息 final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); ex.printStackTrace(printWriter); String errorReport = result.toString(); Log.i(LOGTAG, "uncaughtException errorReport=" + errorReport); } }
除此之外,還建議攜帶以下信息發送到服務器,幫助更快定位和重現問題。
- 設備唯一ID(基於IMEI或者Android ID等),方便根據用戶提供的id,查找崩潰的stacktrace
- 設備語言與區域 方便重現
- 應用的版本號
- 設備的系統版本
- 設備類型,如平板,手機,TV等
- 崩潰發生的時間等
-
注冊默認的異常處理
public class DroidApplication extends Application { private static final String LOGTAG = "DroidApplication"; @Override public void onCreate() { super.onCreate(); Log.i(LOGTAG, "onCreate"); Thread.setDefaultUncaughtExceptionHandler(new SimpleUncaughtExceptionHandler()); } }
有些崩潰不想讓用戶感知->屏蔽系統彈窗
一般采取策略是主線程彈窗,其他線程不彈窗策略
-
首先判斷進程是不是主線程
//獲取當前進程的名稱 public static String getProcessName(Context appContext) { String currentProcessName = ""; int pid = android.os.Process.myPid(); ActivityManager manager = (ActivityManager) appContext.getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) { if (processInfo.pid == pid) { currentProcessName = processInfo.processName; break; } } return currentProcessName; } //判斷主進程,對比進程名是否和包名相同 mAppContext.getPackageName().equals(processName);
//其他線程 <service android:name=".DroidService" android:process=":service"></service>
//其對應的完整進程名為com.droidyue.avoidforceclosedemo:service,我們判斷可以使用如下代碼 "com.droidyue.avoidforceclosedemo:service".equals(processName);
-
不彈窗處理
不彈框的需要做的就是不調用Android默認的異常處理,當異常出現時,收集完信息,執行進程kill即可。android.os.Process.killProcess(android.os.Process.myPid());
-
主進程保持彈窗處理
/** * 首先需要獲得Android默認的異常處理,在設置自定的異常處理之前,將Android默認處理保存起來。如下是在自定義異常處理的構造方法中獲取 Android默認處理 */ public DroidUncaughtExceptionHandler(Context context) { mAppContext = context.getApplicationContext(); mDefaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); } //然后在異常處理方法uncaughtException中調用如下方法 mDefaultExceptionHandler.uncaughtException(thread, ex);
本示例源碼,存放在Github,地址為
AvoidForceCloseDemo
引用:http://droidyue.com/blog/2015/12/06/practise-about-crash-in-android/?utm_source=tuicool&utm_medium=referral