阿里云移动热修复Sophix问题汇总
作者:互联网
为了解决项目中安卓在线更新安装包过大以及线上BUG修复的及时性问题,决定在2.x开始集成热修复功能。
分别尝试了微信的Tinker、美团的Robust以及阿里的第一代热修复框架Andfix,但考虑修复补丁包生效实时性、对目前的项目改动大小以及后期对补丁包的管理等问题,最终考虑了阿里云最新热修复框架Sophix,
几个主流热修复框架对比如下(阿里云官网提供,Sophix是最后一列):
根据官网的描述,Sophix几乎囊括了前面框架的所有优势,唯一的劣势就是收费,考虑到免费额度(50000个去重设备 + 20次补丁查询次数/设备/天)已经完全够用于项目初期。并且对于开发这块,官网对“接入复杂度”的描述使用了“傻瓜式接入“,由此看来,应该没什么难度了。
那么是不是真的这么简单呢?根据这两天测试的空档,把整个集成流程完整地走了一遍,还是有几个坑,遂成档以记录之。
根据阿里开发文档的描述,总体流程还是清晰的:
https://help.aliyun.com/document_detail/181015.html?spm=a2c4g.11186623.6.552.65af788f3zK6B9
1、开通热修复服务
这步比较简单,点一下就行了,过程不再赘述。
需要注意的是,配置页只有AppKey和AppSecrect信息
RSA只能在去这里查(RSA集成SDK会使用)
2、集成sdk
根据官方指导,必须有个自定义Application实现SophixApplication,如果已经有了自定义的Application,须以@SophixEntry注解指明,并Manifest中注册实现了SophixApplication的Application。
如果当前项目使用了MultiDex,则必须在onCreate()方法中调用MultiDex.install(this),项目中就需要调用。
关于配置参数,为了安全起见,应该通过SophixManager#setSecretMetaData指定,尽管Manifest中可以,但在解压apk文件时会暴露。
特别强调,自定义的Application中,千万不要出现Android Framework以及sophix lib中之外的引用,否则生成补丁失败。
3、生成补丁
这地方的坑我认为是最大的。
首先是安装SophixPatchTool解压版,其中exe文件无法以非管理员身份打开,在”网管“的协助下才解决。
其次,将打包debug apk后,使用工具在长达1个半多的时内始终显示”开始构建补丁“,如下图。
本为以为是项目太大导致时间过长,遂决定创建一个新的demo项目,结果出现同样的问题。
接着想到是不是因为没有管理员权限(第一次打开软件有报”兼容性提示“),于时让旁边iOS小伙伴用自己mac电脑试试,结果OK,这就排除的apk文件的问题。
然而。。。。
问题恰恰出现在apk上,根据我一贯的做事风格,先提个工单再自己找原因。
阿里云反馈速度很快,赞!
让我尝试用7zip解压文件,果然出现提示(Sophix也是先7zip解压,再比较差异),所以卡在这里了,但补丁工具没有任何提示,也是挺纳闷的。
最后,阿里云给定的解决方案如下 :
先是尝试使用release包,如果生产包可以的话,也无伤大雅,只要后面集成的时候用生产包比对补丁即可,很可惜,这种方式即使7zip没有提示,却同样卡在了”开始构建补丁“这步。
用mac是不是可能的,一次两次还可以了,时间一长无疑增加别人的工作量。
权衡再三,降级gradle版本,之后便是修改gradle降级导致的问题,此处省略一万字。
4、调试补丁
本以为大功告成了,补丁调试也是一个费时的活。
根据阿里”对生产环境保持敬畏之心“的提示,在线上发布补丁之前先做好本地补丁调试。
具体做法就是下载一个官网上的apk装到手机上,如下图:
装好调试软件后,输入应用包名(如未安装应用则安装旧包),点击连接,接着扫描补丁二维码后便可在应用中下载并加载补丁包。
在加载过程中,出现了上图中Code:35的错误,工单咨询后是第二步集成时的参数配置错了,把项目的参数配到demo上了,这点要细心,尤其是RSA复制的时候不要有空格等。
加载后需要杀掉进程后才能生效,也就是官方文档中所说的冷启动。
关于启动方式,官网的意思是,如果在打补丁包的时候选择了”强制冷启动“,那就肯定是冷启动生效了;如果没勾选,则Sophix会根据补丁的性质来决定启动方式。
于是,我在打补丁的时候去掉了默认的勾选,发现修改class方法和资源时仍然没有热启动生效,具体待研究。
5、发布补丁
这个没什么好说的,主要关注这个”实际通知人数“,这个就是上面说的收费项20次查询调用,在应用中要手动调用queryAndLoadNewPatch方法。
补丁生效后,当用户在手机设置里清除数据后,当前应用又回到基版本(无任何补丁的版本),根据工单咨询,只能再次调用queryAndLoadNewPatch方法。
6、总结
以上便是Sophix的集成过程,尤其要注意红色字体,在后面的使用过程上,保不定会有各种问题,届时再来更新。
持续更新=========================================================================
1、什么时候冷启动?什么时候热启动?
您好,测试即时生效 1、补丁工具可以不勾选强制冷启动,这样就由工具自行判断是否生成冷/热补丁。 注意,不是不勾选强制冷启动,就一定是热补丁。 2、不要改首启动页,加载补丁去修复也是需要时间的。 3、可以试下改动都是public修饰的类或方法,尽量不要改动static。 4、资源或so改动一般都是冷启动生效的。 5、实际建议使用冷启动补丁,热补丁可能少数机型加载有问题,如果使用热补丁,尽量全面测试后再发布。 6、最简单示例:public类中一个public方法,先不要static修饰,打个log或返回值都可以,然后只修方法输出。 更详细的冷热划分,看看下面的技术文章吧。 Sophix技术概览: https://yq.aliyun.com/articles/103527 即时生效的代码热修复: https://yq.aliyun.com/articles/74598 资源热更新技术详解: https://yq.aliyun.com/articles/96378 Dalvik下冷启动修复的新探索: https://yq.aliyun.com/articles/107396 Art下代码冷启动方案: https://yq.aliyun.com/articles/222892 SO库修复方案: https://yq.aliyun.com/articles/217377 《深入探索Android热修复技术原理》实体书出版!现已上架各书店,欢迎感兴趣的朋友了解~ 天猫:https://detail.tmall.com/item.htm?id=575682644381 当当:http://product.dangdang.com/1058631415.html 京东:http://item.jd.com/12424434.html
2、您好,请问:如果在版本1上打了多个补丁后将app版本升级到了2。 1、在补丁管理控制台中对版本1的所有补丁进行回滚,会影响已经升级到版本2的app吗? 2、如果再对版本2上的后续补丁(无版本升级)进行回滚,基线版本是1还是2? 以上,请帮忙回复下,谢谢!
您好,需要确定下多个补丁后将app版本升级到了2,是apk级别升级吗,升级安装版本2吗。 回复您是和不是两种情况: 1、是升级安装版本2, 1)不影响。 2)回到版本2。 2、只是通过补丁将版本1升级到版本2,没有apk升级安装。 1)会的。 2)回到版本1。 总结:升级安装版本,那各个版本之间互不影响,独立的。
补充:通过补丁方式也可以升级app(versionName变化),但基线包还是第一次打包前的app版本。比如进行了以下操作:
原始版本2.2.0 →修改versionName打包后版本为2.3.0
那么,再次打包需以2.2.0为基线版本打包,而不是2.3.0,回滚同样道理。
记住:无论补丁升级了多少次,基线版本仍然是最原始安装升级的那一次。
标签:https,修复,Sophix,汇总,补丁,阿里,冷启动,版本,com 来源: https://blog.csdn.net/m0_48179608/article/details/118336807