美文网首页Android开发
Android捕获崩溃的日志

Android捕获崩溃的日志

作者: 卓技卓品 | 来源:发表于2017-06-20 08:19 被阅读0次

    这是最早参加工作时候学习的一个技术,应用运行的时候遇到崩溃如何获取?
    无论是Android还是iOS,应用异常在所难免,所以就需要处理异常情况下出现的崩溃情况。崩溃总是无法预知的,不可控的。那么捕获崩溃的意义在哪里呢?其实,捕获崩溃的意义很大,能通过捕获到的崩溃日志分析问题,继而解决问题,防止该异常在下一个版本中继续存在。版本的更新迭代就是一个添加功能,优化性能,解决异常的过程。最早的时候很奇怪,应用就崩溃了,怎么还能获取到异常信息并且保存呢?当时想的显然这是不可能实现的。但是通过了解了异常捕获和抛出的过程,可以发现异常的捕获及之后的一系列处理都是可控的。应用中异常会经常出现,只不过有的异常没有被捕获处理,这样就会导致应用崩溃。这个时候异常信息就交给系统虚拟机进行处理,虚拟机会Crash应用,出现崩溃的情况。我们捕获崩溃日志就是在异常交给虚拟机之前,应用本身获取一下日志信息,进而做一些保存或者上传的操作。实现获取异常日志,分析日志的操作。
    就提实现非常简单,这里就以把崩溃日志保存成文件的简单方式为例,说明整个过程。创建捕获全局异常的类,捕获应用中未处理的异常,即崩溃情况:
    <pre>
    public class CrashHandler implements UncaughtExceptionHandler {
    private static CrashHandler instance;
    private Context ctx;
    public static CrashHandler getInstance() {
    if (instance == null) {
    instance = new CrashHandler();
    }
    return instance;
    }
    public void init(Context ctx) {
    this.ctx = ctx;
    Thread.setDefaultUncaughtExceptionHandler(this);
    }
    @Override
    public void uncaughtException(Thread arg0, Throwable arg1) {
    String logdir;
    if (Environment.getExternalStorageDirectory() != null) {
    logdir = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "hbdLog";
    File file = new File(logdir);
    boolean mkSuccess;
    if (!file.isDirectory()) {
    mkSuccess = file.mkdirs();
    if (!mkSuccess) {
    mkSuccess = file.mkdirs();
    }
    }
    try {
    FileWriter fw = new FileWriter(logdir + File.separator + "error.log", true);
    if (fw != null) {
    fw.write(new Date() + "\n");
    StackTraceElement[] stackTrace = arg1.getStackTrace();
    fw.write(arg1.getMessage() + "\n");
    for (int i = 0; i < stackTrace.length; i++) {
    fw.write("file:" + stackTrace[i].getFileName() + " class:" + stackTrace[i].getClassName()+ " method:" + stackTrace[i].getMethodName() + " line:" + stackTrace[i].getLineNumber() + "\n");
    }
    fw.write("\n");
    fw.close();
    }
    } catch (IOException e) {
    Log.e("crash handler", "load file failed...", e.getCause());
    }
    }
    arg1.printStackTrace();
    System.exit(0);
    }
    }
    </pre>

    将捕获异常类应用到APP中,仅需要在Application中的OnCreate方法中添加两句话,使其生效:

    <pre>
    CrashHandler crashHandler = CrashHandler.getInstance();
    crashHandler.init(this);
    </pre>

    相关文章

      网友评论

        本文标题:Android捕获崩溃的日志

        本文链接:https://www.haomeiwen.com/subject/kucoqxtx.html