上一節(jié)我們安裝huatuo的開發(fā)環(huán)境,然后運(yùn)行示例項(xiàng)目,體驗(yàn)了huatuo做熱更新,這節(jié)課我們來分析示例項(xiàng)目的源碼,掌握huatuo做熱更新的主要的步驟始苇,讓你自己的項(xiàng)目很好的基于huatuo來組織熱更新。有幾個(gè)huatuo的原則要清楚:
對(duì)啦筐喳!這里有個(gè)游戲開發(fā)交流小組里面聚集了一幫熱愛學(xué)習(xí)游戲的零基礎(chǔ)小白催式,也有一些正在從事游戲開發(fā)的技術(shù)大佬,歡迎你來交流學(xué)習(xí)疏唾。
(1)Unity ADF機(jī)制來分項(xiàng)目蓄氧,可以分成若干項(xiàng)目,避免大量代碼長時(shí)間的編譯,同時(shí)可以按照更小的顆粒度來做熱更新。
(2)普通開發(fā)中槐脏,會(huì)把Unity項(xiàng)目的代碼通過IL2CPP全部轉(zhuǎn)成靜態(tài)的二進(jìn)制指令代碼,如果當(dāng)IL2CPP_huatuo加載了一個(gè)IL代碼的.dll(既有AOT的靜態(tài)代碼喉童,又裝載了對(duì)應(yīng)的IL代碼),huatuo會(huì)優(yōu)先解釋執(zhí)行裝載的IL代碼顿天。每個(gè)版本都把.dll生成出來堂氯,進(jìn)行比對(duì),哪些.dll變化了牌废,就采用il2cpp_huatuo下載下來,轉(zhuǎn)載執(zhí)行即可咽白。
(3)任何項(xiàng)目的代碼(框架代碼+游戲邏輯)都可以基于huatuo來做熱更新。
(4)huatuo提供熱更的機(jī)制鸟缕,至于如何熱更晶框,熱更哪些完全由自己控制;
我們帶著這些原則來對(duì)示例項(xiàng)目來做源碼分析得到自己開發(fā)項(xiàng)目中的啟發(fā)。
啟發(fā)1:?游戲代碼如何分工程與項(xiàng)目
傳統(tǒng)的我們的熱更新項(xiàng)目會(huì)分為:框架代碼+游戲邏輯懂从。你也可以按照這個(gè)標(biāo)準(zhǔn)來劃分,也可以繼續(xù)分更小的顆粒度授段,比如游戲邏輯,可以拆分為:戰(zhàn)斗,任務(wù)等番甩。所以我們?cè)谑褂胔uatuo做熱更新的時(shí)候它首先做的是項(xiàng)目拆分,示例代碼中利用Unity 的ADF機(jī)制侵贵,將項(xiàng)目分成了幾個(gè)工程如下:
Assembly-CSharp.csproj:默認(rèn)的代碼工程,新建代碼默認(rèn)會(huì)被拉入到這個(gè)工程編譯;
Assembly-CSharp-Editor.csproj:編輯器Editor代碼會(huì)被拉入到這個(gè)工程編譯;
BetterStreamingAssets.csproj: 示例項(xiàng)目中的資源ab包加載工程;
HotFix.csproj: 示例項(xiàng)目中測試熱更的測試工程;
HotFix2.csproj: 示例項(xiàng)目中的第二個(gè)測試工程;
Main.csproj: 示例項(xiàng)目中入口主工程,示例項(xiàng)目從這個(gè)入口工程的代碼開始運(yùn)行;
這里給到我們的啟發(fā)缘薛,我們?cè)谧鲎约河螒蝽?xiàng)目的時(shí)候窍育,也可以根據(jù)自己的項(xiàng)目需求利用Unity ADF機(jī)制,來將項(xiàng)目劃分稱若干工程宴胧,而這些工程漱抓,可以單獨(dú)的生成IL的.dll代碼指令。這樣就可以給IL2CPP_huatuo來解釋執(zhí)行了恕齐。由這里得到的啟發(fā)辽旋,我們用huatuo做項(xiàng)目的時(shí)候我會(huì)將項(xiàng)目如下劃分,供大家參考:
Assembly-CSharp.csproj:默認(rèn)的代碼工程,這里放啟動(dòng)代碼补胚,放熱更新版本檢測代碼,檢測出來哪些.dll需要更新追迟,基于增量下載更新溶其,比較出哪些不用更新使用原來自帶的AOT內(nèi)部的代碼,哪些需要更新,需要更新的用il2cpp_huatuo來裝載進(jìn)來,優(yōu)先執(zhí)行裝載進(jìn)來的.dll指令敦间。
Main.csproj:可以用來做框架工程瓶逃,實(shí)現(xiàn)各個(gè)框架模塊,初始化框架,進(jìn)入具體游戲邏輯,提供基礎(chǔ)的服務(wù),如SDK服務(wù)等廓块。這個(gè)是傳統(tǒng)熱更的框架層厢绝,一般情況下不用熱更,使用AOT后的代碼就可以了带猴,如果萬一要熱更昔汉,也可以直接熱更生成的main.dll。
若干業(yè)務(wù)邏輯項(xiàng)目工程: 根據(jù)游戲的類型來進(jìn)行區(qū)分若干游戲項(xiàng)目,根據(jù)版本比對(duì)決定這些.dll是否需要被il2cpp_huatuo虛擬機(jī)裝載拴清。
啟發(fā)2:?擴(kuò)展編輯器來生成所有.dll
由huatuo的特性靶病,你裝載哪個(gè).dll,就可以動(dòng)態(tài)解釋執(zhí)行對(duì)應(yīng)的.dll的代碼指令。所以我們就可以得到啟發(fā),把我們項(xiàng)目中所有的除Assembly-CSharp.dll以外的.dll都生成出來口予。比如1.0版本: Main.dll(游戲框架), game.dll(游戲主邏輯), task.dll(任務(wù)系統(tǒng)), … 比如2.0版本: main.dll, game.dll, task.dll, …娄周。這樣每次打包發(fā)布的時(shí)候,我們就可以使用這個(gè)編輯器擴(kuò)展沪停,編譯出來所有的項(xiàng)目中的.dll,并生成一個(gè)所有.dll的md5文件變化列表煤辨。把最新的一份.dll與md5文件列表放服務(wù)器,把本地md5文件列表放包里木张,每次運(yùn)行众辨,我們?cè)隽肯螺d最新版本的.dll后,我們只要比較服務(wù)器上的.dll md5文件列表窟哺,與當(dāng)前版本對(duì)應(yīng).dll的md5文件列表泻轰,決定出哪些.dll需要裝載進(jìn)入il2cpp_huatuo,就直接裝載即可實(shí)現(xiàn)熱更新,那些沒有變化的.dll,表示可以直接使用AOT模式下的機(jī)器指令且轨,不用熱更解釋執(zhí)行IL指令的.dll浮声。我們來看下示例項(xiàng)目里面是如何編譯我們的.dll指令的,參考對(duì)應(yīng)的編輯器的擴(kuò)展代碼。打開示例項(xiàng)目的Editor/Huatuo文件夾的EditorHelper.cs, 如圖:
沒有什么可說的旋奢,調(diào)用API泳挥,打包.dll,直接copy過來就可以了。根據(jù)我們上面的分析至朗,對(duì).dll生成不同版本的.dll md5文件列表這個(gè)需要自己擴(kuò)展一下屉符,示例代碼中沒有。
啟發(fā)3:?要熱更哪部分代碼,就裝載哪部分代碼
使用huatuo做熱更新最后需要掌握的一個(gè)點(diǎn)就是,如何裝載.dll的代碼矗钟,當(dāng)我們知道當(dāng)前系統(tǒng)需要裝載哪些.dll讓huatuo解釋執(zhí)行后唆香,最后一步就是讓huatuo來裝載,我們從這個(gè)示例項(xiàng)目的代碼中可以看到il2cpp_huatuo是如何裝載一個(gè).dll的吨艇,當(dāng)這個(gè).dll被裝載后,這部分的功能就被解釋執(zhí)行了躬它。Huatuo如何加載代碼,我們可以參考示例如下(代碼來自LoadDll.cs):
它分為了發(fā)布模式與Edtior模式东涡,發(fā)布模式就是直接把.dll裝載進(jìn)入il2cpp_huatuo的vm中冯吓,調(diào)用API函數(shù): System.Reflection.Assembly.Load(.dll的二進(jìn)制文件內(nèi)容),在底層huatuo做了修改疮跑。編輯器模式下组贺,調(diào)用AppDomain就行裝載就可以了,所以這個(gè)代碼我們直接可以參考拿過來,比較出哪些.dll要熱更祖娘,我就轉(zhuǎn)載它就可以了失尖。
今天的分享就到這里了, 關(guān)注我們, 接下來還會(huì)繼續(xù)更新huatuo熱更的系列教程贿条。
下節(jié)預(yù)告:?打造基于huatuo?熱更的項(xiàng)目框架