返回

android-code-程序异常处理与记录log

发布时间:2022-11-10 04:23:08 252
# android# 信息

这里是分析的vlc的异常处理。

1,设置当前线程的异常处理函数

 

Thread.setDefaultUncaughtExceptionHandler(new VLCCrashHandler());

2,在 VLCCrashHandler 中处理异常

public class VLCCrashHandler implements UncaughtExceptionHandler {

private static final String TAG = "VLC/VlcCrashHandler";

private UncaughtExceptionHandler defaultUEH;

public VLCCrashHandler() {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
}

@Override
public void uncaughtException(Thread thread, Throwable ex) {

final Writer result = new StringWriter();
final PrintWriter printWriter = new PrintWriter(result);

// Inject some info about android version and the device, since google can't provide them in the developer console
StackTraceElement[] trace = ex.getStackTrace();
StackTraceElement[] trace2 = new StackTraceElement[trace.length+3];
System.arraycopy(trace, 0, trace2, 0, trace.length);
trace2[trace.length+0] = new StackTraceElement("Android", "MODEL", android.os.Build.MODEL, -1);
trace2[trace.length+1] = new StackTraceElement("Android", "VERSION", android.os.Build.VERSION.RELEASE, -1);
trace2[trace.length+2] = new StackTraceElement("Android", "FINGERPRINT", android.os.Build.FINGERPRINT, -1);
ex.setStackTrace(trace2);

ex.printStackTrace(printWriter);
String stacktrace = result.toString();
printWriter.close();
Log.e(TAG, stacktrace);

// Save the log on SD card if available
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
String sdcardPath = Environment.getExternalStorageDirectory().getPath();
writeLog(stacktrace, sdcardPath + "/vlc_crash");//记录日志
writeLogcat(sdcardPath + "/vlc_logcat");//记录日志
}

defaultUEH.uncaughtException(thread, ex);
}

private void writeLog(String log, String name) {
CharSequence timestamp = DateFormat.format("yyyyMMdd_kkmmss", System.currentTimeMillis());
String filename = name + "_" + timestamp + ".log";

FileOutputStream stream;
try {
stream = new FileOutputStream(filename);
} catch (FileNotFoundException e) {
e.printStackTrace();
return;
}

OutputStreamWriter output = new OutputStreamWriter(stream);
BufferedWriter bw = new BufferedWriter(output);

try {
bw.write(log);
bw.newLine();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bw.close();
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

private void writeLogcat(String name) {
CharSequence timestamp = DateFormat.format("yyyyMMdd_kkmmss", System.currentTimeMillis());
String filename = name + "_" + timestamp + ".log";
try {
Logcat.writeLogcat(filename);
} catch (IOException e) {
Log.e(TAG, "Cannot write logcat to disk");
}
}
}

 

一个记录的是崩溃的堆栈信息,一个记录的是崩溃时的logcat,结合使用,还是比较方便的。

下面是用到的Logcat类:

 

 

public class Logcat {
public final static String TAG = "VLC/Util/Logcat";

/**
* Writes the current app logcat to a file.
*
* @param filename The filename to save it as
* @throws IOException
*/
public static void writeLogcat(String filename) throws IOException {
String[] args = { "logcat", "-v", "time", "-d" };

Process process = Runtime.getRuntime().exec(args);

InputStreamReader input = new InputStreamReader(process.getInputStream());

FileOutputStream fileStream;
try {
fileStream = new FileOutputStream(filename);
} catch( FileNotFoundException e) {
return;
}

OutputStreamWriter output = new OutputStreamWriter(fileStream);
BufferedReader br = new BufferedReader(input);
BufferedWriter bw = new BufferedWriter(output);

try {
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
}catch(Exception e) {}
finally {
bw.close();
output.close();
br.close();
input.close();
}
}

/**
* Get the last 500 lines of the application logcat.
*
* @return the log string.
* @throws IOException
*/
public static String getLogcat() throws IOException {
String[] args = { "logcat", "-v", "time", "-d", "-t", "500" };

Process process = Runtime.getRuntime().exec(args);
InputStreamReader input = new InputStreamReader(
process.getInputStream());
BufferedReader br = new BufferedReader(input);
StringBuilder log = new StringBuilder();
String line;

while ((line = br.readLine()) != null)
log.append(line + "\n");

br.close();
input.close();

return log.toString();
}

}

 

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
android--code-播放音乐 2022-11-10 03:41:54