需求:
当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);
}
}
}