在开发项目的过程中,为了解决App的崩溃问题以及快速解决线上版本出现严重Bug的需求,我们在项目中接入了腾讯的Bugly,在更新提示时我们可以选择自定义的样式,我们项目里自定义的样式如下图所示:
下面介绍一下主要的集成过程,步骤以及主要事项:
1.准备工作:
首先要去腾讯的Bugly,注册bugly账号以及添加产品,主要过程是在https://bugly.qq.com 这个网址直接用qq登录,然后点击右上角-我的产品,如果没有添加过产品的话,点击"用户名",选择"我的App",点击注册新App,填写完应用基本信息完成注册,即可得到Bugly AppID。
2.接入指南:
在Module的buid.gradle文件中添加依赖和属性配置:
android {
defaultConfig {
ndk {
//设置支持的SO库架构
abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
}
}
dependencies {
//注释掉原有bugly的仓库
// compile 'com.tencent.bugly:crashreport:latest.release' //其中latest.release指代最新版本号,也可以指定明确的版本号,例如1.2.9
compile 'com.tencent.bugly:crashreport_upgrade:latest.release' // 其中latest.release指代最新版本号,也可以指定明确的版本号,例如1.0.0
}
注意:
内测SDK已经集成crash上报功能,已经集成Bugly的用户需要注释掉原来Bugly的jcenter库;
自动集成时会自动包含Bugly SO库,建议在Module的build.gradle文件中使用NDK的“abiFilter”配置,设置支持的SO库架构。
如果在添加“abiFilter”之后Android Studio出现以下提示:
NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.
则在项目根目录的gradle.properties文件中添加:
android.useDeprecatedNdk=true
3.参数配置
接入Bugly后,在AndroidManifest.xml中新添加如下权限:
请避免混淆内测SDK,在Proguard混淆文件中增加一行配置:
-keep public class com.tencent.bugly.**{*;}
4.SDK初始化
获取APP ID并将以下代码复制到项目Application类onCreate()中,Bugly会自动检测环境并启用默认配置:
Bugly.init(getApplicationContext(), "注册时申请的APPID", false);
5.自定义更新对话框(主要采用自定义activity的形式)
在Application中添加以下信息:
private void initUpgradeDialog() { /** * 自定义初始化开关 */ Beta.autoInit = true; /** * true表示初始化时自动检查升级; false表示不会自动检查升级,需要手动调用Beta.checkUpgrade()方法; */ Beta.autoCheckUpgrade = true; /** * 设置升级检查周期为60s(默认检查周期为0s),60s内SDK不重复向后台请求策略); */ // Beta.upgradeCheckPeriod = 60 * 1000; /** * 设置启动延时为1s(默认延时3s),APP启动1s后初始化SDK,避免影响APP启动速度; */ Beta.initDelay = 1 * 1000; /** * 设置通知栏大图标,largeIconId为项目中的图片资源; */ Beta.largeIconId = R.mipmap.app_icon; /** * 设置状态栏小图标,smallIconId为项目中的图片资源Id; */ Beta.smallIconId = R.mipmap.app_icon; /** * 设置更新弹窗默认展示的banner,defaultBannerId为项目中的图片资源Id; * 当后台配置的banner拉取失败时显示此banner,默认不设置则展示“loading“; */ Beta.defaultBannerId = R.mipmap.app_icon; /** * 设置sd卡的Download为更新资源保存目录; * 后续更新资源会保存在此目录,需要在manifest中添加WRITE_EXTERNAL_STORAGE权限; */ Beta.storageDir = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); /** * 已经确认过的弹窗在APP下次启动自动检查更新时会再次显示; */ Beta.showInterruptedStrategy = true; /** * 只允许在MainActivity上显示更新弹窗,其他activity上不显示弹窗; 不设置会默认所有activity都可以显示弹窗; */ Beta.canShowUpgradeActs.add(MainActivity.class); /** * 设置Wifi下自动下载 */ Beta.autoDownloadOnWifi = true; /*在application中初始化时设置监听,监听策略的收取*/ Beta.upgradeListener = new UpgradeListener() { @Override public void onUpgrade(int ret, UpgradeInfo strategy, boolean isManual, boolean isSilence) { if (strategy != null) { Log.e("bugly", "需要更新,存在更新策略"); new Handler().postDelayed(new Runnable() { public void run() { Intent i = new Intent(); i.setClass(getApplicationContext(), UpgradeActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); } }, 3000); } else { Log.e("bugly", "不需要更新,没有更新策略"); } } }; /* 设置更新状态回调接口 */ Beta.upgradeStateListener = new UpgradeStateListener() { @Override public void onUpgradeSuccess(boolean isManual) { Toast.makeText(getApplicationContext(),"UPGRADE_SUCCESS",Toast.LENGTH_SHORT).show(); } @Override public void onUpgradeFailed(boolean isManual) { Toast.makeText(getApplicationContext(),"UPGRADE_FAILED",Toast.LENGTH_SHORT).show(); } @Override public void onUpgrading(boolean isManual) { Toast.makeText(getApplicationContext(),"UPGRADE_CHECKING",Toast.LENGTH_SHORT).show(); } @Override public void onUpgradeNoVersion(boolean isManual) { Toast.makeText(getApplicationContext(),"UPGRADE_NO_VERSION",Toast.LENGTH_SHORT).show(); } }; }
注意:
1. UpgradeActivity就是自定义的activity,自己想要的一下布局样式可以定义
2. 重点!!!!!!步骤5一定要在步骤4之前执行,Bugly的后台策略一定要开启,更新的对话框也要改成自定义UI
3.介绍的可能不是特别详细,大家可以参考:
https://bugly.qq.com/docs/user-guide/advance-features-android-beta/?v=20170912151050#2activity
希望对大家有帮助,谢谢!