日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

安卓软件错误log_Android编程实现捕获程序异常退出时的错误log信息功能详解

發布時間:2024/7/23 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓软件错误log_Android编程实现捕获程序异常退出时的错误log信息功能详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文實例講述了Android編程實現捕獲程序異常退出時的錯誤log信息功能。分享給大家供大家參考,具體如下:

很多時候我們程序無緣無故的就掛掉了,讓我們一頭霧水,如果剛好我們在調試,那我們可以通過錯誤log來查看是什么原因引起的程序崩潰。但是當我們把程序發別人使用時,就沒那么好運了,那我們要怎么樣才能捕獲到那個錯誤異常呢?還好Android給我們提供了UncaughtExceptionHandler 這個類,我們可以通過實現這個類的接口,來全局捕獲那個讓程序崩掉的錯誤log信息。可以將錯誤的log保存在本地,也可以發送給服務器后臺。下面來看下UncaughtExceptionHandler 的實現類CrashHandler吧。

CrashHandler.Java

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

import java.io.StringWriter;

import java.io.Writer;

import java.lang.Thread.UncaughtExceptionHandler;

import java.lang.reflect.Field;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Locale;

import android.content.Context;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

import android.content.pm.PackageManager.NameNotFoundException;

import android.os.Build;

import android.os.Environment;

import android.os.Looper;

import android.util.Log;

import android.widget.Toast;

public class CrashHandler implements UncaughtExceptionHandler {

private static final String TAG = CrashHandler.class.getSimpleName();

private static final String SINGLE_RETURN = "\n";

private static final String SINGLE_LINE = "--------------------------------";

private static CrashHandler mCrashHandler;

private Context mContext;

private UncaughtExceptionHandler mDefaultHandler;

private StringBuffer mErrorLogBuffer = new StringBuffer();

/**

* 獲取CrashHandler實例,單例模式。

*

* @return 返回CrashHandler實例

*/

public static CrashHandler getInstance() {

if (mCrashHandler == null) {

synchronized (CrashHandler.class) {

if (mCrashHandler == null) {

mCrashHandler = new CrashHandler();

}

}

}

return mCrashHandler;

}

public void init(Context context) {

mContext = context;

// 獲取系統默認的uncaughtException處理類實例

mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();

// 設置成我們處理uncaughtException的類

Thread.setDefaultUncaughtExceptionHandler(this);

}

@Override

public void uncaughtException(Thread thread, Throwable ex) {

Log.d(TAG, "uncaughtException:" + ex);

if (!handleException(ex) && mDefaultHandler != null) {

// 如果用戶沒有處理異常就由系統默認的異常處理器來處理

mDefaultHandler.uncaughtException(thread, ex);

} else {

try {

Thread.sleep(3000);

} catch (InterruptedException e) {

e.printStackTrace();

}

android.os.Process.killProcess(android.os.Process.myPid());

}

}

//處理異常事件

private boolean handleException(Throwable ex) {

if (ex == null) {

return false;

}

new Thread(new Runnable() {

@Override

public void run() {

Looper.prepare();

Toast.makeText(mContext, "很抱歉,程序出現異常,即將退出.", Toast.LENGTH_SHORT)

.show();

Looper.loop();

}

}).start();

// 收集設備參數信息

collectDeviceInfo(mContext);

// 收集錯誤日志

collectCrashInfo(ex);

// 保存錯誤日志

saveErrorLog();

//TODO: 這里可以加一個網絡的請求,發送錯誤log給后臺

// sendErrorLog();

return true;

}

//保存日志到/mnt/sdcard/AppLog/目錄下,文件名已時間yyyy-MM-dd_hh-mm-ss.log的形式保存

private void saveErrorLog() {

if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss", Locale.getDefault());

String format = sdf.format(new Date());

format += ".log";

String path = Environment.getExternalStorageDirectory().getPath()+"/AppLog/";

File file = new File(path);

if (!file.exists()){

file.mkdirs();

}

FileOutputStream fos = null;

try {

fos = new FileOutputStream(path+format);

fos.write(mErrorLogBuffer.toString().getBytes());

fos.flush();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fos != null) {

try {

fos.close();

fos = null;

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

//收集錯誤信息

private void collectCrashInfo(Throwable ex) {

Writer info = new StringWriter();

PrintWriter printWriter = new PrintWriter(info);

ex.printStackTrace(printWriter);

Throwable cause = ex.getCause();

while (cause != null) {

cause.printStackTrace(printWriter);

cause = cause.getCause();

}

String result = info.toString();

printWriter.close();

//將錯誤信息加入mErrorLogBuffer中

append("", result);

mErrorLogBuffer.append(SINGLE_LINE + SINGLE_RETURN);

Log.d(TAG, "saveCrashInfo2File:" + mErrorLogBuffer.toString());

}

//收集應用和設備信息

private void collectDeviceInfo(Context context) {

//每次使用前,清掉mErrorLogBuffer里的內容

mErrorLogBuffer.setLength(0);

mErrorLogBuffer.append(SINGLE_RETURN + SINGLE_LINE + SINGLE_RETURN);

//獲取應用的信息

PackageManager pm = context.getPackageManager();

try {

PackageInfo pi = pm.getPackageInfo(context.getPackageName(),

PackageManager.GET_ACTIVITIES);

if (pi != null) {

append("versionCode", pi.versionCode);

append("versionName", pi.versionName);

append("packageName", pi.packageName);

}

} catch (NameNotFoundException e) {

e.printStackTrace();

}

mErrorLogBuffer.append(SINGLE_LINE + SINGLE_RETURN);

//獲取設備的信息

Field[] fields = Build.class.getDeclaredFields();

getDeviceInfoByReflection(fields);

fields = Build.VERSION.class.getDeclaredFields();

getDeviceInfoByReflection(fields);

mErrorLogBuffer.append(SINGLE_LINE + SINGLE_RETURN);

}

//獲取設備的信息通過反射方式

private void getDeviceInfoByReflection(Field[] fields) {

for (Field field : fields) {

try {

field.setAccessible(true);

append(field.getName(), field.get(null));

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

}

}

//mErrorLogBuffer添加友好的log信息

private void append(String key, Object value) {

mErrorLogBuffer.append("" + key + ":" + value + SINGLE_RETURN);

}

}

在application中的使用非常簡單,只要init就好了,之后我們就只要等異常出現吧。

CrashApplication.java

import android.app.Application;

public class CrashApplication extends Application{

@Override

public void onCreate() {

super.onCreate();

CrashHandler.getInstance().init(this);

}

}

不要忘記在AndroidManifest.xml聲明我們的CrashApplication 。

AndroidManifest.xml

android:allowBackup="true"

android:name=".CrashApplication"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

android:name="com.example.crashtestdemo.MainActivity"

android:label="@string/app_name" >

希望本文所述對大家Android程序設計有所幫助。

總結

以上是生活随笔為你收集整理的安卓软件错误log_Android编程实现捕获程序异常退出时的错误log信息功能详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。