美文网首页
安卓捕获闪退异常

安卓捕获闪退异常

作者: SeekLife0 | 来源:发表于2024-03-18 15:05 被阅读0次

前言:解决用户远在他方但是出现了闪退问题无法调试和复现。
之前尝试使用如Thread.UncaughtExceptionHandler方式发现并不能捕获到异常并执行自己想要的操作,而且进程会阻塞导致ANR

步骤一:在app的入口类application的onCreate中添加如下代码

        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Looper.loop();
                    } catch (Throwable e) {
                        Log.e("Crash【主线程】", e.getMessage());
                        Intent intent = new Intent(getInstance(), CrashActivity.class);
                        intent.putExtra(INTENT_KEY_IN_THROWABLE, e);
                        getInstance().startActivity(intent);
                        System.out.println("捕获异常");
                    }
                }
            }
        });

步骤二:新建一个异常显示的activity,当出现异常会跳转该activity并展示异常信息

package com.fangtao.activities.other;

import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.text.style.UnderlineSpan;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.fangtao.R;
import com.fangtao.activities.ClassificationActivity;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CrashActivity extends AppCompatActivity {

    private static final String INTENT_KEY_IN_THROWABLE = "throwable";

    /** 报错代码行数正则表达式 */
    private static final Pattern CODE_REGEX = Pattern.compile("\\(\\w+\\.\\w+:\\d+\\)");
    /** 系统包前缀列表 */
    private static final String[] SYSTEM_PACKAGE_PREFIX_LIST = new String[]
            {"android", "com.android", "androidx", "com.google.android", "java", "javax", "dalvik", "kotlin"};
    private static CrashActivity activity;

    private String mStackTrace;
    private TextView tvError;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crash);
        activity = this;
        Bundle bundle = getIntent().getExtras();
        Throwable throwable = (Throwable)bundle.getSerializable(INTENT_KEY_IN_THROWABLE);
        tvError = findViewById(R.id.tv_error);

        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);
        throwable.printStackTrace(printWriter);
        Throwable cause = throwable.getCause();
        if (cause != null) {
            cause.printStackTrace(printWriter);
        }
        mStackTrace = stringWriter.toString();
        Matcher matcher = CODE_REGEX.matcher(mStackTrace);
        SpannableStringBuilder spannable = new SpannableStringBuilder(mStackTrace);
        if (spannable.length() > 0) {
            while (matcher.find()) {
                // 不包含左括号(
                int start = matcher.start() + "(".length();
                // 不包含右括号 )
                int end = matcher.end() - ")".length();

                // 代码信息颜色
                int codeColor = 0xFF999999;
                int lineIndex = mStackTrace.lastIndexOf("at ", start);
                if (lineIndex != -1) {
                    String lineData = spannable.subSequence(lineIndex, start).toString();
                    if (TextUtils.isEmpty(lineData)) {
                        continue;
                    }
                    // 是否高亮代码行数
                    boolean highlight = true;
                    for (String packagePrefix : SYSTEM_PACKAGE_PREFIX_LIST) {
                        if (lineData.startsWith("at " + packagePrefix)) {
                            highlight = false;
                            break;
                        }
                    }
                    if (highlight) {
                        codeColor = 0xFF287BDE;
                    }
                }

                // 设置前景
                spannable.setSpan(new ForegroundColorSpan(codeColor), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                // 设置下划线
                spannable.setSpan(new UnderlineSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            tvError.setText(spannable);
        }
    }

    public static CrashActivity getInstance() {
        return activity;
    }

}

相关文章

  • 异常捕获和分析

    主要内容 闪退捕获 日志分析 闪退捕获 内核级异常:Mach异常->Unit信号(Mach层捕获到异常通过发送信号...

  • 闪退异常捕获

    这里主要是针对崩溃异常捕获(runtimeException) 思路就是整个程序都在自己写的application...

  • iOS开发知识体系之《 Crash闪退日志的捕获》

    如何捕获app闪退的原因?如何将闪退的原因发送到服务器? 一、异常处理:预先设置捕获的异常和未知异常。 预先设置捕...

  • 解决APP连续闪退的方案

    连续闪退检测 首先要检测用户 App 出现了连续闪退的情况,有两种检测方法,捕获异常和计时器。 1. 捕获异常 检...

  • 2018-02-05

    今天发现苹果版本有闪退问题,原因是互联网注册用户身份是企业管理员时,后台传值为对象,安卓捕获了异常,而苹果没有,导...

  • 简书闪退

    安卓机,打开就闪退!神奇

  • android so库导致的闪退及tombstone分析

    android中有3种crash情况:未捕获的异常、ANR和闪退。未捕获的异常一般用crash文件就可以记录异常信...

  • 年薪上涨200%的Android性能优化, 1个小时教会你——崩

    前言 开发人员碰到 APP 崩溃(闪退)什么办?不少人会说根据 Log,找到闪退的代码,捕获异常,“消化”掉了所有...

  • 关于Fatal signal 11 or 6 or 7 以Bm

    app应用闪退,并且没有任何异常捕获 只有Fatal signal 11 or 6 or 7 想了很多原因无解。好...

  • 异常处理

    一:异常处理 #######1.1 一般处理方式:a.app异常闪退,那么捕获crash信息,并记录在本地沙盒中。...

网友评论

      本文标题:安卓捕获闪退异常

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