Android 热补丁实践之路

大约在15年下半年开始,热补丁方案开始大量涌现,一时间热补丁修复技术在 Android 圈非常火爆,比较有代表性的开源实现有 DexposedAndFixNuwa 以及前段时间微信开源的 Tinker,至于他们的原理以及优缺点比较并不是本文要讲的,网上已经有一大堆资料进行介绍了,感兴趣的可以看下这几篇文章:

我一直认为对于客户端开发来说热补丁修复技术不是必须的,但是却很有必要的,我们身为开发者虽然都不想自己的程序出 bug,但是没有一个开发人员能保证自己的程序一定不出 bug 的,之前出了问题只能重新发布版本,然后用户下载更新,这个代价还是蛮大的,但是有了热更新技术,这个就变得很简单了。

所以在半年前我们也评估了以上几种热修复框架,准备用在项目中。

首先考虑的就是阿里开源的 Dexposed 和 AndFix 两个框架,前者是手淘开源的,后者是支付宝团队开源的,都是 native hook 的方案,但是 Dexposed 不支持 art,在未来这是个很大的隐患,所以直接抛弃我们选择了 AndFix。

评估下来,我们觉得 AndFix 虽说有一些限制,比如并不支持类替换、资源文件替换和 so 替换等,但是毕竟支持全平台,唯一担心的是 AndFix 基于 native hook 的方案,不是属于 java 层,属于 jni 层,在国内这么复杂的大环境下,稳定性与兼容性是个很大的考验,不过想到毕竟是支付宝团队出品,应该不用过渡担心。

于是我们开始着手在项目中集成 AndFix,过程还算顺利,实际测试下来效果也蛮好的,直到真的一次线上版本出现了 bug,考验 AndFix 的时候到了,像集成的时候一样,QA发布补丁,测试ok然后发布到正式环境。但是接下来并没有像我们想象的一样,错误率并没有下降,而且从后台错误统计看到反而产生了新的莫名其妙的bug,所以我们就觉得兼容性有问题了,赶紧修复紧急发布了新的版本。

这次经验证明了,native hook 的方案兼容性确实有很大问题,而且 AndFix 框架本身也有坑,从 GitHub 上该项目的 Issues 数量也可以看到,目前仍有近 200 个 issue 没有解决。

我们中途考虑采用 Nuwa,毕竟 multidex 方案是属于 java 层面的,兼容性肯定没有问题,但是评估之后觉得 Nuwa 会带来性能问题,而且这个时候微信的热补丁方案 Tinker 已经放出来,并且表示即将开源,所以我们考虑等 Tinker 开源了再说。

今年的9月24号,MDCC 大会上腾讯的 Tinker 终于开源了,我们在第一时间进行了评估。

总体看下来,虽说 Tinker 也有一些限制,但是综合下来优势很明显,下图是微信官方曝出的一张各大热修复方案对比图,看下来很直观:

img1

 

 

除了技术上有优势之外,还有就是微信覆盖的人群太广了,全国几亿人,各种设备都有,在兼容性方面微信肯定是首选考虑的,所以兼容性方面评估下来应该不是问题。

于是安排团队成员果断把 AndFix 替换成 Tinker,主要是我们项目依赖了 resGuard 来进行资源混淆,所以集成过程中稍微有点小麻烦,但总体来说还算比较顺利,毕竟 Tinker 官方文档很齐全,而且我认识 Tinker 作者,有问题甚至都可以直接进行请教。

就在前几天我们发布了新版,其中出了一个 bug,又到了检验 Tinker 效果的时候了,这一次 Tinker 没有让我们失望,补丁发布之后出错率降的很明显,实践证明 Tinker 在兼容性方面完全没问题。为了更有说服力,上一张真实的友盟出错率:

img2

 

现在的技术与资料越来越多,只看网上的理论永远没有任何说服力,只有亲自实践才能是最好的说服力。之前很多人都问过我,说热补丁修复框架到底哪一个好,我都没有回答,那是因为我们还没有亲自实践,不能只单纯的从理论来进行分析,结果很重要。而如今,如果你想把热补丁框架应用到你们项目中的话,那么我推荐把 Tinker 作为最优选择,起码现阶段来说是最优选择。

 

转自:http://blog.csdn.net/googdev/article/details/53067400

Android最佳的开源库集锦

工欲善其事,必先利其器。一个好的开发库可以快速提高开发者的工作效率,甚至让开发工作变得简单。本文收集了大量的Android开发库,快来切磋一下,到底哪一个最适合你。

动画

APIs

  • CloudRail:可以将多个服务(例如Dropbox、Google Drive和OneDrive)捆绑成一个统一的API,帮助开发者快速地集成。此外,还可以处理API更新,保持代码一致。接口也可以用于云存储、社交、支付等等。
  • Retrofit:Retrofit是Square公司开发的一款针对Android网络请求的框架,它将HTTP API封装成一个Java接口。

图表

  • MPAndroidChart:一款基于Android的开源图表库,MPAndroidChart不仅可以在Android设备上绘制各种统计图表,而且可以对图表进行拖动和缩放操作,应用起来非常灵活。
  • AndroidCharts:一款易于使用的Android图表动画类库,包含曲线/折线图、饼图、时钟图、柱状图。

数据库

  • SQLBrite:是一个响应式数据库框架,可以完美解决数据库和UI的同步更新。
  • Sugar ORM:无需编写SQL语句就可以轻易操作SQLite数据库。

数据结构

日期&时间

依赖关系

  • Dagger:可以在Android平台上快速进行依赖注入。

文件

函数式编程

  • Retrolambda:可以在Android上使用Lambdas表达式。

手势

  • Sensey:可以在Android应用程序里面添加手势操作,使用简单。
  • Android 3D Touch – PeekView:可以在Android平台上实现类似iOS上面的3D Touch功能。

蓝牙

  • Android-BluetoothSPPLibrary:开发者用它可以通过蓝牙与微控制器(microcontroller)或Android设备进行通信。
  • RxAndroidBle:基于RxJava技术,可用较低的电量操作蓝牙。

相机

位置

ReactiveLocation:是一个轻量小型但非常实用的Google Play API封装,可以获取位置。
Smart Location Library:简化定位程序使用。

布局

日志

  • Logger:一款简单但功能强大的日志工具。
  • Hugo:调用日志的注释触发方法,用来调试构建。

地图

音频

  • Music Player:是使用Swift编写的全功能的音乐播放器,UI也很漂亮。
  • RxAndroidAudio:Android音频封装库。

GIF

图片

  • uCrop:Android上的图片修剪库。
  • Glide:Android媒体管理和图片加载库。

视频

消息

  • Chateau:在Android应用中提供聊天功能的框架。

网络

通知推送

  • PubNub:用来处理推送通知的通信服务。
  • Gandalf:给用户发送更新或维护消息库。

支付

安全

  • Sodium:用来加密,解密,签名和散列的算法库。
  • PiracyChecker:使用Googles LVL和APK签名保护等技术来防止APP被破解和盗版的函数库。

文本

字体

  • fontbinding:通过数据绑定是在XML实现自定义字体的库。
  • Calligraphy:在Android应用程序上轻松使用自定义字体。

用户接口

Activity Indicator

  • AppIntro:实现类似Google Apps的应用启动引导页。
  • LolliPin:Material Design风格的Pin码输入界面。

按钮

表单

键盘

菜单

  • BottomBar:Material Design风格的底部导航栏。
  • Side Menu:创建侧滑菜单库。

Rating

  • Android-Rate:定期提醒用户到应用市场给应用打分的函数库。
  • SimpleRatingBar:一个用于替换系统提供的评分控件的函数库。

Slider

  • SlidingMenu:可为应用程序创建侧滑菜单的库。
  • MaterialDrawer:Material Design风格的侧边抽屉库实现。