一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Android - Android 如何收集已發(fā)布程序的崩潰信息

Android 如何收集已發(fā)布程序的崩潰信息

2021-02-04 14:33Android開發(fā)網(wǎng) Android

下面我就說說如何收集程序運(yùn)行過程的異常信息。需要的朋友可以過來參考下

我們寫程序的時(shí)候都希望能寫出一個(gè)沒有任何Bug的程序,期望在任何情況下都不會(huì)發(fā)生程序崩潰。不過理想是豐滿的,現(xiàn)實(shí)是骨感的。沒有一個(gè)程序員能保證自己寫的程序絕對(duì)不會(huì)出現(xiàn)異常崩潰。特別是針對(duì)用戶數(shù)達(dá)到幾十萬幾百萬的程序,當(dāng)你用戶數(shù)達(dá)到一定數(shù)量級(jí)后,就算你的程序出現(xiàn)個(gè)別異常崩潰情況也不用驚訝。

既然我們寫的程序都有可能發(fā)生異常崩潰,如果是還沒發(fā)布的程序,我們可以通過測(cè)試抓取Log來分析。不過針對(duì)已經(jīng)發(fā)布的程序,我們沒法重現(xiàn)現(xiàn)象,所以讓用戶反饋程序異常信息就很重要。下面我們說說如何收集程序運(yùn)行過程的異常信息。

1、Android異常捕獲接口

復(fù)制代碼 代碼如下:

//當(dāng)線程因未捕獲的異常而突然終止時(shí),調(diào)用處理程序的接口
static interface UncaughtExceptionHandler


2、設(shè)置線程捕獲異常
從上面的接口我們可以看到,這個(gè)接口是針對(duì)線程來說,也就是說我們?nèi)绻枰O(jiān)控某個(gè)線程運(yùn)行情況,只要把這個(gè)接口實(shí)現(xiàn)了,然后把監(jiān)控方法設(shè)置到具體的線程里面即可。一般來說,我們最需要監(jiān)控的就是我們的UI線程也就是主線程。

復(fù)制代碼 代碼如下:

//設(shè)置當(dāng)線程由于未捕獲到異常而突然終止,并且沒有為該線程定義其他處理程序時(shí)所調(diào)用的默認(rèn)處理程序。
static void setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)


3、UncaughtExceptionHandler 實(shí)例

復(fù)制代碼 代碼如下:

class MythouCrashHandler implements UncaughtExceptionHandler
{
    private static final String TAG = "MythouCrashHandler---->";
    private UncaughtExceptionHandler defaultUEH;
  //構(gòu)造函數(shù),獲取默認(rèn)的處理方法
    public MythouCrashHandler()
    {
        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    }
  //這個(gè)接口必須重寫,用來處理我們的異常信息
    @Override
    public void uncaughtException(Thread thread, Throwable ex)
    {
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
     //獲取跟蹤的棧信息,除了系統(tǒng)棧信息,還把手機(jī)型號(hào)、系統(tǒng)版本、編譯版本的唯一標(biāo)示
        StackTraceElement[] trace = ex.getStackTrace();
        StackTraceElement[] trace2 = new StackTraceElement[trace.length+3];
        System.arraycopy(trace, 0, trace2, 0, trace.length);
        trace2[trace.length+0] = new StackTraceElement("Android", "MODEL", android.os.Build.MODEL, -1);
        trace2[trace.length+1] = new StackTraceElement("Android", "VERSION", android.os.Build.VERSION.RELEASE, -1);
        trace2[trace.length+2] = new StackTraceElement("Android", "FINGERPRINT", android.os.Build.FINGERPRINT, -1);
    //追加信息,因?yàn)楹竺鏁?huì)回調(diào)默認(rèn)的處理方法
        ex.setStackTrace(trace2);
        ex.printStackTrace(printWriter);
     //把上面獲取的堆棧信息轉(zhuǎn)為字符串,打印出來
        String stacktrace = result.toString();
        printWriter.close();
        Log.e(TAG, stacktrace);
        //這里把剛才異常堆棧信息寫入SD卡的Log日志里面
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
        {
            String sdcardPath = Environment.getExternalStorageDirectory().getPath();
            writeLog(stacktrace, sdcardPath + "/mythou");
        }
        defaultUEH.uncaughtException(thread, ex);
    }
  //寫入Log信息的方法,寫入到SD卡里面
    private void writeLog(String log, String name)
    {
        CharSequence timestamp = DateFormat.format("yyyyMMdd_kkmmss", System.currentTimeMillis());
        String filename = name + "_" + timestamp + ".log";
        try
        {
            FileOutputStream stream = new FileOutputStream(filename);
            OutputStreamWriter output = new OutputStreamWriter(stream);
            BufferedWriter bw = new BufferedWriter(output);
       //寫入相關(guān)Log到文件
            bw.write(log);
            bw.newLine();
            bw.close();
            output.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}


上面就是實(shí)現(xiàn)了獲取處理跟蹤信息的方法,上面的方法是參照VLC的異常處理機(jī)制編寫的。做了一些簡單修改。不過上面只是獲取了異常信息,如果程序安裝到用戶機(jī)器上,我們沒法獲取到這些信息,總不能讓用戶把機(jī)器拿過來給你,然后你把Log拷貝出來吧。(這個(gè)我以前做嵌入式的時(shí)候到試過,讓客戶把機(jī)器拿過來,拷貝里面的Log,那時(shí)候做的機(jī)器無法聯(lián)網(wǎng)。現(xiàn)在想起來都糾結(jié),O(∩_∩)O哈哈~) 為了不再糾結(jié),我們需要一個(gè)可以把Log發(fā)送到我們服務(wù)器的功能,下面是把一個(gè)服務(wù)信息發(fā)送到我們指定服務(wù)器功能。

3、通過網(wǎng)絡(luò)發(fā)送Log

復(fù)制代碼 代碼如下:

   public class SendCrashLog extends AsyncTask<String, String, Boolean>
    {
        public SendCrashLog() { }
        @Override
        protected Boolean doInBackground(String... params)
        {
            if (params[0].length() == 0)
                return false;
            HttpClient httpClient = new DefaultHttpClient();
       //你的服務(wù)器,這里只是舉個(gè)例子。把異常信息當(dāng)作http請(qǐng)求發(fā)送到服務(wù)器
            HttpPost httpPost = new HttpPost("http://www.mythou/getlog.php");
       //這里把相關(guān)的異常信息轉(zhuǎn)為http post請(qǐng)求的數(shù)據(jù)參數(shù)
            try {
                List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
                nameValuePairs.add(new BasicNameValuePair("model", params[0]));
                nameValuePairs.add(new BasicNameValuePair("device", params[1]));
                httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
         //發(fā)送相關(guān)請(qǐng)求信息
                httpClient.execute(httpPost);
            } catch (ClientProtocolException e) {
                e.printStackTrace();
                return false;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
            Log.d(TAG, "Device model sent.");
            return true;
        }
        @Override
        protected void onPostExecute(Boolean result) {
        }
    }


上面就是我上一篇文章講的異步任務(wù)的使用,我們?cè)诋惒饺蝿?wù)里面編寫了一個(gè)發(fā)送http請(qǐng)求的服務(wù),用來把相關(guān)的異常信息發(fā)送到我們指定的服務(wù)器上面。這個(gè)需要你的服務(wù)器解析發(fā)送的http請(qǐng)求,這個(gè)難度不大,一般做個(gè)web的人都知道如何做。在上面的異常處理里面再調(diào)用這里的發(fā)送方法:

復(fù)制代碼 代碼如下:

SendCrashLogsendLog = new SendCrashLog();
//剛才的異常信息字符串
sendLog .execute(stacktrace);


通過上面的方法就可以把異常信息發(fā)送到指定的服務(wù)器,也就可以跟蹤客戶使用軟件的情況,方便我們修改程序的問題。當(dāng)然這個(gè)信息收集一般都隱私和后臺(tái)流量問題,這個(gè)需要在程序里面做點(diǎn)提示,免得背上流氓軟件的罵名。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品成人亚洲 | 沟厕okn系列在线播放 | 精品国产欧美一区二区五十路 | china国产bbw| 亚洲 欧美 国产 在线 日韩 | 肉文np高h | 亚洲精品www久久久久久久软件 | 交换年轻夫妇HD中文字幕 | 亚洲网色| 国产精品露脸国语对白99 | 日本h乱淫动漫在线观看 | 欧美视频一区二区三区在线观看 | 加勒比一本大道香蕉在线视频 | 国模人体aⅴ | 日本剧情片在线播放中文版 | 欧美同性猛男野外gay免费 | 香蕉精品高清在线观看视频 | 欧美破处摘花 | 免费一级特黄特色大片 | 日本阿v在线播放 | 欧美特黄aaaaaa | 欧美久久一区二区三区 | 日本中年japanesebear | 成人影音先锋 | 亚洲品质水蜜桃 | 色悠久久久 | 非洲一级毛片又粗又长aaaa | 欧美精品国产一区二区 | 99热精品成人免费观看 | 国产午夜精品一区二区 | 午夜爱爱爱爱爽爽爽视频网站 | 性俄罗斯xxxxxhd | 日韩在线免费播放 | 午夜国产 | 国产1区2区三区不卡 | 日韩大片在线 | 无限在线观看免费入口 | 免费在线观看中文字幕 | 成人免费观看网欧美片 | 波多野结衣两女调教 | 顶级欧美做受xxx000大乳 |