一.异常上报
(1)在Bugly上的操作
1.bugly上注册账号:https://bugly.qq.com/
2.创建产品
3.查看App ID、App Key(项目中需要到)
4.设置WebHook(以钉钉群为例,如何创建钉钉群机器人:https://blog.csdn.net/weixin_40420578/article/details/103277359)
5.奔溃分析(是没有的,后面有了,就证明成功了)
(2)在Android Studio上的操作
1.build.gradle(Module:app)添加依赖、属性配置
android {
defaultConfig {
ndk {
// 设置支持的SO库架构
abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
}
}
dependencies {
api 'com.tencent.bugly:crashreport:latest.release' //其中latest.release指代最新Bugly SDK版本号,也可以指定明确的版本号,例如2.1.9
api 'com.tencent.bugly:nativecrashreport:latest.release' //其中latest.release指代最新Bugly NDK版本号,也可以指定明确的版本号,例如3.0
}
2.AndroidManifest.xml(app)中添加权限
<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" />
3.proguard-rules.pro(ProGuard Rules for app)添加混淆
-dontwarn com.tencent.bugly.**
-keep public class com.tencent.bugly.**{*;}
4.BaseApplication(继承Application的类)
//BuildConfig.BuglyAppId替换成你的App ID
Bugly.init(getApplicationContext(),BuildConfig.BuglyAppId,BuildConfig.DEBUG);
Bugly.setIsDevelopmentDevice(this,BuildConfig.DEBUG);
(可忽略不看)补: BuildConfig.BuglyAppId的来由:
因为我的基础信息配置同一写在了config.gradle(自己建立的文件)里面,bugly的id、key也是:
ext {
bugly = [
appId : 'App ID',
appKey: 'App Key'
]
}
build.gradle(Module:app)中加如下代码,然后clean project(一次不行就多试几次)
android {
buildTypes {
//rootProject.ext.bugly.appId、rootProject.ext.bugly.appKey就是config.gradle中写的App ID、App Key
debug{
buildConfigField "String", "BuglyAppId", "\"${rootProject.ext.bugly.appId}\""
buildConfigField "String", "BuglyAppKey", "\"${rootProject.ext.bugly.appKey}\""
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField "String", "BuglyAppId", "\"${rootProject.ext.bugly.appId}\""
buildConfigField "String", "BuglyAppKey", "\"${rootProject.ext.bugly.appKey}\""
}
}
}
5.写个bug闪退来验证一下(还没有登录就闪退,所以用户ID是unknown)
登录成功后:Bugly.setUserId(context,userId),再次崩溃时用户ID就会有了
(二)应用升级
(1)在Android studio上的操作(基于前面的基础上)
1.AndroidMainfest.xml(app)中activity配置、配置FileProvider
<application
<activity
android:name="com.tencent.bugly.beta.ui.BetaActivity"
android:configChanges="keyboardHidden|orientation|screenSize|locale"
android:theme="@android:style/Theme.Translucent" />
</application>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
//如果你使用的第三方库也配置了同样的FileProvider, 可以通过继承FileProvider类来解决合并冲突的问题,示例如下:
<provider
android:name=".utils.BuglyFileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="name,authorities,exported,grantUriPermissions">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"
tools:replace="name,resource"/>
</provider>
//这里要注意一下,FileProvider类是在support-v4包中的,检查你的工程是否引入该类库。
//在res目录新建xml文件夹,创建provider_paths.xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!-- /storage/emulated/0/Download/${applicationId}/.beta/apk-->
<external-path name="beta_external_path" path="Download/"/>
<!--/storage/emulated/0/Android/data/${applicationId}/files/apk/-->
<external-path name="beta_external_files_path" path="Android/data/"/>
</paths>
</application
2.proguard-rules.pro(ProGuard Rules for app)添加混淆
-keep class android.support.**{*;}
3.BaseApplication(继承Application的类)
private void initBugly() {
//BuildConfig.BuglyAppId替换成你的App ID
Bugly.init(getApplicationContext(),BuildConfig.BuglyAppId,BuildConfig.DEBUG);
Bugly.setIsDevelopmentDevice(this,BuildConfig.DEBUG);
Beta.autoInit = true;
/**
* true表示初始化时自动检查升级
* false表示不会自动检查升级,需要手动调用Beta.checkUpgrade()方法
*/
Beta.autoCheckUpgrade = true;
/**
* 设置升级周期为60s(默认检查周期为0s),60s内SDK不重复向后天请求策略
*/
Beta.initDelay = 1000;
/**
* 设置通知栏大图标,largeIconId为项目中的图片资源;
*/
Beta.largeIconId = R.mipmap.ic_launcher;
/**
* 设置状态栏小图标,smallIconId为项目中的图片资源id;
*/
Beta.smallIconId = R.mipmap.ic_launcher;
/**
* 设置更新弹窗默认展示的banner,defaultBannerId为项目中的图片资源Id;
* 当后台配置的banner拉取失败时显示此banner,默认不设置则展示“loading“;
*/
Beta.defaultBannerId = R.mipmap.ic_launcher;
/**
* 设置sd卡的Download为更新资源保存目录;
* 后续更新资源会保存在此目录,需要在manifest中添加WRITE_EXTERNAL_STORAGE权限;
*/
Beta.storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
/**
* 点击过确认的弹窗在APP下次启动自动检查更新时会再次显示;
*/
Beta.showInterruptedStrategy = false;
/**
* 只允许在MainActivity上显示更新弹窗,其他activity上不显示弹窗;
* 不设置会默认所有activity都可以显示弹窗;
*/
Beta.canShowUpgradeActs.add(MainActivity.class);
//CrashReport
Bugly.init(getApplicationContext(), BuildConfig.BuglyAppId, BuildConfig.DEBUG);
Bugly.setIsDevelopmentDevice(
this, BuildConfig.DEBUG
);
}
4.版本检测更新(本地版本号跟bugly上“应用升级”的对比,我这里还没有上传)(手动的,点击按钮测试一下)
注:这个功能适合放在: 我的——关于——检测新版本(不过更好的交互是主动去检测,有新版本出现相应提示)
Beta.checkUpgrade();//检测版本更新方法
5. 发布新升级(比本地版本高的)
6.验证(本地装了个比1000低的版本)