Unity下Bug修復(fù)神器庇麦,騰訊InjectFix開(kāi)源啦!

image

Unity 下 Bug 修復(fù)神器 InjectFix 開(kāi)源啦喜德!

InjectFix 使用簡(jiǎn)單山橄,小巧,合規(guī)且安全舍悯,經(jīng)過(guò)多個(gè)項(xiàng)目應(yīng)用反饋十分良好航棱,即使你不打算用它來(lái)更新線上版本,只要你程序有原生部分萌衬,接入也能一定程度上提高開(kāi)發(fā)效率饮醇。

InjectFix 亮點(diǎn):

1. 直接在Unity工程上修改C#即可更新;老項(xiàng)目無(wú)需修改原有代碼即可使用秕豫;

2. 更符合蘋果熱更新條款朴艰;

3. 每個(gè)游戲一份私有補(bǔ)丁格式,安全更有保障混移。

InjectFix的那些事兒

熱更方案大亂斗

所有支持ios的熱更方案都有個(gè)共同點(diǎn):更新后代碼都是解析執(zhí)行祠墅。如果按其更新前是否解析執(zhí)行,可以分為兩大類:

一類是某些模塊甚至整個(gè)游戲都采用解析執(zhí)行歌径。這是最傳統(tǒng)的方式毁嗦,目前市面上所有主流方案(xLua,slua沮脖,tolua金矛,ILRuntime,jsb等等)都支持這種方式勺届。

這種方式:

1. 或多或少都會(huì)有些侵入性驶俊;

2. 基于性能、實(shí)現(xiàn)便利性等的考慮免姿,一般在游戲中要以原生的方式跑饼酿,這些原生跑的代碼出了bug時(shí),在這種方式下是無(wú)能為力的胚膊;

3. 如果使用的腳本是動(dòng)態(tài)類型語(yǔ)言故俐,還會(huì)帶來(lái)代碼維護(hù)困難的問(wèn)題;

4. 可以新增功能紊婉,有的游戲甚至可以做到一次下載药版,后續(xù)不用整包更新。

另外一類是原生方式喻犁,如果有bug槽片,把邏輯重定向到新的何缓,解析執(zhí)行的邏輯。

這種方式:

1. 侵入性低还栓,后期項(xiàng)目也可以使用碌廓;

2. 正常邏輯是原生方式運(yùn)行,有問(wèn)題只是局部切換到解析執(zhí)行剩盒,所以性能比較好谷婆;

3. 會(huì)導(dǎo)致代碼段增大,增大正比于注入的類的數(shù)量辽聊;

4. 這種方式往往難以新增功能纪挎。

第二種方式是接下來(lái)討論的重點(diǎn),方便起見(jiàn)身隐,我們稱之為“熱修復(fù)”廷区,熱修復(fù)最早的成熟方案是xLua提供,經(jīng)過(guò)兩年來(lái)的使用已經(jīng)逐漸被接受贾铝,tolua#后來(lái)也加入了這功能,也有一些網(wǎng)友基于ILRuntime做了熱修復(fù)功能埠帕。

InjectFix是什么

InjectFix就是一個(gè)熱修復(fù)的實(shí)現(xiàn)垢揩。那它和其它熱修復(fù)方案又有什么不同呢?

設(shè)想這么個(gè)場(chǎng)景敛瓷,我們有一個(gè)一千行代碼的函數(shù)叁巨,其中有一行有問(wèn)題,我們需要修復(fù)它呐籽。如果用xLua锋勺,需要用lua去重新實(shí)現(xiàn)一遍這個(gè)函數(shù),工作量大狡蝶。而基于ILRuntime的熱修復(fù)庶橱,由于其補(bǔ)丁是另一個(gè)程序集,它無(wú)法直接訪問(wèn)原類的私有成員贪惹,所以那999行正常代碼一般也不能直接使用苏章,需要做較多修改。而InjectFix不需要用lua奏瞬,也不需要像ILRuntime熱修復(fù)那樣另外建一個(gè)工程把那一千行邏輯重實(shí)現(xiàn)枫绅。只需要在Unity原工程直接改掉這行代碼,然后標(biāo)注這函數(shù)要更新即可硼端。

InjectFix還有其它優(yōu)勢(shì):

1. 運(yùn)行時(shí)非常小巧并淋,僅100K左右,比各lua方案珍昨,ILRuntime都要小很多县耽,而且不依賴第三方庫(kù)句喷,純C#實(shí)現(xiàn);

2. 支持每個(gè)游戲生成一份自己私有的補(bǔ)丁格式酬诀,私有的指令定義脏嚷。這樣相比通用的lua原代碼,lua字節(jié)碼瞒御,clr程序集都更安全些父叙。

3. 支持Assembly-CSharp.dll之外的dll的修復(fù)。

4. 免代碼生成肴裙,更干凈趾唱。

它也有缺點(diǎn),不支持新增類蜻懦,也不支持在已有類新增字段甜癞,修bug還是夠用的,但難以通過(guò)熱更為游戲增加新功能宛乃。InjectFix就一個(gè)純粹的修bug工具而已悠咱。

黑科技

由于InjectFix支持重復(fù)加載補(bǔ)丁,新加載補(bǔ)丁會(huì)自動(dòng)覆蓋上一個(gè)征炼,這特性可以用來(lái)實(shí)現(xiàn)真機(jī)代碼邏輯實(shí)時(shí)修改析既。

蘋果政策合規(guī)性

各熱更方案群提問(wèn)頻率最高的問(wèn)題之一:這方案會(huì)不會(huì)導(dǎo)致我游戲蘋果審核不通過(guò)。讓我們看看蘋果的熱更新條款:

image

可以看到最新條款允許下載代碼解析執(zhí)行谆奥,但前提是不能通過(guò)新增特性和功能來(lái)把程序改得(和審核時(shí)相比)面目全非眼坏。再看看通常被拒時(shí)的理由中的Guideline 2.5.2里的一句:Your app, extension, or linked framework appears to contain code designed explicitly with the capability to change your app’s behavior or functionality after App Review approval。有“新增特性和功能”能力的熱更新方案的尷尬之處在于有“改得面目全非”的能力酸些。而InjectFix從它提供的能力(只能修改已有函數(shù))來(lái)看宰译,并不具備“新增特性和功能”的能力,這本來(lái)是弱點(diǎn)魄懂,放在這里卻成為合規(guī)性的保證了沿侈。

做項(xiàng)目需要用心聆聽(tīng),根據(jù)反饋不斷改進(jìn)逢渔。而開(kāi)源能夠幫助聽(tīng)到更多的聲音肋坚,在未來(lái)更好地改進(jìn)這個(gè)項(xiàng)目。
InjectFix 正式開(kāi)源

Github 開(kāi)源地址:

https://github.com/Tencent/InjectFix

(點(diǎn)擊文末閱讀原文直接訪問(wèn))

請(qǐng)給 InjectFix 一個(gè) Star !

歡迎提出你的 issue 和 PR肃廓!

InjectFix 國(guó)內(nèi)鏡像地址:https://git.code.tencent.com/Tencent_Open_Source/InjectFix

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末智厌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盲赊,更是在濱河造成了極大的恐慌铣鹏,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哀蘑,死亡現(xiàn)場(chǎng)離奇詭異诚卸,居然都是意外死亡葵第,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門合溺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)卒密,“玉大人,你說(shuō)我怎么就攤上這事棠赛∠妫” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵睛约,是天一觀的道長(zhǎng)鼎俘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)辩涝,這世上最難降的妖魔是什么贸伐? 我笑而不...
    開(kāi)封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮怔揩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘商膊。我一直安慰自己歌逢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布翘狱。 她就那樣靜靜地躺著,像睡著了一般砰苍。 火紅的嫁衣襯著肌膚如雪潦匈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天赚导,我揣著相機(jī)與錄音茬缩,去河邊找鬼。 笑死吼旧,一個(gè)胖子當(dāng)著我的面吹牛凰锡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播圈暗,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼掂为,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了员串?” 一聲冷哼從身側(cè)響起勇哗,我...
    開(kāi)封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寸齐,沒(méi)想到半個(gè)月后欲诺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抄谐,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年扰法,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛹含。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塞颁,死狀恐怖浦箱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情殴边,我是刑警寧澤憎茂,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站锤岸,受9級(jí)特大地震影響竖幔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜是偷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一拳氢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛋铆,春花似錦馋评、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至玛瘸,卻和暖如春蜕青,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背糊渊。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工右核, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人渺绒。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓贺喝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宗兼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躏鱼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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