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("
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="
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