代碼:android崩潰日志收集和處理

? ? 用來處理android崩潰日志收集的代碼义郑,詳情的使用請(qǐng)轉(zhuǎn):android崩潰日志收集和處理

第一個(gè)類

/**

* 異常捕捉實(shí)現(xiàn)類

*/

public class ErrorCaughtimplements Thread.UncaughtExceptionHandler {

private ErrorHandleerrHandle;

//設(shè)置本程序的異常崩潰由此類處理

? ? public ErrorCaught(Application context){

Thread.UncaughtExceptionHandler uncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();

errHandle =new ErrorHandle(context , uncaughtExceptionHandler);

Thread.setDefaultUncaughtExceptionHandler(this);

}

//異常崩潰發(fā)生時(shí)調(diào)用的方法牧抽,這里面開始我們想要的操作,包括日志的手機(jī)和上傳等

? ? @Override

? ? public void uncaughtException(Thread thread, Throwable throwable) {

errHandle.excute(thread, throwable);

}

}

第二個(gè)類


/**

* 異常具體處理類

*/

public class ErrorHandle {

private Contextcontext;

private Thread.UncaughtExceptionHandleruncaughtExceptionHandler;

private FilecrashFile;

//新建的時(shí)候陈惰,隨即的開始建造崩潰文件夾和崩潰文件

? ? public ErrorHandle(Application context, Thread.UncaughtExceptionHandler uncaughtExceptionHandler) {

this.context = context;

this.uncaughtExceptionHandler = uncaughtExceptionHandler;

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

File file =new File(Environment.getExternalStorageDirectory(),"crashCollection");

if (!file.exists()) {

file.mkdirs();//創(chuàng)建崩潰捕捉所在文件夾

? ? ? ? ? ? }

crashFile =new File(file, getCrashFileName());

if (!crashFile.exists()) {

try {

crashFile.createNewFile();//創(chuàng)建崩潰捕捉文件

? ? ? ? ? ? ? ? }catch (IOException e) {

e.printStackTrace();

}

}

}

}

//用來執(zhí)行崩潰時(shí)具體的操作

? ? public void excute(Thread thread, Throwable throwable) {

CrashInforMationDetail crashInforMationDetail = CrashInforMationDetail.produce(throwable, thread,context);

crashInforMationDetail.writeToFile(crashFile);

signOut(thread, throwable);

}

//強(qiáng)制退出軟件

? ? public void signOut(Thread thread, Throwable throwable) {

if (uncaughtExceptionHandler !=null) {

uncaughtExceptionHandler.uncaughtException(thread, throwable);

}else {

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

System.exit(1);

}

}

//獲取崩潰文件名稱,具體是年月日組成的文件名

? ? private String getCrashFileName() {

StringBuilder stringBuilder =new StringBuilder();

Calendar calendar = Calendar.getInstance();

int year = calendar.get(Calendar.YEAR);

int month = calendar.get(Calendar.MONTH);

int date = calendar.get(Calendar.DATE);

stringBuilder.append("crash_");

stringBuilder.append(year +"-");

stringBuilder.append(month +"-");

stringBuilder.append(date);

stringBuilder.append(".txt");

return stringBuilder.toString();

}

}

第三個(gè)類

/**

* 獲取崩潰日志的具體內(nèi)容毕籽,這里做了兩個(gè)處理抬闯,一個(gè)是錯(cuò)誤信息輸入文件,一個(gè)是把錯(cuò)誤信息變成字符串

*/

public class CrashInforMationDetail {

private static StringcrashInfor;//崩潰日志的具體內(nèi)容

? ? private CrashInforMationDetail() {

}

//獲取錯(cuò)誤等信息

? ? public static CrashInforMationDetail produce(Throwable throwable, Thread thread, Context context) {

ByteArrayOutputStream out =new ByteArrayOutputStream();

PrintStream print =new PrintStream(out);

out.toString();

print.append("crahtime:" + System.currentTimeMillis()).append("\n");

print.append(getSysytemInfor());

print.append("theadName:" + thread.getName() +"\n").append("threadID:" + thread.getId() +"\n");

crashInfor =getSysytemInfor() +"threadName:" + thread.getName() +"\n" +"threadID:" + thread.getId() +"\n" +"ErrorInformation:" + throwable.getMessage();

print.append(throwable.getMessage()).append("\n");

StackTraceElement[] stackTrace = throwable.getStackTrace();

try {

for (int i =0; i < stackTrace.length; i++) {

StackTraceElement stackTraceElement = stackTrace[i];

String trace = stackTraceElement.toString();

print.append(trace +"\n");

crashInfor += trace +"\n";

}

}catch (Exception e) {

e.printStackTrace();

}

Log.d("crashInfor",crashInfor);

throwable.printStackTrace(print);

return new CrashInforMationDetail();

}

//把錯(cuò)誤信息填充進(jìn)崩潰文件中

? ? public void writeToFile(File file) {

PrintWriter printer =null;

try {

BufferedOutputStream out =new BufferedOutputStream(new FileOutputStream(file,true));

printer =new PrintWriter(out);

printer.println(crashInfor);

printer.flush();

}catch (IOException e) {

e.printStackTrace();

}finally {

if (printer !=null) {

printer.close();

}

}

}

//獲取手機(jī)的一些設(shè)備參數(shù)

? ? public static String getSysytemInfor() {

StringBuffer sb =new StringBuffer();

sb.append("主板:" + Build.BOARD +"\n");

sb.append("系統(tǒng)啟動(dòng)程序版本號(hào):" + Build.BOOTLOADER +"\n");

sb.append("系統(tǒng)定制商:" + Build.BRAND +"\n");

sb.append("cpu指令集:" + Build.CPU_ABI +"\n");

sb.append("cpu指令集2:" + Build.CPU_ABI2 +"\n");

sb.append("設(shè)置參數(shù):" + Build.DEVICE +"\n");

sb.append("顯示屏參數(shù):" + Build.DISPLAY +"\n");

sb.append("無線電固件版本:" + Build.getRadioVersion() +"\n");

sb.append("硬件識(shí)別碼:" + Build.FINGERPRINT +"\n");

sb.append("硬件名稱:" + Build.HARDWARE +"\n");

sb.append("HOST:" + Build.HOST +"\n");

sb.append("修訂版本列表:" + Build.ID +"\n");

sb.append("硬件制造商:" + Build.MANUFACTURER +"\n");

sb.append("版本:" + Build.MODEL +"\n");

sb.append("硬件序列號(hào):" + Build.SERIAL +"\n");

sb.append("手機(jī)制造商:" + Build.PRODUCT +"\n");

sb.append("描述Build的標(biāo)簽:" + Build.TAGS +"\n");

sb.append("TIME:" + Build.TIME +"\n");

sb.append("builder類型:" + Build.TYPE +"\n");

sb.append("USER:" + Build.USER +"\n");

return sb.toString();

}

public String getString() {

return crashInfor;

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末关筒,一起剝皮案震驚了整個(gè)濱河市溶握,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒸播,老刑警劉巖睡榆,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異袍榆,居然都是意外死亡肉微,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蜡塌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碉纳,“玉大人,你說我怎么就攤上這事馏艾±筒埽” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵琅摩,是天一觀的道長(zhǎng)铁孵。 經(jīng)常有香客問我,道長(zhǎng)房资,這世上最難降的妖魔是什么蜕劝? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上岖沛,老公的妹妹穿的比我還像新娘暑始。我一直安慰自己,他們只是感情好婴削,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布廊镜。 她就那樣靜靜地躺著,像睡著了一般唉俗。 火紅的嫁衣襯著肌膚如雪嗤朴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天虫溜,我揣著相機(jī)與錄音雹姊,去河邊找鬼。 笑死衡楞,一個(gè)胖子當(dāng)著我的面吹牛吱雏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播寺酪,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坎背,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼替劈!你這毒婦竟也來了寄雀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤陨献,失蹤者是張志新(化名)和其女友劉穎盒犹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眨业,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡急膀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了龄捡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卓嫂。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖聘殖,靈堂內(nèi)的尸體忽然破棺而出晨雳,到底是詐尸還是另有隱情,我是刑警寧澤奸腺,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布餐禁,位于F島的核電站,受9級(jí)特大地震影響突照,放射性物質(zhì)發(fā)生泄漏帮非。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望末盔。 院中可真熱鬧筑舅,春花似錦、人聲如沸庄岖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隅忿。三九已至心剥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間背桐,已是汗流浹背优烧。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留链峭,地道東北人畦娄。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弊仪,于是被迫代替她去往敵國(guó)和親熙卡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容