Android - java native 异常捕获到本地 - xCrash 简单实现 ,亲测可直接使用

需求:
当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);
        }
    }
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值