当前位置: 首页 > 工具软件 > xCrash > 使用案例 >

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

龚凌
2023-12-01

需求:
当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);
        }
    }
}
 类似资料: