介绍

  在介绍Bugly之前,需要先向大家简单介绍下一些热更新的相关内容。当前市面的热补丁方案有很多,其中比较出名的有阿里的AndFix、美团的Robust以及QZone的超级补丁方案。但它们都存在无法解决的问题,这也是Tinker面世的原因。Tinker目前已运行在微信的数亿Android设备上,相对于其它热更新方案,Tinker相对比较优秀。

什么是Tinker

  Tinker是微信官方的Android热补丁解决方案,它支持动态下发代码、So库以及资源,让应用能够在不需要重新安装的情况下实现更新。当然,你也可以使用Tinker来更新你的插件。

Tinker QZone AndFix Robust
类替换 yes yes no no
So替换 yes no no no
资源替换 yes yes no no
全平台支持 yes yes yes yes
即时生效 no no yes yes
性能损耗 较小 较大 较小 较小
补丁包大小 较小 较大 一般 一般
开发透明 yes yes no no
复杂度 较低 较低 复杂 复杂
gradle支持 yes no no no
Rom体积 较大 较小 较小 较小
成功率 较高 较高 一般 最高

总的来说:

  1. AndFix作为native解决方案,首先面临的是稳定性与兼容性问题,更重要的是它无法实现类替换,它是需要大量额外的开发成本的;

  2. Robust兼容性与成功率较高,但是它与AndFix一样,无法新增变量与类只能用做的bugFix方案;

  3. Qzone方案可以做到发布产品功能,但是它主要问题是插桩带来Dalvik的性能问题,以及为了解决Art下内存地址问题而导致补丁包急速增大的。

Tinker的已知问题

  1. Tinker不支持修改AndroidManifest.xml,Tinker不支持新增四大组件(1.9.0支持新增非export的Activity);

  2. 由于Google Play的开发者条款限制,不建议在GP渠道动态更新代码

  3. 在Android N上,补丁对应用启动时间有轻微的影响;

  4. 不支持部分三星android-21机型,加载补丁时会主动抛出"TinkerRuntimeException:checkDexInstall failed";

  5. 对于资源替换,不支持修改remoteView。例如transition动画,notification icon以及桌面图标。

Tinker更多介绍

  对于tinker的详细介绍,感兴趣的可以前往查看,地址:

  https://github.com/Tencent/tinker/wiki

Bugly的介绍

  腾讯 Bugly,是腾讯公司为移动开发者开放的服务之一,面向移动开发者提供专业的 Crash 监控、崩溃分析等质量跟踪服务。Bugly 能帮助移动互联网开发者更及时地发现掌控异常,更全面的了解定位异常,更高效的修复解决异常。

Bugly目前包括三大服务:

  1. 异常上报;
  2. 运营统计;
  3. 应用升级(包括全量升级和热更新)。

Bugly的热更新

  热更新能力是Bugly为解决开发者紧急修复线上bug,而无需重新发版让用户无感知就能把问题修复的一项能力。Bugly目前采用微信Tinker的开源方案,开发者只需要集成我们提供的SDK就可以实现自动下载补丁包、合成、并应用补丁的功能,我们也提供了热更新管理后台让开发者对每个版本补丁进行管理。

为什么使用Bugly热更新?

  • 无需关注Tinker是如何合成补丁的

  • 无需自己搭建补丁管理后台

  • 无需考虑后台下发补丁策略的任何事情

  • 无需考虑补丁下载合成的时机,处理后台下发的策略

  • Bugly提供了更加方便集成Tinker的方式

  • Bugly通过HTTPS及签名校验等机制保障补丁下发的安全性

  • 丰富的下发维度控制,有效控制补丁影响范围

  • Bugly提供了应用升级一站式解决方案

Bugly热更新SDK的集成

集成Bugly热更新的详细操作可以参考官网的文档:

https://bugly.qq.com/docs/user-guide/instruction-manual-android-hotfix/?v=20171109131920

在这里就不一步一步地结合如何集成SDK,总的来说有一下几个步骤:

  1. 工程根目录build.gradle添加tinker-support插件依赖;

  2. app module的build.gradle添加SDK依赖;

  3. app目录下新建tinker-support.gradle文件,文件的内容文档有提供;

  4. 初始化SDK,改造application,虽然也可以不改造application,但是兼容性可能会出现问题,官方推荐改造application;

  5. AndroidManifest.xml配置相关权限,如果仅仅只是使用热更新而不需要使用到全量升级功能,不需要配置BetaActivity和FileProvider

  6. 混淆配置,在proguard-rules.pro文件中添加Bugly的混淆规则

集成热更新所遇到的相关问题:

  • 文档中提及使用插件的最新版本可以通过使用lastest.release拉取,如图:

但我添加依赖的时候,如下:

buildscript {repositories {jcenter()}dependencies {// tinkersupport插件, 其中lastest.release指拉取最新版本,也可以指定明确版本号,例如1.0.4classpath "com.tencent.bugly:tinker-support:lastest.release"}
}

报了找不到该依赖的错误,原来是文档写错了,lastest应改成latest才对。

  • tinker-support.gradle中缺少supportHotplugComponent这项配置导致打补丁包的时候出现错误

  视频介绍和文档中都没有提及到tinker-support.gradle文件tinkerSupport { }中需要添加多supportHotplugComponent这项配置,按照文档来打补丁的时候,会出现如下错误:

看了错误提示,老是提示我说manifest was changed,可是我根本没有改动到manifest,一直很纳闷,直到看了demo后,才发现需要在tinkerSupport { }中,添加supportHotplugComponent这项配置,代码如下:

tinkerSupport { ...supportHotplugComponent = true}
  • thinkerId 的指定

  thinkerId需要是唯一的,在生成基准包和补丁包时都需要改动,官方推荐时间用git版本号或版本名生成,这里我自己使用的是versionName_MM-dd-HH-mm-ss这种格式,版本名+时间戳,比如1.0.5-1121-11-33-20,这和bakApk下生成基准包目录的时间戳类似,它是app-1121-11-33-20,这样查看起来一路了然,查看补丁包的YAPATCH文件也很清晰:

Created-Time: 2017-11-21 11:37:15.673
Created-By: YaFix(1.1)
YaPatchType: 2
VersionName: 1.0.5
VersionCode: 5
From: 1.0.5-1121-11-36-06
To: 1.0.5-1121-11-37-15

From 是基准包的tinkerId
To 是当前补丁包的tinkerId

生成上述格式tinkerId的代码如下:

tinkerSupport { ...tinkerId = "${verName()}-${buildTime()}"...}//获取版本名
def verName() {def versionPropsFile = file("../version.properties")if (versionPropsFile.canRead()) {Properties versionProps = new Properties()versionProps.load(new FileInputStream(versionPropsFile))return versionProps['VERSION_NAME']} else {throw new GradleException("Could not read gradle.properties")}
}//获取构建时间
def buildTime() {return new Date().format("MMdd-HH-mm-ss", TimeZone.getTimeZone("GMT+8"))
}

需要在工程根目录下,和gradle.properties文件同目录下,新建version.properties文件,用于保存当前app的versionCode和versionName,文件的内容:


VERSION_NAME=1.0.5
VERSION_CODE=4

既然将versionCode和versionName配置在properties文件中,那么app module的gradle文件中,defaultConfig{}中指定版本名和版本号直接使用该配置


android {...defaultConfig {...versionCode verCode()versionName verName()...}}

获取版本号的方法verCode(),代码如下:


//获取版本号
def verCode() {def versionPropsFile = file("../version.properties")if (versionPropsFile.canRead()) {Properties versionProps = new Properties()versionProps.load(new FileInputStream(versionPropsFile))def int verCode = versionProps['VERSION_CODE'].toInteger()return verCode;} else {throw new GradleException("Could not read gradle.properties")}
}

Bugly Q&A

  到这里Bugly热更新的相关介绍就到此为止了,在这里向大家简单介绍了Bugly集成是使用中遇到的问题和相关的建议,官方也提供了常见问题解决的介绍:

   Bugly Android 热更新常见问题

如果里面找不到你想要的,可以联系他们的客服的QQ,但是客服几乎不回答,有点无奈,客服QQ自动回复推荐去他们的论坛留言,可是发现该论坛禁止注册了,有点悲催。几番波折后,终于在他们的新浪微博上找到了希望:

发现了他们提供技术支持的QQ讨论群,群号为: 130979883,现在已经加入了群里,向Bugly的技术人员询问了自己的相关疑问。

Demo源码

https://github.com/chaychan/BuglyHotFixDemo

支持和鼓励

如果你喜欢我的文章的话,可以关注我的博客,感谢大家一直以来给我的支持和鼓励,你们的每一次喜欢和打赏,使我写文章更有动力。

Android热更新初探,Bugly热更新的集成和使用(让你的应用轻松具备热更新能力)相关推荐

  1. Android开发本地及网络Mp3音乐播放器(二十)歌曲下载完成后通知主界面更新本地音乐

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/51448597 项目源码(打赏5积分请点这边):http://download.csdn ...

  2. android版本5.1怎么升级到6.1,华为EMUI3.1新版本开发版5.9.1更新内容

    华为EMUI3.1新版本开发版5.9.1更新内容,荣耀,华为,新版本,内容,功能 华为EMUI3.1新版本开发版5.9.1更新内容 易采站长站,站长之家为您整理了华为EMUI3.1新版本开发版5.9. ...

  3. android P OTA 初探 —— 1、OTA简单介绍

    本系列介绍自己理解的基于android P的OTA系统.由于工作需要开始研究,实践经验匮乏,难免有理解不够或者错误之处.还请多多指正,不吝赐教! 1. 本文提及的OTA指的是android手机的基础操 ...

  4. Android百分比布局初探

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010046908/article/details/48802909 标题:Android百分比布局 ...

  5. Android组件化初探

    Android组件化初探 1. 现状 随着业务增加,代码量急剧增加,大大延长了编译时间,短则3min,长则7.8min:很多同学为节省开发时间,自己新建新的app,完成开发后,再合并到project中 ...

  6. access 更新整列数据_在access中同一列的多个数据一次更新

    在access中同一列的多个数据一次更新 来源:互联网  宽屏版  评论 2012-03-17 16:50:44 分类: 电脑/网络 >> 程序设计 >> 其他编程语言 问题描 ...

  7. win10企业版更新和安全中没有 “恢复”这个选项_通知:微软已强制对Windows 10更新升级...

    最近,微软发布了Windows10的强制升级.从本月开始,如果您的个人电脑.笔记本电脑和其他设备没有手动升级,微软将强制部分用户升级到Windows10 1909或2004版本. 原因很简单.微软已经 ...

  8. 更新计算机上的windows模块安装程序_Win10中用DOS命令也可以完成windows更新,这个技巧还真不知道...

    Windows 10是最新的操作系统,为了改进其功能和特性,微软公司一直不断努力,并通过Windows更新发布新功能.用户只需从"开始-设置-更新和安全"窗口中单击"检查 ...

  9. bugly android 错误不上报,Bugly不上上报日志的解决办法

    Bugly官网 Bugly的引用流程可详细查看官方网站, 自动引用超级简单 在使用bugly的时候发现armeabi和armeabi-v7a的手机可以上传错误日志, arm64-v8a的手机不支持, ...

最新文章

  1. 2022-2028年中国煤化工行业市场前景分析预测报告
  2. 镁光ssd管理工具 linux,在 SSD 上使用 Btrfs 文件系统的相关优化
  3. 流程图虚线箭头的意思_Ai篇NO.3: 怎样画出不死板的箭头?
  4. 第八周项目实践1 建立顺序串的算法库
  5. 周志华眼中的贝叶斯方法(转)
  6. 微信小程序黑客马拉松即将开始,来做最酷的 Mini Program Creators!
  7. NetBeans Java EE技巧3:数据库中的RESTful Web服务
  8. make[1]: *** [objs/Makefile:445: objs/src/core/ngx_murmurhash.o] Error
  9. 我的log4net使用手册(转自 http://blog.csdn.net/lyjcn/archive/2009/08/11/4432833.aspx)
  10. JDK、JRE、JVM的区别与联系
  11. ecmall商品列表页排序的完美解决方案
  12. 苹果录屏功能没有声音_安卓最高清的录屏软件,没有之一,已解锁VIP功能!
  13. PHP 二维数组的合并与去重
  14. 20210324 PS 2019版无法实现不等比例缩放
  15. 中国汽车市场的合资模式终究覆灭
  16. Python编程从入门到实践_第七章_用户输入和while循环
  17. 检测前目标跟踪在雷达系统中的应用(一):DBT与TBD
  18. u-boot-2012.04.01移植到TQ2440
  19. python创建一个文本文件、包含10行字符串、每行字符串由_Python2:使用正则表达式从文本文件中提取整行,子字符串来自anoth...
  20. 【哲学问题】-《哲学家们都干了些什么?》

热门文章

  1. 新浪云python开发_python,flask,SAE(新浪云),搭建开发微信公众账号
  2. 初创企业如何做高效持续交付
  3. 使用matlab绘制世界地图并根据经纬度绘制点位(附m_map的下载与安装说明)
  4. 使用https请求接口报:javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated”异常的问题处理
  5. (最新,所有kali版本通用)kali中安装搜狗输入方法
  6. Android开发的各个领域发展前景?路线?规划未来看这篇
  7. 《机器学习实战:基于Scikit-Learn、Keras和TensorFlow(第2版)》学习笔记
  8. 2020中国网络安全年会论文发布 知道创宇ZoomEye引领全球网空测绘
  9. Leetcode刷题:贪心算法
  10. 计算机专业水平不足,计算机专业教学存在的问题及完善对策