Android - java native 异常捕获到本地 - xCrash 简单实现 ,亲测可直接使用_android xcrash_Rainbow Snake的博客-程序员宅基地

技术标签: Android  

需求:
当APP出现Java异常、native异常和ANR时需要重启当前APP。

解决方案:
使用爱奇艺的xCrash框架进行捕获并重启。

xCrash GitHub地址:
https://github.com/iqiyi/xCrash/blob/master/README.zh-CN.md

步骤一:
在module的build.gradle中添加如下代码:

android {
    
	defaultConfig {
    
		ndk {
    
			// 根据需要添加必要的ABI
			abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
		}
	}
}
dependencies {
    
	//捕获异常的开源库
	implementation 'com.iqiyi.xcrash:xcrash-android-lib:2.4.9'
}

步骤二:
在Application的attachBaseContext中初始化xCrash。

import android.app.Application;
import android.content.Context;

import com.blankj.utilcode.util.AppUtils;

import xcrash.ICrashCallback;
import xcrash.XCrash;
public class MyApplication extends Application {
    
    @Override
    public void onCreate() {
    
        super.onCreate(); 
        //初始化崩溃捕捉工具
        initCrashTools();
    }


    /**
     * 初始化崩溃捕捉工具
     */
    private void initCrashTools() {
    
        XCrash.InitParameters initParameters = new XCrash.InitParameters();
        //需要将日志输出的路径,自行编辑
        initParameters.setLogDir(FileConstant.LOG_FILE_PATH);
        //引用com.blankj:utilcode库中的获取APP的VersionName
        initParameters.setAppVersion(AppUtils.getAppVersionName());
        //捕获异常后的回调函数
        ICrashCallback crashCallback = new ICrashCallback() {
    
            @Override
            public void onCrash(String logPath, String emergency) {
    
                // 发生崩溃后,重启软件
                // 引用com.blankj:utilcode库中的重启方法
                AppUtils.relaunchApp(true);
            }
        };
        //java异常的捕获
        initParameters.setJavaCallback(crashCallback);
        //anr的捕获
        initParameters.setAnrCallback(crashCallback);
        //native异常的捕获
        initParameters.setNativeCallback(crashCallback);
        //初始化xCrash
        XCrash.init(this, initParameters);
    }
}

步骤三:
添加读写权限,安卓6.0以上需要进行动态权限申请。

AndroidManifest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

BaseActivity.java

public abstract class BaseActivity extends AppCompatActivity{
    
	/**
     * 需要申请的权限
     */
    private String[] mPermissions = {
    Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,};
   	/**
     * 没有允许的权限
     */
    private List<String> mPermissionList = new ArrayList<>(); 
      
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.***);
		//加载权限
        initPermission();
	}
    /**
     * 初始动态申请化权限
     */
    private void initPermission() {
    
        //使用兼容库就无需判断系统版本
        for (String permission : mPermissions) {
    
            if (ContextCompat.checkSelfPermission(getApplication(), permission) != PackageManager.PERMISSION_GRANTED) {
    
                mPermissionList.add(permission);
            }
        }
        if (mPermissionList.size() != 0) {
    
            String[] objects = mPermissionList.toArray(new String[mPermissionList.size()]);
            ActivityCompat.requestPermissions(this, objects, 0);
        }
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39886154/article/details/105495851

智能推荐

频偏计算方式_晶振频偏计算公式-程序员宅基地

1.我们描述频偏的时候一般是以ppm作为单位来描述的,ppm是百万分之一的意思也就是10^-6。2.如何计算频偏 假如我们有一个晶振,它的频率标值是12MHZ,但是我们测试到的是11.99998MHZ。那么Foffset=12-11.99998=0.00002MHZ。ppm=(0.00002/12)*10^6=1.67。3.一般在选中晶振的时候选中精度相对好点的。类似STM_晶振频偏计算公式

4.练习:do...while:打印输出[0,200]之间所有能被7整除,但不能被4整除的所有整数,要求每行打印5个,并统计个数_//do while循环练习:【1,200】能被7整除 但是不能被4整除的所有整数 要求:每行显-程序员宅基地

跟汤老师学Java笔记:练习:do…while完成:第一遍1.打印输出[0,200]之间所有能被7整除,但不能被4整除的所有整数,要求每行打印5个并统计个数package season5;//打印输出[0,200]之间//所有能被7整除,但不能被4整除的所有整数,//要求每行打印5个//并统计个数public class TestDoWhileTest { public static void main(String[] args) { int i=0; int c_//do while循环练习:【1,200】能被7整除 但是不能被4整除的所有整数 要求:每行显

python —— , index_col=0-程序员宅基地

有index_col = 0没有的情况就是第一列是不是作为行名_index_col=0

转 - 数据库面试题目研究-程序员宅基地

一:SQL tuning 类1. 列举几种表连接方式Answer:等连接(内连接)、非等连接、自连接、外连接(左、右、全)Or hash join/merge join/nest loop(cluster join)/index join ?? ORACLE 8i,9i 表连接方法。 一般的相等连接: select * from a, b where a.id ...

java中的常用日期类_Java基础——常用类之日期时间类_嗷呜哈的博客-程序员宅基地

如果有机会,请尝试Java8中全新的时间日期API!(参见Java8新特性随笔)如果还是使用Java7及之前的版本,那么你可以尝试一些工具类(参考使用工具类相关的Hutool-DateUtil)如果又不能升级JDK,又无法引入第三方依赖库,那么你可以需要了解以下的时间日期相关的API(无奈之举)一、常用日期类二、System类我们比较常用的时间相关的方法:我们这里特别注意一下它的定义:返回的是与1..._java时间类哪些是月份从0开始

vue main.js中引入js_VUE 项目如何快速优化?| 原力计划-程序员宅基地

作者 | 靖凡无所畏惧责编 | 屠敏出品 | CSDN 博客前言相信现在很多人都是用Vue做过了各种项目,但是项目代码做完和上线并不代表这结束,还有上线以后的优化也是很重要的一点,这次的博客就来给大家说一下如何优化一下Vue的项目,让你的项目打包和运行速度更上一个台阶。优化策略生成打包报告修改webpack默认配置加载外部CDN资源路由懒加载开启gizp配置生成打包报告生成Vue的打包报告目的在于..._mainjs中引入cdn的js

随便推点

【十一】贝叶斯统计正则化_贝叶斯统计和正则化-程序员宅基地

本文介绍了《机器学习》课程第十一讲的内容,包括贝叶斯正则算法、在线学习算法及如何开发机器学习算法的内容。_贝叶斯统计和正则化

Java 集合系列06之 Vector详细介绍(源码解析)和使用示例-程序员宅基地

http://www.cnblogs.com/skywang12345/p/3308833.htmlVector类实现了一个动态数组。和ArrayList和相似http://www.runoob.com/java/java-vector-class.html转载于:https://www.cnblogs.com/zt007/p/6277015.html..._java 集合系列06之 vector详细介绍(源码解析)和使用示例

进来看VS调试技巧_vs调试17调试窗口_cchen.835的博客-程序员宅基地

目录Bug什么是调试Debug和Release简介快捷键+窗口实例写出好的代码编程常见错误BugBug一词的原意是“昆虫”或“虫子”;而在电脑系统或程序中隐藏着的一些未被发现的缺陷或问题,人们也叫它“bug”。什么是调试人们将发现Bug并加以纠正的过程叫做“Debug”(中文称作“调试”)在调试中我们发现有Debug和Release选项两者又什么不同呢?Debug和ReleaseDebug 包含调试信息,不做优化,便于程序员调试程序..._vs调试17调试窗口

MyBatis一对多collection用法_mybatis 多个collection-程序员宅基地

比如一个用户对应多个角色首先用户表CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(64) DEFAULT NULL, `nickname` varchar(64) DEFAULT NULL, `password` varchar(255) DEFAULT NULL..._mybatis 多个collection

Hough变换原理---从图像中识别几何图形,确定其参数_图像几何形状识别方法-程序员宅基地

一、简单介绍Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。二、Hough变换的基本思想设已知一黑白图像上画了一条直线,要求出这条直线_图像几何形状识别方法

javascript与node.js的区别_js nood/js-程序员宅基地

Javascript是一种web前端语言,主要用于web开发中,由浏览器解析执行Node.js是一个可以快速构建网络服务及应用的平台,是用Javascript语言构建的服务平台,可用于后端建立服务器他们都用的是js语法,前者主要应用前端后者主要应用与后端node.js和javascript区别还是挺大的,1个平台,1个是编程语言;javascript是客户端编程语言,需要浏览器的javascrip_js nood/js