1. 程式人生 > >Android 對程式異常崩潰的捕捉

Android 對程式異常崩潰的捕捉

由於Android裝置各異,第三方定製的Android系統也非常多,我們不可能對所有的裝置場景都進行測試,因而開發一款完全無bug的應用幾乎是不可能的任務,那麼當應用在使用者的裝置上Force Close時,我們是不是可以捕獲這個錯誤,記錄使用者的裝置資訊,然後讓使用者選擇是否反饋這些堆疊資訊,通過這種bug反饋方式,我們可以有針對性地對bug進行修復。

當我們的的應用由於執行時異常導致Force Close的時候,可以設定主執行緒的UncaughtExceptionHandler,實現捕獲執行時異常的堆疊資訊。同時使用者可以把堆疊資訊通過傳送郵件的方式反饋給我們。下面是實現的程式碼:

程式碼下載請按此

例子:點選按鈕後,會觸發一個NullPointerException的執行時異常,這個例子實現了捕獲執行時異常,傳送郵件反饋裝置和堆疊資訊的功能。

介面1(觸發執行時異常)

\
介面2(傳送堆疊資訊)

 \

TestActivity.java

view plain
package com.zhuozhuo; 
 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.lang.Thread.UncaughtExceptionHandler; 
 
import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.EditText; 
import android.widget.TextView; 
 
public class TestActivity extends Activity { 
    /** Called when the activity is first created. */ 
 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {//給主執行緒設定一個處理執行時異常的handler 
 
            @Override 
            public void uncaughtException(Thread thread, final Throwable ex) { 
 
                StringWriter sw = new StringWriter(); 
                PrintWriter pw = new PrintWriter(sw); 
                ex.printStackTrace(pw); 
                 
                StringBuilder sb = new StringBuilder(); 
                 
                sb.append("Version code is "); 
                sb.append(Build.VERSION.SDK_INT + "\n");//裝置的Android版本號 
                sb.append("Model is "); 
                sb.append(Build.MODEL+"\n");//裝置型號 
                sb.append(sw.toString()); 
 
                Intent sendIntent = new Intent(Intent.ACTION_SENDTO); 
                sendIntent.setData(Uri.parse("

mailto:[email protected]"));//傳送郵件異常到[email protected]郵箱 
                sendIntent.putExtra(Intent.EXTRA_SUBJECT, "bug report");//郵件主題 
                sendIntent.putExtra(Intent.EXTRA_TEXT, sb.toString());//堆疊資訊 
                startActivity(sendIntent); 
                finish(); 
            } 
        }); 
         
        findViewById(R.id.button).setOnClickListener(new OnClickListener() { 
             
            @Override 
            public void onClick(View v) { 
                Integer a = null; 
                a.toString();//觸發nullpointer執行時錯誤 
                 
            } 
        }); 
         
    } 

main.xml
view plain
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="
http://schemas.android.com/apk/res/android

    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <TextView android:layout_width="fill_parent" 
        android:layout_height="wrap_content" android:text="@string/hello" /> 
    <EditText android:id="@+id/editText1" android:layout_width="match_parent" 
        android:text="點選按鈕觸發執行時異常" android:layout_height="wrap_content" 
        android:layout_weight="1" android:gravity="top"></EditText> 
    <Button android:text="按鈕" android:id="@+id/button
        android:layout_width="wrap_content" android:layout_height="wrap_content" 
        android:layout_gravity="center_horizontal"></Button> 
</LinearLayout> 


相關推薦

Android 程式異常崩潰捕捉

由於Android裝置各異,第三方定製的Android系統也非常多,我們不可能對所有的裝置場景都進行測試,因而開發一款完全無bug的應用幾乎是不可能的任務,那麼當應用在使用者的裝置上Force Close時,我們是不是可以捕獲這個錯誤,記錄使用者的裝置資訊,然後讓使用者選擇是否反饋這些堆疊資訊,通過這

android 應用程式異常崩潰捕捉

import java.io.BufferedReader;  import java.io.File;  import java.io.FileInputStream;  import java.io.FileNotFoundException;  import java

程式異常崩潰捕捉-dmp檔案及Windbg分析

#include <dbghelp.h>       #include <shellapi.h>       #include <shlobj.h>                     // 自定義的exectpion filter       LONG WINAPI

Android 全域性程式異常崩潰捕捉

以下為異常捕捉處理程式碼: import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.F

程式異常崩潰後用windbg輔助除錯解決的經驗

狀況:我的程式呼叫別人的庫做 檔案寫入工作。           在這一過程中出現異常,程式崩潰。           經反覆檢查,認為自己的程式沒有錯,但無法判斷在別人庫裡哪裡有錯。   &

qt處理程式異常崩潰

程式難免會有異常崩潰的時候,重要的是在崩潰時能及時把重要的資料儲存好,將損失減少。 儲存資料僅是拯救措施,更重要的是找到錯誤的根源。若能在崩潰的同一時候,程式自己主動記錄下崩潰時的執行資訊,將有助於修正工作。微軟提供了“DbgHelp”錯誤除錯技術。呼叫相關功能就可以儲

Qt程式異常崩潰處理技巧(Win)

     文章轉載來自     http://www.cnblogs.com/lcchuguo/p/5177715.html     作者 lcchuguo 首先,程式難免會有異常崩潰的時候。重要的是在崩潰時能及時把重要的資料儲存好,將損失減少。 SetUnhandl

universal-image-loader載入圖片,程式異常崩潰,圖片不在載入顯示問題

主要是發現universal-image-loader 用來在載入圖片的時候,如果程式異常崩潰了,那麼在自動重啟程式的時候,universal-image-loader會出現在快取讀取圖片的問題,解決方式為 new DisplayImageOptions.Builde

Android 應用程式崩潰日誌捕捉

程式崩潰是應用迭代中不可避免的問題,即使有著5年或者10年經驗的程式猿也無法完全保證自己的程式碼沒有任何的bug導致崩潰,現在有一些第三方平臺可以幫助我們蒐集應用程式的崩潰,比如友盟,詳情如下圖 雖然能夠看到崩潰的日誌以及機型等,但還是不是很方便,如果需要精確定位的話需要使用者提供崩潰的時間點、機型

Android平臺程式崩潰的型別及原因列舉

Android平臺程式崩潰大家都應該遇到過,force close和ANR應該是大家遇到較多的。 這裡把Android平臺程式崩潰的各種型別做一個簡述和原因列舉。 1.ANR(可見ANR): 發生場景:應用發生ANR。 崩潰症狀:系統彈出視窗詢問使用者選擇“Force Close”或

Android ANR程式無響應及其異常定位

博主地址:https://blog.csdn.net/lijinzhao3141592/article/details/80825969 android 開發過程中有時會遇見專案無響應異常,這類異常異常並不像Crash那樣列印log資訊,因此無法被捕獲。所以來看一下這個ANR異常的出現原因及其定

Android系統休眠程式的影響以及處理

Android系統在使用者長時間不操作時,為了節省資源,系統會選擇休眠。在休眠過程中自定義的Timer、Handler、Thread、Service等都會暫停。而有時候這種機制會影響到我們程式的正常執行。 1、獲取電源鎖,並在執行完畢釋放電源鎖 public class WakeLo

Android 如何收集已釋出程式崩潰資訊

class MythouCrashHandler implements UncaughtExceptionHandler {     private static final String TAG = "MythouCrashHandler---->";     private UncaughtEx

Android app實現靜默安裝並自動開啟,實現開機自啟動,異常崩潰重新啟動,定時關機等

現在很多公司都開始做智慧硬體產品,主要是在Android開發板上面開發應用app,尤其這兩年物聯網越來越火,這方面的需求越來越多,目前公司也是做智慧公交站臺的,需要開發的app實現開機自啟動,異常崩潰重新啟動,版本升級靜默安裝並自動開啟,定時開關機,感覺都要跟Android系

cocos2dx獲取Android異常崩潰堆疊資訊

adb logcat | "C:/android-ndk-r9d/ndk-stack" -sym "C:/Users/DaDa_/Desktop/cocos2d-2.1rc0-x-2.1.3/BullFight/proj.android/obj/local/armeabi"

Android CrashHandler 自定義崩潰異常捕獲

當APP 異常崩潰時,使用Toast提示,並關閉APP,收集錯誤資訊儲存並上報 需求:由於android機型的碎片化,我們在開發時無法對所以機型進行測試,因此在可能的崩潰發生時,我們應當做一些事情來為我們提供更多資訊以便改進,同時也能然崩潰發生時的使用者體驗得

Android:Consumer closed input channel or an error occurred. events=0x8異常導致程式異常終止問題解決方案

程式異常終止但沒有任何異常資訊,只捕獲到Log裡面下面的有用資訊: 09-19 21:57:02.222: W/InputDispatcher(153): channel '410c5958 com.nju.ecg/com.nju.ecg.wave.WaveScreen

wpf 程式異常捕獲,而不崩潰退出

        public App()         {             DispatcherUnhandledException += App_DispatcherUnhandledException;         }         void App_

WPF異常捕獲,並使程式崩潰

在.NET中,我們使用try-catch-finally來處理異常。但,當一個Exception丟擲,丟擲Exception的程式碼又沒有被try包圍時,程式就崩潰了。 這些異常往往是你沒有注意到的。在WPF中,提供了一種處理這些個異常的方式。 舉例來說明。 1.先

Android Hook程式庫函式進行HOOK

1、Hook原理 Hook技術,其本質就是劫持函式的呼叫,但是由於處於Linux使用者態,每個程序都有自己獨立的程序空間,所以必須先注入到所要Hook的程序空間,修改其記憶體中的程序程式碼,替換其過程表的符號地址。在Android中,一般是通過ptra