开源技术无需发版即可动态修复线上问题
署名2020-12-10

 

开源技术无需发版即可动态修复线上问题?我们都知道,发版周期长、发版需求多、发版难是手淘这种超级app的特点,而审核时间长、升级速度慢、升级率低是AppStore的通病,线上bug更是每个app都避免不了痛,而对于手淘亿级的UV来说,哪怕一个小小的bug都会影响成千上万的用户。开源技术就是一种无需发版即可动态修复线上问题的解决方案!开源技术Wax把Lua脚本语言与原生Objective-C底层runtime结合起来,使得你可以在Lua里面使用任何Objective-C类及框架。

1.png

一、选择开源技术Wax的原因:

Lua是一个简洁、轻量、可扩展的脚本语言,它的体积小、速度快,在大量的游戏中使用,以实现游戏的可配置和可更新。我们可以把这个思路借鉴到app的开发中,由于Lua需要预先绑定很多C函数才可在脚本中使用,所以单独使用Lua无法做到高复用性。而Wax连接了Lua与Objective-Cruntime,使得我们可以在Lua里调用和替换任意类的方法,甚至新增类、方法。这样一来就能在app不发布新版的情况下,通过远程下载脚本的方式修复线上app里的bug、甚至新增一些功能。

二、对开源技术Wax做的改造:

 (1)Lua代码调试:

编写简单的Lua代码,只需要几个print打点日志就可以判断逻辑的执行是否正确。但如果是量多、复杂的代码时,只能打日志就会很痛苦了。所以我们将开源届比较强大的Lua调试器ZeroBraneStudio引进,再配合mobdebug远程调试脚本,适配到Wax,就实现了Lua代码在Wax框架中的调试,支持常用的断点、单步,当然还有更方便的观察变量、显示调用栈、控制台调用等

(2)线程安全:

Wax本身的设计的场景是针对主线程的UI等逻辑,当我们去替换一个会多线程异步调用的方法时就会出现crash,这样一来就会削弱修复的场景,所以我们给Wax在合适的地方进行多线程保护使其具有线程安全特性。

(3)block传递、调用:

在Objective-C中,block以其简洁、易用的特性使用越来越普遍,而Wax虽有Lua的closure却没有支持Lua与OC的block互通,这会使我们无法修复带有block的方法,为此我们对block的原理进行彻底的分析,同时绞尽脑汁利用32\64位函数参数入栈的特性,最终支持高达7个参数(当然,也可以支持更多)的block传递、调用。

(4)64位适配:

从iPhone5s开始,苹果推出了64位cpu架构,开始陆续要求app必须支持64位。Lua字节码也有32位与64位编译区分,所以原来的Waxstdlib库在64位无法运行,我们修改原有的Lua字节码打包逻辑使其能在64位正常运行。Wax的核心逻辑是替换函数,但原思路利用了32位函数入栈的特性,导致此方法在64位彻底失效。为此我们重新寻找新的函数替换思路,确保在64位也能正常运行。

(5)常用C函数:

要想在Lua里调用C函数,只需要在C代码里注册一下即可,所以看起来支持C函数很简单。但如果我们要把OC框架里的常用的几十、几百个函数都要支持呢?人肉一个个的写显然会显得乏力。所以我们将OC框架里的函数从文档拷贝出然后用脚本预处理,再使用tolua++进行自动代码生成、绑定,这样一来即使支持更多C函数也很简单了。

(6)get/set私有成员变量:

开源技术Wax支持属性的get/set,但似乎忽略了私有成员变量,而我们的代码大量使用了私有成员变量,所以必须支持。庆幸的是Objective-Cruntime有操作私有成员变量的API,因此我们在上层对NSObject扩展一些get/set的方法就可以支持私有成员变量的操作了。

(7)bug修复:

由于开源技术Wax从2013年就不再维护,而我们的使用场景又多、又复杂,所以也会发现里面的不少bug,当然也做了修复。

(8)Hotpatch封装:

开源技术Wax提供了基础的Lua运行能力,但真正应用时,还需要很多准备工作。所以我们封装了TBHotaptchSDK提供Lua字节码编译、代码和资源打包、加密、签名、校验、运行等功能。同时还封装了TBHotaptchService提供patch包的版本控制、更新、下载等功能。

(9)使用情况:

 iOS的Hotpatch从研发上线以来共发布patch180多次,意味着修复手淘线上bug100多个。集团有天猫、聚划算、支付宝、闲鱼、UC等近20个app接入。足以证明Hotpatch的强烈需求以及Wax的价值。

开源技术Wax从2013年初就不再被原作者维护了,而64位的出现使得开源技术Wax完全不可用,业界也希望有人来解决Wax的众多问题。我们虽对Wax做了很多改造,但最初也是吸收开源届的贡献,秉承开源的奉献精神,将我们付出的劳动再回馈给开源,希望重新激活Wax社区,重新打造一个强大的开源技术Wax。