1. 程式人生 > >Unity的二進位制熱更新

Unity的二進位制熱更新

最近剛剛接觸Unity,發現在iOS上面熱更新出現了很大的限制。在網上查了一圈,大家主要是說是由於受到了iOS系統不允許在可讀記憶體記憶體頁上面執行的限制造成的,這好像跟熱更新並不矛盾。現在大家主要突破這個限制的方法是通過跑Lua虛擬機器,這樣改Lua程式碼就可以熱更新了,熱切蘋果稽核並沒有辦法查到。但是Lua的主要問題就是執行速度慢,而且開發的模式跟原來的Unity相差很大,除錯起來不太方便。

我的最初想法是如果可以直接進行二進位制的更新,也就是像dll那樣直接更換dll就能更新,那樣就解決了iOS熱更新的問題了。但是蘋果之前一直在限制可執行檔案的動態連結執行,最近好像有所放鬆但是我估計如果要是把dylib放在Documents目錄下面的話估計蘋果還是不會同意。所以這個實驗完全是處於興趣,而且我還打算之後把app提交上去看看蘋果的態度。

Unity現在在iOS的執行c#的後端除了傳統的Mono之外,還出了一個IL2CPP後端。這次我主要研究的是IL2CPP虛擬機器後端的執行原理,以及如何進行二進位制的熱更新。先說一下IL2CPP的基本原理,IL2CPP是通過改編譯器的後端,使得c#被編譯成IL之後最後不是被編譯成binary程式碼,而是變成cpp檔案,放在Classes/Native目錄下面,最後在xcode工程裡面跟libiPhone一起編譯成可執行檔案。如果可以把這些cpp檔案都編譯成動態庫,然後換動態庫那麼就實現了動態更新。但是我發現這些自動生成的cpp程式碼裡面大量使用了il2cpp的標頭檔案和函式,所以想把cpp直接剝離出來的想法不可行,要想更新必須連著虛擬機器一起更新。

今天有點困了,明天講一下用ida靜態分析libiPhone的unity執行c#的原理