天天看點

Alibaba增強開源項目Wax

去年無線all in時每次手淘發版都需要經過多個月的煎熬,哪怕一個很小的需求改動也需要等待整個發版節奏。

發版周期長、發版需求多、發版難是手淘這種超級app的特點,而稽核時間長、更新速度慢、更新率低是app store的通病,線上bug更是每個app都避免不了痛,而對于手淘億級的uv來說,哪怕一個小小的bug都會影響成千上萬的使用者。對于這些困擾了多年的問題,急需一種<code>無需發版即可動态修複線上問題</code>的解決方案!

Alibaba增強開源項目Wax
Alibaba增強開源項目Wax

還記得當年火爆無比的遊戲《憤怒的小鳥》嗎,它就是基于wax架構編寫的。wax把lua腳本語言與原生objective-c底層runtime結合起來,使得你可以在lua裡面使用任何objective-c類及架構。

Alibaba增強開源項目Wax

lua是一個簡潔、輕量、可擴充的腳本語言,它的體積小、速度快,在大量的遊戲中使用,以實作遊戲的可配置和可更新。我們可以把這個思路借鑒到app的開發中,由于lua需要預先綁定很多c函數才可在腳本中使用,是以單獨使用lua無法做到高複用性。而wax連接配接了lua與objective-c runtime,使得我們可以在lua裡調用和替換任意類的方法,甚至新增類、方法。這樣一來就能在app不釋出新版的情況下,通過遠端下載下傳腳本的方式修複線上app裡的bug、甚至新增一些功能。

wax本身的設計的場景是針對主線程的ui等邏輯,當我們去替換一個會多線程異步調用的方法時就會出現crash,這樣一來就會削弱修複的場景,是以我們給wax在合适的地方進行多線程保護使其具有線程安全特性。

從iphone5s開始,蘋果推出了64位cpu架構,從今年2月份開始陸續要求app必須支援64位。

lua位元組碼也有32位與64位編譯區分,是以原來的wax stdlib庫在64位無法運作,我們修改原有的lua位元組碼打包邏輯使其能在64位正常運作。

wax的核心邏輯是替換函數,但原思路利用了32位函數入棧的特性,導緻此方法在64位徹底失效。為此我們重新尋找新的函數替換思路,確定在64位也能正常運作。

在objective-c中,block以其簡潔、易用的特性使用越來越普遍,而wax雖有lua的closure卻沒有支援lua與oc 的block互通,這會使我們無法修複帶有block的方法,為此我們對block的原理進行徹底的分析,同時絞盡腦汁利用32\64位函數參數入棧的特性,最終支援高達7個參數(當然,也可以支援更多)的block傳遞、調用。

wax支援屬性的get/set,但似乎忽略了私有成員變量,而我們的代碼大量使用了私有成員變量,是以必須支援。慶幸的是objective-c runtime有操作私有成員變量的api,是以我們在上層對nsobject擴充一些get/set的方法就可以支援私有成員變量的操作了。

要想在lua裡調用c函數,隻需要在c代碼裡注冊一下即可,是以看起來支援c函數很簡單。但如果我們要把oc架構裡的常用的幾十、幾百個函數都要支援呢?人肉一個個的寫顯然會顯得乏力。是以我們将oc架構裡的函數從文檔拷貝出然後用腳本預處理,再使用tolua++進行自動代碼生成、綁定,這樣一來即使支援更多c函數也很簡單了。

編寫簡單的lua代碼,隻需要幾個<code>print</code>打點日志就可以判斷邏輯的執行是否正确。但如果是量多、複雜的代碼時,隻能打日志就會很痛苦了。是以我們将開源屆比較強大的lua調試器zerobranestudio引進,再配合mobdebug遠端調試腳本,适配到wax,就實作了lua代碼在wax架構中的調試,支援常用的斷點、單步,當然還有更友善的觀察變量、顯示調用棧、控制台調用等

由于wax從2013年就不再維護,而我們的使用場景又多、又複雜,是以也會發現裡面的不少bug,當然也做了修複。

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,這是對我們的一種莫大的肯定。

Alibaba增強開源項目Wax

繼續閱讀