Alibaba增强开源项目Wax

简介:

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

发版的痛

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

Wax是什么?

1009270

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

为什么选择Wax?

logo
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,这是对我们的一种莫大的肯定。
_2015_10_21_11_39_03

目录
相关文章
|
存储 API
LangChain与智能Agent构建问题之MetaGPT中工程师智能体代码错误如何解决
LangChain与智能Agent构建问题之MetaGPT中工程师智能体代码错误如何解决
198 1
|
3月前
|
安全 前端开发 Java
Java包管理与访问控制权限详解
本文深入讲解Java包管理和访问控制,涵盖包的创建与使用、访问权限的四个层级,并结合实战案例分析如何设计合理的包结构和访问权限,帮助开发者提升代码的安全性与可维护性。
|
2月前
|
人工智能 前端开发 JavaScript
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
543 18
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
|
11月前
|
JSON JavaScript 前端开发
Highcharts 教程
Highcharts 教程
259 2
|
11月前
|
监控 Linux 数据处理
Linux grep技巧 结合awk查询
结合 `grep` 和 `awk`,可以实现灵活、高效的文本处理和数据分析。`grep` 用于快速过滤符合条件的行,`awk` 用于进一步处理和提取数据。这种组合使用在日志分析、数据处理和系统监控等场景中尤为常见。掌握这两者的基本用法和组合技巧,可以大大提升在 Linux 环境下的工作效率。
312 7
|
人工智能 IDE Java
AI 代码工具大揭秘:提高编程效率的必备神器!
【10月更文挑战第1天】近年来,人工智能得到了迅猛的发展,并在各行各业都得到了广泛应用。尤其是近两年来,AI开发工具逐渐成为开发者们的新宠,其中 GitHub Copilot 更是引发了无限可能性的探索。
754 9
AI 代码工具大揭秘:提高编程效率的必备神器!
|
存储 数据采集 JSON
Open NotebookLM,一键PDF/URL转播客!
本文带你来了解,结合不同的开源模型,例如Qwen2.5-72B-Instruct, CosyVoice-300M)等,将PDF文件(比如论文paper),或者网页URL内容,转换成为有趣的播客😊。
|
移动开发 前端开发 JavaScript
说说JSBridge的原理?
本文首发于微信公众号“前端徐徐”,作者徐徐。文章介绍了 JSBridge 的背景、核心原理及其在 Android 和 iOS 平台上的实现方式,探讨了其应用场景、安全性和性能考量,并提供了优化建议。JSBridge 作为混合开发的关键技术,允许网页应用调用原生功能,结合了两者的优点。
728 2
说说JSBridge的原理?
|
人工智能 安全 前端开发
免费高效!3步实现Llama3模型远程访问与协作
Meta发布了全新的开源大语言模型Llama 3,LM Studio是一款免费的桌面端工具,支持一键安装和运行Llama 3模型,实现本地使用。LM Studio还提供了Local Server功能,便于集成AI功能。通过贝锐花生壳,可轻松实现LM Studio接口的远程访问,无需公网IP或端口映射。
890 1
下一篇
oss云网关配置