Alibaba增强开源项目Wax

该文章来自阿里巴巴技术协会(ATA)

发版的痛

去年无线All in时每次手淘发版都需要经过多个月的煎熬,哪怕一个很小的需求改动也需要等待整个发版节奏。
发版周期长、发版需求多、发版难是手淘这种超级app的特点,而审核时间长、升级速度慢、升级率低是App Store的通病,线上bug更是每个app都避免不了痛,而对于手淘亿级的UV来说,哪怕一个小小的bug都会影响成千上万的用户。对于这些困扰了多年的问题,急需一种无需发版即可动态修复线上问题的解决方案!

Wax是什么?

还记得当年火爆无比的游戏《愤怒的小鸟》吗,它就是基于Wax框架编写的。Wax把Lua脚本语言与原生Objective-C底层runtime结合起来,使得你可以在Lua里面使用任何Objective-C类及框架。

为什么选择Wax?


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

我们对Wax做了什么改造?

线程安全

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

64位适配

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

block传递、调用

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

get/set私有成员变量

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

常用C函数

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

Lua代码调试

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

bug修复

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

Hotpatch封装

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

使用情况

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

为什么回馈开源?

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

时间: 2024-10-21 15:00:31

Alibaba增强开源项目Wax的相关文章

国内大公司的开源项目一览表

奇虎360 https://github.com/Qihoo360 1.MySQL中间层 Atlas Atlas是由 Qihoo 360,  Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性.目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条. 主要功能:* 读写分离* 从库负载均衡* IP过滤*

企业级应用开发中的JAVA开源项目

对于目前企业应用开发竞争日益激烈,需求变更频繁,各个系统集成商都面临巨大的生存压力.其中有两个方面表现尤其突出: 没有统一的软件开发过程或者照搬重量级的软件开发过程,例如RUP等,但是往往由于时间等压力的影响,并不能切实执行:大部分企业仍然没有摆脱手工作坊期间的做法,每个项目或者产品由于管理人员或者团队的不同,重新设计系统框架,浪费大量的时间在结构验证与调整上. 企业应用系统的开发中,需求的变更是项目中唯一不变的东西,而且,为了保持开发的一致性和利益最大化,系统集成商需要与客户保持长期的合作.因

android开源项目下载地址

FBReaderJ FBReaderJ用于Android平台的电子书阅读器,它支持多种电子书籍格式包括:oeb.ePub和fb2.此外还支持直接读取zip.tar和gzip等压缩文档. 项目地址:http://www.fbreader.org/FBReaderJ/ 源码地址:http://www.fbreader.org/files/android/FBReaderJ-sources-1.2.6.zip FBReaderJ-sources-1.2.6.zip (1.95 MB, 下载次数: 85

[置顶]这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧

注意:有网友提出部分项目停止更新的事情,这个问题我特意注意过,很多都是小功能组件,功能稳定,没有bug,没更新是正常的.够用就行了.其次技术支持的事情,对开源免费来说,不能太强求,这里发布的都是小功能组件,一般看源码也比较好理解,各取所需.当然有最好.. 长期关注和使用.NET开源项目,给我带来了很多好处: 1.可以快速完成我的想法,也就是所谓的业务细节,而不是关注如何实现: 2.可以更快更稳定的完成需求,而不是自己造轮子实现,花费时间: 3.从.NET开源项目的使用以及源码阅读中也会带来一些好

安全专业人士最爱的 19 个 GitHub 开源项目

GitHub上有许多开源项目可供安全专业人士选择,而且每天都有新的项目出现.不妨将这些项目添加到你的工具库,让你工作起来更得心应手. 说到执行常规维护.化解危机或研究新项目,大多数管理员要么手动执行任务,要么编写让这个过程自动化的脚本.但是那些聪明人在寻找功能强大的工具来完成这项工作. GitHub上有800多个面向安全的项目,为IT管理员和信息安全专业人士提供了丰富的工具和框架,它们可以用于恶意软件分析.渗透测试.计算机及网络取证分析.事件响应.网络监控及其他众多任务. 下面介绍了一些最出色的

【Android】GitHub Android 开源项目汇总

参考网址:http://blog.csdn.net/ithomer/article/details/8882236 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上.基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要.利用这些项目,有时能够让你达到事半功倍的效果. 1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个

开源项目使用及选型

一.为什么选择开源项目 1. 快速开发   2. 站在巨人的肩膀上 成熟的开源项目,功能完善.设计优秀,细节点考虑周全,不用像自己开发一样需要从头去全面开发.测试.完善.本身也是好的学习材料.Android 本身就是在 Linux.Java 上发展起来的.   3. 社区.全网智慧 成熟的开源项目会被众多项目采用,运行在各种场景下,实用性更强,场景更广,同时使用者通过 PR 可以完善项目.修复 Bug,增强项目,由社区维护,而不像一些公司自己开发的,主导者走了就成为了烂摊子.   二.如何选择开

Otter-入门篇1(阿里开源项目Otter介绍)

Otter-入门篇1(阿里开源项目Otter介绍) 前言 呜啦啦啦啦!今天笔者又来开坑了,这次开坑的对象呢是阿里的一个开源项目Otter,Otter它是一个数据同步解决方案,可以解决本地跨网络跨机房跨地域的数据同步问题,并且拥有可观的效率,web管理工具等特点,而且背景也很优秀,据说阿里B2B内部的本地/异地机房的同步需求基本全上了otter. 附上: 喵了个咪的博客:w-blog.cn Otter项目地址:https://github.com/alibaba/otter Otter文档地址:h

视频会议及流媒体十大开源项目

在视频会议领域,有许多可以值得参考的开源项目,这些开源项目有的是协议栈.有的是编码器或者是传输协议,由于视频会议系统是一个综合性的应用系统,里面包含功能较多,如能把这些开源项目选择性的加入我们的视频会议开发当中,我们的开发效率肯定会事半功倍,下面我们列举一下视频会议相关的十大开源项目,并对其重要性及优缺点做一个全面的评价与排名. 1. OpenH323项目        () 上榜理由:最著名的H.323开源协议栈,视频会议开发必备协议栈,强烈推荐 最著名的H.323开源协议栈,包含了全部的H.