在Android开发中在所难免的会出现程序crash,俗称崩溃。用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误log的,也就无法修复Bug。这就会极大的影响用户体验,此时我们需要注册一个功能来捕获全局的异常信息,当程序出现crash信息,我们把错误log记录下来,上传到服务器,以便于我们能及时修复bug。这时我们就需要自己来进行处理,现在这里介绍用第三方库 Sentry-Android 来进行捕获,下面就开始在AS中进行实际操作。
在用这个之前先进行下面以下配置:
配置权限:
<!-- REQUIRED to send captures to Sentry -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- OPTIONAL but makes Sentry-Android smarter -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Gradle导入包
compile 'com.joshdholtz.sentry:sentry-android:1.4.4'
在启动Activity中初始化Sentry,开始监听
String yourDSN = "填写你自己的DSN";
Sentry.init(this, yourDSN);
Sentry.debug = true;
Sentry.captureMessage("捕获异常数据的Log");
PS:直接使用Sentry的话,它只会把你手机的device、device.family、 level、 os、 os.name显示出来.
如需显示App手机其他信息的话就需要自定义SentryManager,下面我们就来自定义代码。
/**
* Sentry 管理器,负责初始化 Sentry Client,并在捕捉事件时增加 OS, Device, Build 等设备和软件信息
*/
public class SentryManager {
private final static String osVersion = Build.VERSION.RELEASE;
private final static String deviceName = getDeviceName();
private static int buildVersion = 0;
/**
* 初始化 Sentry
* @param context 上下文
*/
public static void init(final Context context, String dsn) {
Sentry.setCaptureListener(new Sentry.SentryEventCaptureListener() {
@Override
public Sentry.SentryEventBuilder beforeCapture(Sentry.SentryEventBuilder builder) {
//在这里面你想要什么信息的话直接builder.getTags().put("key", "值")就可以了
try {
if (buildVersion == 0) {
buildVersion = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
}
} catch (PackageManager.NameNotFoundException e) {
buildVersion = -1;
}
try {
builder.getTags().put("OS", osVersion);
builder.getTags().put("Device", deviceName);
builder.getTags().put("Build", buildVersion);
} catch (JSONException e) {
// we do nothing
}
return builder;
}
});
Sentry.init(context.getApplicationContext(), dsn);
}
/**
* 获得设备名称
*
* @return 设备名称
*/
private static String getDeviceName() {
String manufacturer = Build.MANUFACTURER;
String model = Build.MODEL;
if (model.startsWith(manufacturer)) {
return capitalize(model);
} else {
return capitalize(manufacturer) + " " + model;
}
}
/**
* 大写首字母
*
* @param s 字符串
* @return 将首字母大写返回的字符串
*/
private static String capitalize(String s) {
if (s == null || s.length() == 0) {
return "";
}
char first = s.charAt(0);
if (Character.isUpperCase(first)) {
return s;
} else {
return Character.toUpperCase(first) + s.substring(1);
}
}
}
在Activity调用,跟上面一样
String yourDSN = "填写你自己的DSN";
SentryManager.init(this, yourDSN);
Sentry.debug = true;
Sentry.captureMessage("捕获异常数据的Log");