IOS熱更新-AliWax的集成和調(diào)試環(huán)境搭建

那些多余的話

在ios平臺的基礎框架中勿璃,代碼的直接動態(tài)部署一直是一個無法解決的問題擒抛,所以我們只能退而求其次,通過建立腳本語言和OC的bridge來實現(xiàn)動態(tài)更新的目標蝗柔。在這個方向上闻葵,wax-lua框架是第一個解決方案,但是隨著wax-lua作者的放棄維護癣丧,wax框架逐漸被降級為做補丁修復的工具槽畔。之后隨著objc語言的完善和SDK中JavaScriptCore(webkit)framework api的開放,另外一種腳本語言js以一種更為被蘋果認可的姿態(tài)進入了這個方向胁编,先有國外FaceBook發(fā)布的ReactNative框架厢钧,讓更多的前端開發(fā)者可以通過js語言完成可以毗鄰native效果的app,后有國內(nèi)騰訊的bang開源JSPatch嬉橙,專注于ios平臺Patch修復早直。

本人最近一直在維護公司內(nèi)部的的wax框架,也一直在探索ios熱更新方向上的新技術市框。先是wax框架的兼容64位維護霞扬,wax框架集成到產(chǎn)品后多個組件交叉使用runtime的bug修復;再是探索Tianium跨平臺JS框架;再到FaceBook出品開源的ReactNative框架喻圃;再到最后的JSPatch... 這些框架的源碼和Demo我都有涉及萤彩,從希望到失望...首先是自己維護的wax框架穩(wěn)健性不夠,特別是通過AOP+forward兼容64位后bug頻現(xiàn)斧拍,用作patch熱更新尚且能夠應付雀扶,但是想用來做組件動態(tài)部署成熟度還不夠。其次Tianium框架肆汹,關于jscore部分沒有開源不敢用愚墓,另外其bind oc api部分需要時刻跟進新版本的SDK是一個low點。 再其次是ReactNative框架昂勉,源碼我沒有怎么看浪册,但是我寫了一個稍微復雜的頁面,當圖片在同一個頁面加載較多的時候岗照,卡頓的現(xiàn)象特別明顯议经,讓我對js的效率產(chǎn)生了深深的懷疑。 JSPatch同樣是利用了forward消息轉(zhuǎn)發(fā)機制完成了js和oc的bind谴返,但是社區(qū)和框架成熟度仍然不夠煞肾。

最近阿里開源了增強版的wax框架,我連續(xù)看了兩天源碼嗓袱,對其增強部分的實現(xiàn)有了一個大致的了解籍救,也讓我對lua-bind的方案有了很大的信心。之前受Andfix android平臺熱更新框架思路的影響渠抹,自己很想在這條路上再繼續(xù)折騰一番:如果能夠把OC代碼通過一個轉(zhuǎn)換器轉(zhuǎn)化成lua代碼蝙昙,ios平臺的準直接動態(tài)部署應該是可以實現(xiàn)的。 所有的開發(fā)人員仍然用自己最熟悉的objc開發(fā)需求梧却,測試和發(fā)版奇颠,比較版本代碼的不同可以讓低版本的產(chǎn)品用戶使用高版本的功能。我們可以不按照版本發(fā)布放航,轉(zhuǎn)而按照模塊開發(fā)烈拒,所有的新需求和新運營方案都可以在不發(fā)版的情況推送給用戶。

Ali-Wax簡介

代碼地址:https://github.com/alibaba/wax.git

wax-lua 的語言優(yōu)勢:

  • (1)自動垃圾回收:再也不用使用alloc广鳍,retain和release荆几;
  • (2)代碼少:沒有頭文件,沒有static類型赊时、array常量吨铸、dictionary常量;
  • (3)能夠使用任何一個framework祖秒,例如cocoa诞吱、UITouch舟奠、Fondation等肴掷,任何用oc寫的framework受裹,wax自動將其暴露給lua使用斤贰;
  • (4)超級簡單的http請求: 和REST的web service一起交互使用维苔;
  • (5)lua也有函數(shù)閉包,也就是所謂的blocks靶剑;
  • (6)lua有內(nèi)置的Regex-like 模式匹配library;

相比原Wax框架:

  • 64位支持;
  • 線程安全暴浦;
  • 其他一些特性:
  1. lua function 轉(zhuǎn)化成 oc block,
  2. 在lua中調(diào)用oc block晓锻,
  3. getting/setting 私有成員變量歌焦,
  4. 內(nèi)置通用的C函數(shù),
  5. 支持lua代碼debug砚哆;

在接下來的博客系列中独撇,我將結(jié)合Ali—Wax源碼,介紹如何實現(xiàn)這些增強特性的躁锁,敬請期待纷铣。下面我們先來看看如何使用和集成wax框架和其debug環(huán)境。

Ali-Wax的Podfile集成

Wax框架只是一個熱更新實現(xiàn)方案战转,我們用于具體的產(chǎn)品進行補丁修復或者功能組件發(fā)布還需要實現(xiàn)一個版本管理方案搜立。在實現(xiàn)版本方案的時候,肯定涉及到在wax框架上的功能定制槐秧,比如說補丁現(xiàn)場恢復功能等(這部分功能我會開源到我的fork代碼中)啄踊。另外我們現(xiàn)在用CocoaPods管理我們的代碼組件版本,為了方便各自的產(chǎn)品修復bug刁标,發(fā)放版本颠通。 我建議大家fork一份代碼到自己的github中,進行版本管理膀懈。

fork Ali-Wax: https://github.com/philonpang/wax.git

另外Ali-Wax框架中集成了lua的debug方案:mobdebug顿锰,位于wax/tools/mobdebug處,作者配置了Podspec启搂,可以直接pod到你的調(diào)試工程中撵儿。 這部分代碼也不會有什么變化,已建議作者單獨列一個git工程狐血,目前我放到了自己的git空間里淀歇,大家可以共享。

mobdebug: https://github.com/philonpang/mobdebug.git

這樣我們就可以在項目工程中通過Pofile直接集成wax框架和代碼調(diào)試環(huán)境了(當然你也可以通過path指向wax clone項目的本地)匈织;podifle如下:

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '6.0'
inhibit_all_warnings!

workspace 'WLDWaxService'
xcodeproj 'LDWaxService'

target :LDWaxService do
    pod 'wax', :git => 'https://github.com/philonpang/wax.git'
    pod 'mobdebug', :git  => 'https://github.com/philonpang/mobdebug.git'
    link_with 'LDWaxService'
end

Ali-Wax的luaDebug

作者通過編譯luasocket源代碼支持了lua代碼的ios環(huán)境調(diào)試浪默。作者剛發(fā)布的時候的調(diào)試環(huán)境也折騰了我很久牡直,我這里說一下我踩過的那些坑和注意事項。 官方調(diào)試安裝步驟見:
[https://github.com/alibaba/wax/tree/master/examples/LuaCodeDebug]

luadebugdemo.jpg
(https://github.com/alibaba/wax/tree/master/examples/LuaCodeDebug)

  • download ZeroBraneStudio (lua代碼調(diào)試IDE纳决,直接git clone到本地)
  • run ZeroBraneStudio: 進入ZeroBraneStudio/zbstudio文件夾碰逸,直接雙擊ZeroBraneStudio.app文件即可運行(將app拷貝到application中不能運行)
  • import lua code: click the 6th button
    Smaller icon
    Smaller icon

    , choose your lua code's root directory

  • start debug server: click Project->Start Debugger Server. (每次打開ZeroBraneStudio的時候,記得打開這個選項)
  • run this code before you enter debug
    wax_start(nil, nil);//must start before debug
    extern void luaopen_mobdebug_scripts(void* L);
    luaopen_mobdebug_scripts(wax_currentLuaState());
  • addrequire('mobdebug').start('YOUR_MAC_IP_ADDRESS')to your lua code. if you use simulator 'YOUR_MAC_IP_ADDRESS' can be empty
  • launch your app阔加,when require('mobdebug').start() is invoked, ZeroBraneStudio's dock will become active, then you should add breakpoint. (這種情況下饵史,當你在模擬器中運行app后,會自動跳在ZeroBraneStudio中啟動lua文件中斷點下來)

坑1:import luaCode 的tip

官方截圖上看到的截圖是整個xcode工程的目錄胜榔,如果你import了整個工程胳喷,在目錄和文件較多的情況下,ZeroBraneStudio中的斷點是無效的夭织。
其實你只需要import存放lua文件的目錄即可吭露。

坑2:xcode工程中的lua代碼文件

xcode添加文件有兩種方式:Create groups 和 Create folder reference兩種。 按照前一種方式尊惰,你引入目錄的所有文件在運行時會被拷貝到“XX.app/”目錄下讲竿,而后面一種方式目錄會以引用方式加入,運行時文件仍然放在“XX.app/拷貝目錄/”下弄屡,而且當引入目錄中有新文件添加的時候题禀,不用再執(zhí)行一遍添加操作。

所以我們在本地調(diào)試代碼的時候膀捷,建議以第二種方式引入目錄投剥,這樣我們可以隨時在ZeroBraneStudio中添加文件(而不用在xcode工程中再進行一次add操作)進行調(diào)試。 但是執(zhí)行l(wèi)ua代碼中的require代碼行時担孔,會提示找不到對應的require文件江锨。這其實是lua 默認search 文件的路徑?jīng)]有設置照成的,所以我們需要設置lua的search路徑環(huán)境變量糕篇。 代碼如下:

#import "wax.h"
#import "wax_http.h"
#import "wax_json.h"
#import "wax_xml.h"


    //設置lua的search路徑環(huán)境變量
    NSString *patchPath = [[NSBundle mainBundle] pathForResource:@"patchDemo" ofType:nil];
    NSString *pp = [NSString stringWithFormat:@"%@/?.lua;", patchPath];
    setenv(LUA_PATH, [pp UTF8String], 1);

    //啟動wax框架和debug環(huán)境
    wax_start(nil, luaopen_wax_http, luaopen_wax_json, luaopen_wax_xml, nil);//must start
    extern void luaopen_mobdebug_scripts(void* L);
    void * p = wax_currentLuaState();
    luaopen_mobdebug_scripts(p);

    //運行啟動文件
    wax_runLuaString("require('patch')");

完成以上步驟之后啄育,你就可以在你的項目工程中開心的調(diào)試lua代碼了。如下圖所示:

luadebugdemo.jpg
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拌消,一起剝皮案震驚了整個濱河市挑豌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌墩崩,老刑警劉巖氓英,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鹦筹,居然都是意外死亡铝阐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門铐拐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徘键,“玉大人练对,你說我怎么就攤上這事〈岛Γ” “怎么了螟凭?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長它呀。 經(jīng)常有香客問我螺男,道長,這世上最難降的妖魔是什么纵穿? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任下隧,我火速辦了婚禮,結(jié)果婚禮上政恍,老公的妹妹穿的比我還像新娘。我一直安慰自己达传,他們只是感情好篙耗,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宪赶,像睡著了一般宗弯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搂妻,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天蒙保,我揣著相機與錄音,去河邊找鬼欲主。 笑死邓厕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的扁瓢。 我是一名探鬼主播详恼,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼引几!你這毒婦竟也來了昧互?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤伟桅,失蹤者是張志新(化名)和其女友劉穎敞掘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楣铁,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡玖雁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盖腕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茄菊。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡疯潭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出面殖,到底是詐尸還是另有隱情竖哩,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布脊僚,位于F島的核電站相叁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辽幌。R本人自食惡果不足惜增淹,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乌企。 院中可真熱鬧虑润,春花似錦、人聲如沸加酵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猪腕。三九已至冗澈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陋葡,已是汗流浹背亚亲。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腐缤,地道東北人捌归。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像岭粤,于是被迫代替她去往敵國和親陨溅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容