Android - java native 异常捕获到本地 - xCrash 简单实现 ,亲测可直接使用
短信预约 -IT技能 免费直播动态提醒
需求:
当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
BaseActivity.java
public abstract class BaseActivity extends AppCompatActivity{
private String[] mPermissions = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE,};
private List 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);
}
}
}
作者:Rainbow Snake
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341