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

目录
相关文章
|
Swift iOS开发 Perl
如何解决Swift混编的module编译错误
前言很多iOS工程都是基于Object-C开发,再逐步向Swift演进,演进过程中不可避免要进行Swift混编。Swift模块需要支持LLVM Module规范,混编工程会遇到各种Module编译错误。这对于不熟悉的同学来说简直是灾难,严重影响开发效率。本文会介绍常见的Module编译错误,希望对大家有所帮助。常见错误1:Could not build module xxx当一个OC模块引用了Sw
8482 1
如何解决Swift混编的module编译错误
|
8月前
|
边缘计算 Serverless 数据库
Next.js+Vercel+Turso:全栈开发者的终极免费套餐,让数据库查询快10倍、成本降90%!
Turso是基于libSQL(SQLite开源分支)的边缘分布式数据库,支持全球35+节点自动复制、嵌入式本地副本、多写入并发及向量搜索。兼容SQLite生态,查询延迟降至5ms,成本降低90%,免费版即够用。完美适配Next.js/Vercel等全栈场景。
935 1
|
8月前
|
人工智能 自然语言处理 前端开发
静态网站AI自动生成靠谱吗?从原理到落地一次讲清
静态网站AI自动生成已从模板拼接迈入结构级生成阶段,在官网、内容站等边界清晰场景中可靠可用,可提效30%-60%。它本质是启动型效率工具,非替代开发者,而是降低验证成本、加速从想法到上线的路径。
|
11月前
|
人工智能 运维 自然语言处理
世优波塔推出轻量级网页SDK方案,15分钟实现大屏AI数字人集成
展厅升级AI数字人,无需漫长改造与高昂成本!世优科技推出波塔AI数字人网页SDK,15分钟极速集成,轻量化部署,支持自定义形象与多场景交互。适配各类大屏,打通数据系统与数字孪生,让智慧展厅迈入“分钟级”时代,每个空间都能拥有专属数字灵魂。
481 1
|
缓存 Cloud Native 中间件
《聊聊分布式》从单体到分布式:电商系统架构演进之路
本文系统阐述了电商平台从单体到分布式架构的演进历程,剖析了单体架构的局限性与分布式架构的优势,结合淘宝、京东等真实案例,深入探讨了服务拆分、数据库分片、中间件体系等关键技术实践,并总结了渐进式迁移策略与核心经验,为大型应用架构升级提供了全面参考。
|
运维 网络协议 Linux
【专栏】 20 个 Linux 命令,运维工程师工作时最常用的
【4月更文挑战第28天】本文介绍了运维工程师常用的20个Linux命令,包括`ls`、`cd`、`pwd`、`mkdir`、`rm`、`cp`、`mv`、`cat`、`more`、`less`、`head`、`tail`、`grep`、`find`、`chmod`、`chown`、`chgrp`、`ps`、`top`和`ifconfig`,帮助提升工作效率。此外,还提到了其他常用的命令如`df`、`free`、`tar`、`ssh`、`scp`、`ping`、`netstat`、`iptables`、`systemctl`、`hostname`等,建议运维人员掌握以应对各种运维场景。
2039 1
|
druid Java 应用服务中间件
五大主流数据库连接池的深度剖析与对比
HikariCP通过优化concurrentBag和fastStatementList等集合,提升了并发的读写效率。它采用threadlocal缓存连接,并大量运用CAS机制,以最大程度地减少lock的使用。从字节码的维度进行代码优化,确保方法尽量控制在35个字节码以内,以提升JVM处理效率。HikariCP在此基础上的进一步优化措施包括:利用ping命令进行mysql连接,以及通过Sharding-JDBC的Driver、Server和Sidecar三个版本,构建灵活多样的生态系统,满足不同需求和环境。对于线上应用,Sharding-JDBC-Driver可提供直连数据库的最优性能,而Sha
|
Java 关系型数据库 MySQL
java入门项目:学生管理系统(进阶版超详细搭建)
学生管理系统是一个典型的信息管理系统,熟悉并掌握其需求和设计思想对于理解和学习数据库操作和Java编程有非常大的帮助。 分为学生端和教师端 1. 学生端的功能分为登录、注册、查看个人信息、查看成绩、申请修改信息 2. 教师端的功能分为登录、注册、查看学生信息、修改学生信息、删除学生信息、添加学生信息、查看学生申请的修改信息
13685 3
|
机器学习/深度学习 DataWorks 安全
CDP是什么?
CDP是什么?
1375 0
|
前端开发
如何实现CSS中flex布局最后一行左对齐?
前言 flex布局目前已经非常流行了,它基本上可以完成大部分的布局需求。早一些的float布局、表格布局等等便没有那么受欢迎了。但是任何事物都不是完美的,flex布局也一样,它也有瑕疵,就比如我们今天所要讲的flex布局中最后一行对齐问题。
3481 0
如何实现CSS中flex布局最后一行左对齐?