# BetaSDKDemo **Repository Path**: niuB_code/BetaSDKDemo ## Basic Information - **Project Name**: BetaSDKDemo - **Description**: 腾讯Bugly内测,升级SDK接入demo - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-08-10 - **Last Updated**: 2021-08-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BetaSDKDemo 腾讯Bugly内测,升级SDK接入demo # 升级功能(Android)使用指南 --- 一、概述 -- 升级功能是专为App的灰度升级而开发的组件,在bugly内测页面配置好App的更新策略,策略指定的老版本App在启动时会自动检测更新并提示升级,为团队的应用分发,灰度内测提供一站式解决方案。 > **准备工作** > 如果你之前已经在[Bugly][1]或[腾讯移动开放平台][2]注册了应用,并获取到AppID,可以继续使用它。 如果你尚未注册应用,可以通过QQ登录Bugly网站,点击"用户名",选择"我的App",点击[注册新App][3],填写完应用基本信息完成注册,即可得到Bugly AppID。 二、接入指南 ---- 1. 自动导入(推荐) 如果您使用Gradle编译Apk,我们强烈推荐您使用自动接入方式配置库文件([JCenter仓库)][4])。 在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 } ![此处输入图片的描述][5] **后续更新内测 SDK时,只需变更配置脚本中的版本号即可。** 注意: > **内测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 2. 手动导入 如果您不采用上述自动导入方式,也可以手动集成内测SDK。 注意: > **已经接入Bugly SDK的用户需要先删除原Bugly SDK的jar包;** > **android4.1以上的eclipse工程必须把jar包放在libs目录下,否则会出现NoClassDefFoundError错误;** **下载内测SDK库文件** - 下载内测SDK的[Android SDK包][6]; - 如果您的工程有Native代码(C/C++)或者集成了其他第三方SO库,建议下载Bugly的[NDK动态库][7]。 Bugly NDK包含多个架构的SO库: armeabi armeabi­v7a arm64­v8a x86 x86_64 **在集成Bugly SO库时,请注意只保留支持的架构SO库。** **Eclipse 工程** - 将内测SDK的库文件复制到工程的libs目录下; - Refresh一下工程; - 添加工程依赖:鼠标右键点击Bugly的JAR文件,添加到编译路径中 ![此处输入图片的描述][8] **Android Studio工程** - 将内测SDK的库文件复制到工程的libs目录下; - 点击Sync,同步配置。 ![此处输入图片的描述][9] 三、参数配置 ------ 接入Bugly后,在AndroidManifest.xml中新添加如下权限: 在AndroidManifest.xml中添加以下Activity 请避免混淆内测SDK,在Proguard混淆文件中增加一行配置: -keep public class com.tencent.bugly.**{*;} 四、SDK初始化 -------- [获取APP ID][10]并将以下代码复制到项目Application类onCreate()中,Bugly会自动检测环境并启用默认配置: Bugly.init(getApplicationContext(), "注册时申请的APPID", false); **提示:已经接入Bugly的用户改用上面的初始化方法,不影响原有的crash上报功能;** 五、测试验证 ---- 1. 注册App,获取Appid 使用前请先根据[Bugly使用文档][11]完善开发者信息与应用注册 2. 上传升级包 进入内测页面选择注册的APP,点击发布新版本,上传要升级的APP的版本(**上传APP的versioncode必须不低于外发版本的versiocode,否则用户检测不到更新**) ![此处输入图片的描述][12] 3. 配置升级策略 发布完成后点击升级配置 ![此处输入图片的描述][13] 点击新建升级策略 ![此处输入图片的描述][14] 使用默认策略配置,点击创建策略 ![此处输入图片的描述][15] 策略创建完成后会回到版本编辑页面,点击立即启动,使策略生效; ![此处输入图片的描述][16] 4. 测试验证 完成步骤1中的策略配置,在本地安装配置过内测SDK的低版本APP,启动后(**请先杀掉进程**)等待一段时间(默认是3s)会弹出如下升级弹窗,表示SDK配置成功 ![此处输入图片的描述][17] 六、高级配置 ------ 我们提供Beta类作为Bugly的初始化扩展,通过Beta类可以修改升级的检测时机,界面元素以及自定义的升级行为,可以参考[BetaSdkDemo][18]的相关设置。 public class DemoApplication extends Application{ public static final String APP_ID = "900020779"; // TODO 替换成bugly上注册的appid @Override public void onCreate() { super.onCreate(); /***** Beta高级设置 *****/ /** * true表示app启动自动初始化升级模块; * false不会自动初始化; * 开发者如果担心sdk初始化影响app启动速度,可以设置为false, * 在后面某个时刻手动调用Beta.init(getApplicationContext(),false); */ 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.drawable.ic_launcher; /** * 设置状态栏小图标,smallIconId为项目中的图片资源Id; */ Beta.smallIconId = R.drawable.ic_launcher; /** * 设置更新弹窗默认展示的banner,defaultBannerId为项目中的图片资源Id; * 当后台配置的banner拉取失败时显示此banner,默认不设置则展示“loading“; */ Beta.defaultBannerId = R.drawable.ic_launcher; /** * 设置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); /***** 统一初始化Bugly产品,包含Beta *****/ Bugly.init(this, APP_ID, true); } } 七、接口说明 ------ > 更新功能主要API /** * 手动检查更新策略 */ public static synchronized void checkUpgrade() /** * 获取本地已有升级策略(非实时,可用于界面红点展示) * * @return */ public static synchronized UpgradeInfo getUpgradeInfo() > 示例 public class MainActivity extends Activity { Button checkUpgradeBtn; Button refreshBtn; TextView upgradeInfoTv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); checkUpgradeBtn = $(R.id.check_upgrade); refreshBtn = $(R.id.refresh_info); upgradeInfoTv = $(R.id.upgrade_info); checkUpgradeBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { /***** 检查更新 *****/ Beta.checkUpgrade(); } }); refreshBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { loadUpgradeInfo(); } }); } private void loadUpgradeInfo() { if (upgradeInfoTv == null) return; /***** 获取升级信息 *****/ UpgradeInfo upgradeInfo = Beta.getUpgradeInfo(); if (upgradeInfo == null) { upgradeInfoTv.setText("无升级信息"); return; } StringBuilder info = new StringBuilder(); info.append("id: ").append(upgradeInfo.id).append("\n"); info.append("标题: ").append(upgradeInfo.title).append("\n"); info.append("升级说明: ").append(upgradeInfo.newFeature).append("\n"); info.append("versionCode: ").append(upgradeInfo.versionCode).append("\n"); info.append("versionName: ").append(upgradeInfo.versionName).append("\n"); info.append("发布时间: ").append(upgradeInfo.publishTime).append("\n"); info.append("安装包Md5: ").append(upgradeInfo.apkMd5).append("\n"); info.append("安装包下载地址: ").append(upgradeInfo.apkUrl).append("\n"); info.append("安装包大小: ").append(upgradeInfo.fileSize).append("\n"); info.append("弹窗间隔(ms): ").append(upgradeInfo.popInterval).append("\n"); info.append("弹窗次数: ").append(upgradeInfo.popTimes).append("\n"); info.append("发布类型(0:测试 1:正式): ").append(upgradeInfo.publishType).append("\n"); info.append("弹窗类型(1:建议 2:强制 3:手工): ").append(upgradeInfo.upgradeType); upgradeInfoTv.setText(info); } } > UpgradeInfo内容如下 public String id = "";//唯一标识 public String title = "";//升级提示标题 public String newFeature = "";//升级特性描述 public long publishTime = 0;//升级发布时间,ms public int publishType = 0;//升级类型 0测试 1正式 public int upgradeType = 1;//升级策略 1建议 2强制 3手工 public int popTimes = 0;//提醒次数 public long popInterval = 0;//提醒间隔 public int versionCode; public String versionName = ""; public String apkMd5;//包md5值 public String apkUrl;//APK的CDN外网下载地址 public long fileSize;//APK文件的大小 [1]: http://bugly.qq.com/ [2]: http://open.qq.com/ [3]: http://bugly.qq.com/register [4]: http://jcenter.bintray.com/com/tencent/bugly/crashreport_upgrade/ [5]: http://ww4.sinaimg.cn/large/7d7b7518gw1f2stc5eoooj21d80i0tbc.jpg [6]: http://bugly.qq.com/whitebook [7]: http://bugly.qq.com/whitebook [8]: http://ww3.sinaimg.cn/large/7d7b7518gw1f2lv3aykg3j20li0gtwfs.jpg [9]: http://ww2.sinaimg.cn/large/7d7b7518gw1f2lv3lxyixj20zk0j2jtp.jpg [10]: http://bugly.qq.com/apps [11]: http://bugly.qq.com/document [12]: http://ww4.sinaimg.cn/mw690/7d7b7518gw1f2g4vakopjj20m60ezmzh.jpg [13]: http://ww1.sinaimg.cn/mw690/7d7b7518gw1f2g4vp0sfpj20ot0cpgnh.jpg [14]: http://ww4.sinaimg.cn/mw690/7d7b7518gw1f2paj9ypbpj20m40g9my4.jpg [15]: http://ww3.sinaimg.cn/mw690/7d7b7518gw1f2paeui8hjj20ks0nlab7.jpg [16]: http://ww3.sinaimg.cn/mw690/7d7b7518gw1f2g4z7ux5kj20mw0bjgmm.jpg [17]: http://ww2.sinaimg.cn/large/7d7b7518gw1f2g50bv9quj207l0dhq3c.jpg [18]: https://github.com/vell001/BetaSDKDemo