android崩潰日志收集


收集android的崩潰

主要步驟:

  1. 實現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等
    • 崩潰發生的時間等
  2. 注冊默認的異常處理

    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());
        }
    }
    

有些崩潰不想讓用戶感知->屏蔽系統彈窗

一般采取策略是主線程彈窗,其他線程不彈窗策略

  1. 首先判斷進程是不是主線程

    //獲取當前進程的名稱
    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);
    
  2. 不彈窗處理
    不彈框的需要做的就是不調用Android默認的異常處理,當異常出現時,收集完信息,執行進程kill即可。

    android.os.Process.killProcess(android.os.Process.myPid());
    
  3. 主進程保持彈窗處理

    /**
    * 首先需要獲得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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM