Created
April 13, 2016 02:54
-
-
Save yuantang/754e0362cc79852f88d702bc7455cd15 to your computer and use it in GitHub Desktop.
Crash收集器
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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