背景
随着最近苹果粑粑全面下架热更新应用(所以iOS 请绕行 如果你非要试试自己应用会不会被下架那....)和滴滴(VirtualAPK)和360RePlugin开源了自家的热修复插件不断被各种新闻刷屏 突然一想我操我们这么高大上的工程怎么能没有热更新呢说出去会不会太Low了 容我查查相关资料 也撸一发试试 (如果是放在前几年 这些东西还是那些大公司大神才能搞出来的东西 我等小白也只能望洋兴叹 臣妾真的做不到 老板~)
说干就干
场景
当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App、测试、向各个应用市场和渠道换包、提示用户升级、用户下载、覆盖安装。有时候仅仅是为了修改了一行代码,也要付出巨大的成本进行换包和重新发布。
这时候就提出一个问题:有没有办法以补丁的方式动态修复紧急Bug,不再需要重新发布App,不再需要用户重新下载,覆盖安装?
什么是热修复
热修复说白了就是”打补丁”,比如你们公司上线一个app,用户反应有重大bug,需要紧急修复。如果按照通 常做法,那就是程序猿加班搞定bug,然后测试,重新打包并发布。这样带来的问题就是成本高,效率低。于是,热 修复就应运而生.一般通过事先设定的接口从网上下载无Bug的代码来替换有Bug的代码。这样就省事多了,用 户体验也好。
相关原理
网上已经大把的资料请自行查找 这里给出几个:
https://juejin.im/entry/57964afba34131005a96a5b8
https://itimetraveler.github.io/2016/11/10/Android%20%E7%83%AD%E4%BF%AE%E5%A4%8D%E5%8E%9F%E7%90%86%E5%92%8C%E5%AE%9E%E7%8E%B0/
若果你是技术流那可以Google一下会有你看不完转来转去的文章去深入理解 我们的目标是先撸代码
相关方案
来几个大公司的毕竟大公司的东西还是相对比较稳定可信的
美团 Robust 官网https://github.com/Meituan-Dianping/Robust
阿里 AndFix 官网(https://github.com/alibaba/AndFix)
饿了么Amigo 官网https://github.com/eleme/Amigo
微信 tinker 官网https://github.com/Tencent/tinker
滴滴 VirtualAPK 官网https://github.com/didi/VirtualAPK
360 RePlugin官网 https://github.com/Qihoo360/RePlugin
.... 不难看出国内互联网公司还是想尽办法不择手段的在App做手脚的
其中里面大多说都有这句话 文档,还是中文的好 你懂的~
这么多种选择怎么选还是看你自己咯 反正我的原则是大公司出品首先保证稳定和持续更新 然后方便简单集成使用
首先我选择了滴滴的 VirtualAPK 说干就干按照官方的文档集成并不难 但是我硬是没有成功一次 原谅我 是我太菜了 官方文档有这么一段
String pluginPath = Environment.getExternalStorageDirectory().getAbsolutePath().concat("/Test.apk");
File plugin = new File(pluginPath);
PluginManager.getInstance(base).loadPlugin(plugin);
// Given "com.didi.virtualapk.demo" is the package name of plugin APK,
// and there is an activity called `MainActivity`.
Intent intent = new Intent();
intent.setClassName("com.didi.virtualapk.demo", "com.didi.virtualapk.demo.MainActivity");
startActivity(intent);
意思是插件要从本地加载 那么我懵逼了 这不是意味着如果加载插件的话不是要从服务器先下载下来 然后这意味着 要服务器提供个接口判断要不要下载 客户端要考虑什么时候下载 要不要自己写个下载控件 下载要不要来个断点续传什么的.......然后想着想着我就石化了
整个人都不好了~
果断放弃 一定有更简单的 突然听到王尼玛这么对我说 继续搜 卧槽主人公登场
阿里百川 https://baichuan.taobao.com/doc2/detail.htm?treeId=234&articleId=105461&docType=1 阿里一看就是大公司 看完文档我菊花一紧我操 不仅文档齐全还有视频教程 后台管理 尽然还有调试工具和补丁生成工具 心里默默念叨 还是你懂我
来看看官网的介绍
产品简介
阿里百川HotFix是阿里百川旗下全平台App热修复服务方案。产品基于阿里巴巴首创hotpatch技术,提供最细粒度热修复能力。让您无需等待实时修复应用线上问题。
应用场景
阿里百川HotFix提供的热修复能力,让您对应用程序的控制更加自由。
您可以使用HotFix:
紧急修复线上问题。
快速发布新鲜功能。
为什么选择阿里百川HotFix?
方案比较
当前市面的热修复方案有很多,而阿里百川HotFix是其中唯一同时支持Android & iOS端热修复的产品。与众多的开源项目或者半开源项目相比,我们不仅有AndFix、Wax开源项目团队成员的支持;同时还在其原有基础上对打包、调试工具、补丁版本管理等、安全性上做了升级;更重要的是,结合最新的研究成果,突破了原有开源项目的诸多限制,我们能做到类修复、资源修复、so文件修复的实时生效。
相比而言,阿里百川HotFix是一个有着多人团队支持并维护的产品,我们承诺对于加入钉钉群咨询的客户,保证工作日内15分钟
响应,非工作日亦可当天响应的效率,提供您满意的服务。如果您对于产品满意,欢迎推荐给您的朋友,如果有任何建议或意见,也欢迎加入钉钉群和我们联系,或者直接填写问卷给我们留言,您的声音,是我们的动力!
(详情可参考: Android热修复技术选型——三大流派解析)
HotFix总体来说最大的优势在于:
补丁即时生效,不需要应用重启;
补丁包同样采用差量技术,生成的PATCH体积小;
对应用无侵入,几乎无性能损耗;
傻瓜式接入。
但是HotFix1.0版本也有美中不足, 比如暂时不支持新增类和资源,so文件的修复等(这些限制均会在一月中的2.0版本全部去掉,不过这个问题现在已经完全不存在了目前官网的版本已经到了3.X),但是作为一项定位为线上紧急BUG的热修复的服务来说,能够真正做到BUG即时修复用户无感知,同时保证对应用性能不产生不必要的损耗,在热修复方面不失为一个好的选择。
大致意思就我吊你们都弱爆了 反正大家都这样介绍自己嘛
具体集成步骤在这里看官方文档https://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.Prqb9n&treeId=234&articleId=106531&docType=1 好详细他是中文的
你懂的~ 但是你非说你是个老外的话 那......滚犊子 活着不好吗 非来捣乱
遇到的坑:
1,刚开始在自己工程上开了个分支各种集成最后完成用官方测试工具硬是每次都会报 补丁下载失败 整整折腾一天~~~
第二天一想不行换个思路穿建个demo新工程 结果同样的方式 你吗成功了 想想那一刻的心情 然后拿着昨天的工程重来一遍结果好了.........心中真是一万个操..... 所以有时候不是你的错 关掉AS 或者重启电脑 也许你会得到不一样的人生!
2, 官方
生成的补丁默认名为sophix-patch.jar
请一定记得手动改为
然而官方文档有这么一句 baichuan-hotfix-patch.jar 我就日了狗了你们文档和写工具的人不商量吗 ~
补丁文件名称规范:
Android:文件名必须为 baichuan-hotfix-patch.jar
iOS:文件名必须为 *.zip,对于集成1.2.0之前版本的SDK文件名必须为main.js
3.是不是后台创建的名字
不必和App 名称一致也可以测试通过
4, 用测试工具何以加载补丁成功但是调用 SophixManager.getInstance().queryAndLoadNewPatch(); 无效不提示有更新
这个问题困扰我至少三天的时间最后我在官方讨论群里面找到了答案请看芥里~
而单纯的我是酱紫写的
compile ('com.aliyun.ams:alicloud-android-hotfix:3.0.6') {
exclude(module:'alicloud-android-utdid')
}
哦 关键是还不报错 所有下次遇到这种问题 一定一定去找官方沟通下 ! 要不再给我几天我还是发现不了问题的......
来个demo https://github.com/chenguandong/HotFixDemo.git 附带图书地址
最后来说说Sophix是否支持任何代码和资源的修复?
几乎都是支持的。但严格来说,也是有一些特殊情况:
首先,SophixManager的initialize被调用之前的代码无法修复。很好理解,热修复框架都没加载起来,怎么可能修复到呢?所以最好的做法是把初始化放在Application.attachBaseContext或者Application.onCreate的最开始。并且如果是冷启动方式修复,调用initialize的所在类无法被修复。
其次,AndroidManifest.xml里面的变动无法修复。因为AndroidManifest.xml是由系统在安装app时解析,因此在运行时app无法修改它的逻辑的。所以四大组件的新增和修改以及其中主题资源等配置都无法修复到。除非用比较hack的方式预先留空和提早注册,而这种方式就显得不够优雅了。
另外,Sophix里热修复框架本身的代码默认不进行修复
除这两种情况,其他方面的所有热修复都可以得到支持。
所以是修复!= 升级 他能做的只是修复你线上的bug 不代表可以代替升级 不过对我们来说修复这些紧急的bug 已经能让我们愉快的玩耍了
推荐图书
下载地址:
https://github.com/chenguandong/HotFixDemo/blob/master/%E6%B7%B1%E5%85%A5%E6%8E%A2%E7%B4%A2Android%E7%83%AD%E4%BF%AE%E5%A4%8D%E6%8A%80%E6%9C%AF%E5%8E%9F%E7%90%86.pdf
参考文章
https://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=400118620&idx=1&sn=b4fdd5055731290eef12ad0d17f39d4a&scene=1&srcid=1106Imu9ZgwybID13e7y2nEi#wechat_redirect%20%20%20da
http://blog.csdn.net/qq_31530015/article/details/51785228
http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.TZ6gwA&treeId=234&articleId=105461&docType=1