0.需求
最近发布的APP,用户反馈遇到了一些稀奇古怪的崩溃。本地测试,一定程度上无法覆盖所有的case。加之用户使用场景和本地场景存在一定差异性。这难免会造成一些稀奇古怪的崩溃,且不易复现。
突然想到,微软也在做一件事,就是每当程序崩溃以后,总要把一些崩溃上报。显然,APP也把崩溃进行上报,也是一个好思路。
继续发现,好些大厂都已经提供了完整的APP上传工具和机制。但如果是站在工程师的角度,如果资源不够的话,重新设计一套工具,显然是不合适的。于是,想到了是否有公开的可以直接用APP异常上传工具和“轮子”。
1.工具寻找
经过寻找,找到比较好的工具是腾讯推出的Bugly。主页为https://bugly.qq.com/v2/index。Bugly可以进行异常上报和错误分析。当然,最关键的是:APP发生的错误,实时上传到腾讯的库里,可以让用户进行查看和分析。
显然,本工具是满足要求的。
2.Bugly工具的使用
Bugly工具的使用,可以通过其官方文档查看和学习(home - Bugly 文档)。
想使用的话,需要注册然后使用。
当然,基本思路是:把Bugly安装到程序使用,然后,整个程序就可以运行起来。
笔者目前负责的主要产品为Android,以Android为例进行使用。
笔者目前使用的android开发IDE为Android Studio4.0。
在Project对应的build.gradle上加上Bugly上传,如下所示:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.0.0"
// 配置自动上传符号表插件,注:为了能快速并准确地定位用户APP发生Crash的代码位置,Bugly使用符号表对APP发生Crash的程序堆栈进行解析和还原
classpath 'com.tencent.bugly:symtabfileuploader:latest.release'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
然后,在项目的build.gradle里加上上传的的文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 31
buildToolsVersion "31.0.0"
defaultConfig {
applicationId "com.example.buglytest"
minSdkVersion 24
targetSdkVersion 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// 其中latest.release指代最新版本号,也可以指定明确的版本号,例如1.2.7
// (注:从2.1.5开始要分开Bugly SDK和NDK的配置)
implementation 'com.tencent.bugly:crashreport:latest.release'
implementation 'com.tencent.bugly:nativecrashreport:latest.release'
}
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" />
<uses-permission android:name="android.permission.READ_LOGS" />
在程序起始入口的OnCreate函数里加上写入程序,如下所示。
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
/* Bugly SDK初始化
* 参数1:上下文对象
* 参数2:APPID,平台注册时得到,注意替换成你的appId
* 参数3:是否开启调试模式,调试模式下会输出'CrashReport'tag的日志
*/
CrashReport.UserStrategy userStrategy = new CrashReport.UserStrategy(this);
CrashReport.initCrashReport(this,"自己的APPID",true, userStrategy);
}
}
3.样例测试和程序使用
比较幸运的是,Github上有一个他人写好的现成样例,链接为:
值得注意的是:该样例可能在部分Android Studio上失败。如果失败,自己可以把相关程序拷贝过来即可。
同时,Bugly还可以用于iOS、Unity、Cocos,限于篇幅,本文不介绍了。
4.可能风险
可能存在的风险,依然是由于使用了腾讯的产品,上传信息不可避免的会被腾讯获得。如果是大厂,还是自己建立代码上传和追踪机制吧。
对于小研发团队,目前这种方法其实就够了。