介绍

  在介绍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

什么是Bugly?Android热更新的初讲解相关推荐

  1. bugly android8.1加固,2020-09-27 Bugly Android热更新使用指南

    戳我查看 DEMO Bugly Android热更新使用指南 官方文档 视频教程 第一步:添加插件依赖 工程根目录下"build.gradle"文件中添加: buildscript ...

  2. Bugly Android热更新总结篇

    AndroidManifest文件 新增四大组件 关于Tinker的能力,大家可以移步看下Tinker Wiki. 开发者为什么这么热衷于热更新? 热更新解决了开发者的一个痛点就是程序逻辑出现bug了 ...

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

    介绍   在介绍Bugly之前,需要先向大家简单介绍下一些热更新的相关内容.当前市面的热补丁方案有很多,其中比较出名的有阿里的AndFix.美团的Robust以及QZone的超级补丁方案.但它们都存在 ...

  4. 微信Android热更新Tinker使用详解(by 星空武哥)

    转载请标注原创地址:http://blog.csdn.net/lsyz0021/article/details/54694260 Tinker是什么 Tinker是微信官方的Android热补丁解决方 ...

  5. Android热更新技术的研究与实现Sophix

    所以阿里爸爸一直在进步着呢,知道技术存在问题就要去解决问题,这不,从Dexposed-->AndFix-->HotFix-->Sophix,技术是越来越成熟了. Android热更新 ...

  6. Android热更新研究与实现

    第一部分重点是将当下热门的热更新方案实现之后再研究,第二部分则是自己动手实现一个自己的热更新框架. Android热更新技术的研究与实现之研究篇 ---概念讲解--– 热更新 相关概念 这个词出现的时 ...

  7. android热更新插件,与Android热更新方案Amigo的再次接触

    Amigo 作为一个"过气"的的热修复框架,用来学习和了解一下热修复的基本原理还是很好的.本文是本系列的第三篇. 前两篇: 与Android 热更新方案Amigo的初次接触 原作者 ...

  8. android 上下偏差怎么写_详解 Android 热更新升级如何突破底层结构差异?

    知道了 native 替换方式兼容性问题的原因,我们是否有办法寻求一种新的方式,不依赖于 ROM 底层方法结构的实现而达到替换效果呢? 我们发现,这样 native 层面替换思路,其实就是替换 Art ...

  9. Android热更新

    Android热更新 组件化 组件化和模块化其实一回事,都是拆分多个 module 进行开发,组件化的叫法更偏向封装系统功能,比如统一对话框封装,网络封装等,而模块化叫法更偏向业务方面,比如登录模块等 ...

  10. android 热更新 方案,热更新-热更新app开发的两种系统方案!

    针对app开发工作人员来讲,除开要会编码,热更新也是一定要学好和把握的方法,从技术性视角而言,热更新对Android和iOS各自有不一样的系统软件方案,为了更好地让大伙儿掌握这二种系统方案的差别,今日 ...

最新文章

  1. 家用路由器支持组播吗_组播分布树及其转发模式
  2. Spring的单元测试
  3. QT的QMessageBox类的使用
  4. android同步aar到jcenter,android上传aar到jcenter
  5. IOProcess基础知识
  6. Octopress使用中经验总结
  7. 游戏用计算机配置表显卡,5000元电脑配置9代i5配GTX1660TI显卡配置清单(可装Win7)...
  8. powerpc如何移植Linux系统,PowerPC平台 u-boot 移栽
  9. Nginx的keeplive
  10. 服务器ipsan虚拟化,挂载IPSAN存储+链接克隆模板(修正版)
  11. 微信小程序SEO优化
  12. 在这里,北上深成为“社科之城”
  13. 20190905层析分析法matlab,未通过一致性检验时,重新构造判断矩阵再计算
  14. Linux下文件属性详解
  15. 配置访问路径自定义的swagger接口说明文档api
  16. LR字符串截取lr_save_var
  17. Adobe Reader PDF阅读器闪退问题解决(批处理)
  18. linux lsiutil raid创建,使用Lsiutil在線管理Dell(R410,R610等)內置陣列卡SAS 6i/R
  19. 如果如果,如果没有如果
  20. SQL语言查询同时上多门课程的学生

热门文章

  1. 电脑桌面图标有阴影怎么办
  2. 2021年度学习总结
  3. 青少年重度抑郁的动态功能连接:与严重程度和症状维度的关系
  4. 编译祁大神的iguana,大神就是大神.
  5. 文件夹访问被拒绝 你需要权限来执行此操作,您需要权限来执行此操作
  6. window7中出现 你需要权限来执行此操作 的解决方法
  7. Cobal Strike的学习与使用
  8. Webservice CXF 调用报错 Could not find conduit initiator for address:
  9. html网页什么样的字体最好看,css设置各种中文字体样式代码
  10. C++ TLV格式解析