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ò)。讓我們看看蘋果的熱更新條款:
可以看到最新條款允許下載代碼解析執(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