Skip to content

Instantly share code, notes, and snippets.

@yuantang
Created April 13, 2016 02:54
Show Gist options
  • Save yuantang/754e0362cc79852f88d702bc7455cd15 to your computer and use it in GitHub Desktop.
Save yuantang/754e0362cc79852f88d702bc7455cd15 to your computer and use it in GitHub Desktop.
Crash收集器
package com.coder.someproject;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* User: tom
* Date: 2016-03-12
* Time: 14:53
* <p/>
* 异常处理器
*/
public class CrashHandler {
private static final String TAG = "CrashHandler";
private UncaughtExceptionHandler mDefaultCrashHandler;
private Context mContext;
/** 初始化未捕捉的异常处理器 */
public void init(Context context) {
this.mContext=context;
mDefaultCrashHandler=new Thread.UncaughtExceptionHandler(){
@Override
public void uncaughtException(Thread thread, Throwable ex) {
Log.e(TAG, "未捕捉的异常:", ex);
new Thread() {
@Override
public void run() {
Looper.prepare();
Toast.makeText(mContext, "呀,程序挂了,真的非常对不起!", Toast.LENGTH_LONG).show();
Looper.loop();
}
}.start();
try {
if (Config.isDebug){
saveException(ex);
}else {
uploadExceptionToServer(ex);
}
Log.e(TAG, "未捕捉的异常保存成功");
} catch (Exception e1) {
Log.e(TAG, "未捕捉的异常保存失败");
e1.printStackTrace();
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.e(TAG, "prepare kill process");
android.os.Process.killProcess(android.os.Process.myPid());
Log.e(TAG, "prepare exit");
System.exit(1);
Log.e(TAG, "exited");
}
};
Thread.setDefaultUncaughtExceptionHandler(mDefaultCrashHandler);
}
/**
* 把错误保存起来,如果有sdCard,则保存到sdCard的缓存中,否则保存到内部存储的缓存中
* sdCard位置: /storage/emulated/0/Android/data/com.coder.someproject/cache/log/20151113_095811.log<br/>
* 内部存储位置:/data/data/com.coder.someproject/cache/log/20151113_180041.log
* @param ex
* @throws Exception
*/
private void saveException(Throwable ex) throws Exception {
File logDir = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
? mContext.getExternalCacheDir()
:mContext.getCacheDir();
logDir = new File(logDir, "log");
if (!logDir.exists()) {
logDir.mkdir();
}
File logFile = new File(logDir, new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.SIMPLIFIED_CHINESE).format(new Date()) + ".log");
Log.e("abc", "错误日记保存位置:" + logFile.getAbsolutePath());
try {
long current=System.currentTimeMillis();
String time=new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date(current));
PrintWriter pw=new PrintWriter(new BufferedWriter(new FileWriter(logFile)));
pw.println("time:"+time);
dumpPhoneInfo(pw);
pw.println();
ex.printStackTrace(pw);
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取当前应用和手机的信息
* @param pw
*/
private void dumpPhoneInfo(PrintWriter pw) {
PackageManager pm=mContext.getPackageManager();
try {
PackageInfo pi=pm.getPackageInfo(mContext.getPackageName(),PackageManager.GET_ACTIVITIES);
pw.print("App Version:");
pw.print(pi.versionName);
pw.print("_");
pw.println(pi.versionCode);
//Android 版本号
pw.print("OS Version:");
pw.print(Build.VERSION.RELEASE);
pw.print("_");
pw.println(Build.VERSION.SDK_INT);
//手机制造商信息
pw.print("Vendor:");
pw.println(Build.MANUFACTURER);
//手机型号
pw.print("Model:");
pw.println(Build.MODEL);
//cup架构
pw.print("CPU ABI:");
pw.println(Build.CPU_ABI);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
/**
* 将异常上传到服务器上,便于开发人员分析日志解决bug
* @param ex
*/
private void uploadExceptionToServer(Throwable ex) {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment