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

目录
相关文章
|
机器学习/深度学习 人工智能 前端开发
使用 Google MLKit 进行图像识别
MLKit 是 Google 提供的移动端机器学习库。工程师仅通过少量代码就能在 Andorid 或 iOS 上实现各种 AI 能力,例如图像、文字、人脸识别等等
3217 0
|
12月前
|
安全 前端开发 Java
Java包管理与访问控制权限详解
本文深入讲解Java包管理和访问控制,涵盖包的创建与使用、访问权限的四个层级,并结合实战案例分析如何设计合理的包结构和访问权限,帮助开发者提升代码的安全性与可维护性。
|
11月前
|
人工智能 前端开发 JavaScript
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
1057 19
前端工程化演进之路:从手工作坊到AI驱动的智能化开发
|
9月前
|
人工智能 运维 自然语言处理
世优波塔推出轻量级网页SDK方案,15分钟实现大屏AI数字人集成
展厅升级AI数字人,无需漫长改造与高昂成本!世优科技推出波塔AI数字人网页SDK,15分钟极速集成,轻量化部署,支持自定义形象与多场景交互。适配各类大屏,打通数据系统与数字孪生,让智慧展厅迈入“分钟级”时代,每个空间都能拥有专属数字灵魂。
406 1
|
10月前
|
缓存 Cloud Native 中间件
《聊聊分布式》从单体到分布式:电商系统架构演进之路
本文系统阐述了电商平台从单体到分布式架构的演进历程,剖析了单体架构的局限性与分布式架构的优势,结合淘宝、京东等真实案例,深入探讨了服务拆分、数据库分片、中间件体系等关键技术实践,并总结了渐进式迁移策略与核心经验,为大型应用架构升级提供了全面参考。
|
druid Java 应用服务中间件
五大主流数据库连接池的深度剖析与对比
HikariCP通过优化concurrentBag和fastStatementList等集合,提升了并发的读写效率。它采用threadlocal缓存连接,并大量运用CAS机制,以最大程度地减少lock的使用。从字节码的维度进行代码优化,确保方法尽量控制在35个字节码以内,以提升JVM处理效率。HikariCP在此基础上的进一步优化措施包括:利用ping命令进行mysql连接,以及通过Sharding-JDBC的Driver、Server和Sidecar三个版本,构建灵活多样的生态系统,满足不同需求和环境。对于线上应用,Sharding-JDBC-Driver可提供直连数据库的最优性能,而Sha
|
人工智能 IDE Java
AI 代码工具大揭秘:提高编程效率的必备神器!
【10月更文挑战第1天】近年来,人工智能得到了迅猛的发展,并在各行各业都得到了广泛应用。尤其是近两年来,AI开发工具逐渐成为开发者们的新宠,其中 GitHub Copilot 更是引发了无限可能性的探索。
1331 9
AI 代码工具大揭秘:提高编程效率的必备神器!
|
移动开发 前端开发 JavaScript
说说JSBridge的原理?
本文首发于微信公众号“前端徐徐”,作者徐徐。文章介绍了 JSBridge 的背景、核心原理及其在 Android 和 iOS 平台上的实现方式,探讨了其应用场景、安全性和性能考量,并提供了优化建议。JSBridge 作为混合开发的关键技术,允许网页应用调用原生功能,结合了两者的优点。
1545 2
说说JSBridge的原理?
|
机器学习/深度学习 DataWorks 安全
CDP是什么?
CDP是什么?
1305 0
|
SQL 数据可视化 定位技术
见证数据的视觉奇迹——DataV Atlas
阿里云DataV的DataV-Atlas是一款专注于地理数据可视化的工具,提供时空数据分析和地图发布功能,适合快速创建地图并分享。与ArcGIS Server相比,DataV.GeoAtlas更侧重于数据可视化和云服务集成,适合非专业用户,而ArcGIS Server是全面的GIS服务平台,适合复杂分析和定制化应用。用户可通过阿里云免费试用DataV-Atlas,体验包括数据上传、地图制作和分析在内的功能。
见证数据的视觉奇迹——DataV Atlas