Unity IOS下的熱更新研究

2021-06-27 02:58:46 字數 2710 閱讀 6107

主要思路是替換掉在mono裡image.c的mono_image_open_from_data_with_name函式,hook掉載入dll的地方,實現讀取自定義的dll檔案。

檢查發現在xcode工程裡的libiphone-lib.a裡存在mono的庫檔案,在libiphone-lib.a下有兩個cpu架構的庫

lipo -info libiphone-lib.a

architectures in the fat file: libiphone-lib.a are: armv7 i386

使用

lipo libiphone-lib.a -thin armv7 -output libiphone-lib.arm

解壓出armv7的庫檔案

ar -t libiphone-lib.arm
filterscpuimplvectordata.o

filterscpuimplwarp.o

filterscpumipmaps.o

filterscpupassvectordata.o

filterscpupvrtc.o

filterscpufxmapsbuffer.o

filterscpufxmapsmain.o

filterscpufxmapsdrawjob.o

filterscpufxmapsdrawqueue.o

filterscpufxmapsjob.o

filterscpufxmapspool.o

filterscpufxmapsthread.o

parsebitmap.o

parseblend.o

parseblur.o

parsechannelsshuffle.o

parsecommon.o

parsecontext.o

parsedata.o

parsedirectionalmotionblur.o

parsedirectionalwarp.o

parseemboss.o

parsefxmaps.o

parsefxmapssetcell.o

parsegradientmap.o

parsegrayscaleconversion.o

parsehsl.o

parselevels.o

parsemotionblur.o

parsenormal.o

parsesharpen.o

parsetransformation2d.o

parseuniformcolor.o

parsevectorgraphicsdata.o

parsewarp.o

apicontext.o

apihandle.o

apiversion.o

libcrashreporter-iphoneos.a-armv7-master.o

ar -t libiphone-lib.arm | grep image.o
image.o
可以看到armv7下確實有image.o的模組

解壓出image.o模組

ar -x libiphone-lib.arm image.o
用十六進製制工具搜尋

mono_image_open_from_data_with_name  替換成  mono_image_open_from_data_with_***x
自己編譯乙個imagehook.c的檔案生成imagehook.o,內容如下

#include extern int *

mono_image_open_from_data_with_***x(

char *data, unsigned int data_len,

int need_copy,

int *status,

int only, const char *name);

int *

mono_image_open_from_data_with_name(

char *data, unsigned int data_len,

int need_copy,

int *status,

int only, const char *name)

將image.o 和 imagehook.o重新打包進libiphone-lib.arm

ar -r libiphone-lib.arm image.o

ar -q libiphone-lib.arm imagehook.o

重新生成libiphone-lib.a

lipo libiphone-lib.a -replace armv7 libiphone-lib.arm -output libiphone-lib.a_01

這樣用新生成的libiphone-lib.a去鏈結應用程式會發現呼叫到了我們自己的函式。

但是你會發現都是沒用的,因為mono在ios下是full aot模式編譯的,每個指令碼dll會生成對應的.s彙編**直接連線到可執行檔案裡面.

Erlang的熱更新

熱更步驟 1.建立熱更模組介面 2.替換編譯檔案.beam 3.執行熱更 主要實現方法是使用code 服務函式 code purge mod 清除模組的 清除並標記為舊版本 code load file mod 載入乙個模組 由於模組載入之後存在虛擬機器 可直接替換bin資料夾中的mod.beam檔...

關於mui的熱更新。

官方給出的文件講解的很少,所以自己便開始研究了。首先mui中的update.js很簡單。自帶的主要 如下 var server 獲取公升級描述檔案伺服器位址,官方的 為 內容為 官方給出的服務端位址為 內容模板為 另外一種h5 比較複雜,是在js裡面判斷是否需要更新,同時可操作性更強。完整 如下 y...

Python的reload及熱更新

python的reload及熱更新 horin horin153 msn.com blog 問題 1 浪費了部分記憶體,無所謂,反正記憶體早就是 gb 時代了。問題 2 可以用 import m 方式解決,強迫自己改變編碼風格就可以了,也可以忍受。問題 3 卻是壓死 reload 的最後一根稻草了 ...