Bugly使用记录——异常上报
SDK文档地址
导入SDK
Bugly支持自动和手动两种方式,感谢伟大的AS,自动导入更简单更快
需要操作两个地方
1.在Module的build.gradle文件中添加依赖和属性配置
android {
defaultConfig {
//这个针对的是NDK的配套设置,SDK不需要
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
}
}
dependencies {
// 可以针对需求来添加依赖,NDK针对的是本地so文件,如果没有引入so文件就不需要
implementation 'com.tencent.bugly:crashreport:latest.release' //其中latest.release指代最新Bugly SDK版本号,也可以指定明确的版本号,例如2.1.9
implementation 'com.tencent.bugly:nativecrashreport:latest.release' //其中latest.release指代最新Bugly NDK版本号,也可以指定明确的版本号,例如3.0
}
2.参数配置
- 在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--这个权限是系统应用权限,目前可能影响的是本地locat输出,不影响捕捉异常和异常上报-->
<uses-permission android:name="android.permission.READ_LOGS" />
注:如果您的App需要上传到google play store
,您需要将READ_PHONE_STATE
权限屏蔽掉或者移除,否则可能会被下架。
- 请避免混淆Bugly,在Proguard混淆文件中增加以下配置:
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
初始化
配置完SDK后,就可以初始化和应用了
初始化有两种方式
一种是比较简单,一句代码
获取APP ID并将以下代码复制到项目Application类onCreate()中,Bugly会为自动检测环境并完成配置:
CrashReport.initCrashReport(getApplicationContext(), "注册时申请的APPID", false);
文档中有注意事项
- 为了保证运营数据的准确性,建议不要在异步线程初始化Bugly
-
第三个参数为SDK调试模式开关,调试模式的行为特性如下:输出详细的Bugly SDK的Log;每一条Crash都会被立即上报;自定义日志将会在Logcat中输出。建议在测试阶段建议设置成true,发布时设置为false
第二个事项这里由于没有申请log权限,因此默认为false。
Application建议自己重写继承Application类,在AndroidMani文件,application标签中用name标签指定自己的Application类
另一种需要配置AndroidMani文件,配置比较详细
Bugly2.0及以上版本还支持通过“AndroidManifest.xml”来配置APP信息。如果同时又通过代码中配置了APP信息,则最终以代码配置的信息为准。
在“AndroidManifest.xml”的“Application”中增加“meta-data”配置项:
<application
<!-- 配置APP ID -->
<meta-data
android:name="BUGLY_APPID"
android:value="<APP_ID>" />
<!-- 配置APP版本号 -->
<!--不同于“android:versionName”,“BUGLY_APP_VERSION”配置的是Bugly平台的APP版本号。-->
<meta-data
android:name="BUGLY_APP_VERSION"
android:value="<APP_Version>" />
<!-- 配置APP渠道号 -->
<meta-data
android:name="BUGLY_APP_CHANNEL"
android:value="<APP_Channel>" />
<!-- 配置Bugly调试模式(true或者false)-->
<meta-data
android:name="BUGLY_ENABLE_DEBUG"
android:value="<isDebug>" />
</application>
通过“AndroidManifest.xml”配置后的初始化方法如下:
CrashReport.initCrashReport(getApplicationContext());
测试
到这一步,就可以在控制台上看到上传的crash
文档中的方法
在一个点击事件中调用测试接口
CrashReport.testJavaCrash();
由于没有locat权限,本地log输出中没有日志输出,但是在Bugly控制台中可以看到结果
另外,如果项目包含了Native工程或者使用了代码混淆,建议配置符号表文件,具体请参考“ 符号表配置”
崩溃趋势
具体分析
高级设置
参考sdk
CrashReport.UserStrategy userStrategy = new CrashReport.UserStrategy(getApplicationContext());
// 自定义数据 记录信息 设置渠道名称
userStrategy.setAppChannel("channel_test");
// 自定义数据 设置app版本
userStrategy.setAppVersion("test_version");
// 记录信息 设置app包名
userStrategy.setAppPackageName("test_package_name");
// 设置bugly启动后联网延迟,默认10s
userStrategy.setAppReportDelay(2000);
// 自定义跟踪数据回传文件
userStrategy.setCrashHandleCallback(new CrashReport.CrashHandleCallback() {
public Map<String, String> onCrashHandleStart(int crashType, String errorType, String errorMessage, String errorStack) {
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
map.put("Key", "Value");
return map;
}
@Override
public byte[] onCrashHandleStart2GetExtraDatas(int crashType, String errorType,
String errorMessage, String errorStack) {
try {
return "Extra data.".getBytes("UTF-8");
} catch (Exception e) {
return null;
}
}
});
// 初始化
CrashReport.initCrashReport(getApplicationContext(), "bf21e87f18", false, userStrategy);
// 设置模块/功能/场景标签,在控制台显示,需要在控制台维护标签ID
CrashReport.setUserSceneTag(getApplicationContext(), 107173);
// 记录信息 回传异常用户ID
CrashReport.setUserId("1111111");
// 自定义数据 设置自定义地图参数
CrashReport.putUserData(getApplicationContext(), "12341234", "123123123");
// ADT 17增加了BuildConfig特性,可以通过获取BuildConfig类的DEBUG变量来设置:
// CrashReport.setIsDevelopmentDevice(getApplicationContext(), BuildConfig.DEBUG);
使用Javascript的异常捕获功能
可以感知到webView中发生的js异常,需要配合webView使用,具体参考文档
更多的Bugly日志附加信息
bugly可以支持更多的自定义信息
1,设置用户ID您可能会希望能精确定位到某个用户的异常,我们提供了用户ID记录接口。例:网游用户登录后,通过该接口记录用户ID,在页面上可以精确定位到每个用户发生碰撞的情况。
CrashReport.setUserId("9527"); //该用户本次启动后的异常日志用户ID都将是9527
2,主动上报开发者Catch的异常您可能会关注某些重要异常的Catch情况。我们提供了上报这类异常的接口。例:统计某个重要的数据库读写问题比例。
try {
//...
} catch (Throwable thr) {
CrashReport.postCatchedException(thr); // bugly会将这个throwable上报
}
3,自定义日志功能我们提供了自定义Log的接口,用于记录一些开发者关心的调试日志,可以更全面地反应App异常时的前后文环境。使用方式与android.util.Log一致。用户传入TAG和日志内容。该日志将在logcat的输出,并在发生异常时上报。有如下
BuglyLog.v(tag, log)
BuglyLog.d(tag, log)
BuglyLog.i(tag, log)
BuglyLog.w(tag, log)
BuglyLog.e(tag, log)
注意:
- 使用BuglyLog接口时,为了减少磁盘IO次数,我们会先存日志缓存在内存中。当缓存大于一定阈值(默认10K),会将它持久化至文件。您可以通过setCache(int byteSize)接口设置缓存大小,范围为0-30K。例:BuglyLog.setCache(12 * 1024)//将缓存设置为12K
- 如果您没有使用BuglyLog接口,且初始化Bugly时isDebug参数设置为假,该登录功能将不会有新的资源占用;
- 为了方便开发者调试,当初始化Bugly的isDebug参数为真时,异常日志同时还会记录Bugly本身的日志请在应用发布时将其设置为假。
- 上报日志最大30K。
第三个功能需要注意,在AndroidMani中没有申请logcat权限,无法使用,最好在初始化时设置isDebug=false。(初始化时的布尔参数)
CSDN-Ada助手: 那些刻骨铭心的日子,总会在未来的某一天闪闪发光。
qq_57537188: 大佬可以求个下载链接吗
Lansonli: 原创不易,过来支持一下~
故佞: 可以求一份源码吗?
RungBy 回复 weixin_45061702: 唔,抽个时间我重写一遍吧,现在再看,我也觉得写的很low(捂脸)