Unity安卓热更新:通过Mono加载新的重新编译的dll
发表于2018-08-16
Unity代码热更新方法有很多,其中关于lua实现热更新这里就不说了,这里主要介绍下使用c#进行热更新。考虑到Mono是开源的,其实可以通过修改mono源代码实现重新加载dll实现热更新。
今年,也就是2016年,我在一个技术群里得知,其实绝大部分大公司,目前用的都是这种方法实现热更新,其中一个游戏就是超级地城之光。既然知道已经有人在做了,那么我就可以尝试一下。自己捣鼓前,我还百度了一下,果然,已经有人有教程了:http://blog.csdn.net/qq_27772057/article/details/51945700
我觉得这个人的博客已经很详细了,不过由于整体看上去比较复杂,所以可能细节上不好处理。
我自己重新去实现了一下整个流程,已经测试通过。
目前的策略是,通过修改mono源代码,编译出新的libmono.so
启动游戏时候,下载Assembly-CSharp.dll,这样进入游戏就会使用更新后的代码。
为了让大家方便一些,我自己编译好了4.6版本的libmono.so,除了热更新,其实还有加密的功能,加密算法也很简单:
char* ch; char* ch2 = "This is jiamed"; char ch3[15]; int i = 0; ch = data; for(i = 0; i < 14; i++) { ch3[i] = ch[i]; } ch3[14] = 0; if(strcmp(ch3, ch2) == 0) { data = ch + sizeof(char) * 14; data_len -= 14; ch = data; for(i = 0; i < 10000; i++) { ch[i] = ch[i] ^ 0xab; } }
当然你可以无视,我已经兼容了非加密文件就不处理的情况。
有了这个so,你就可以省去绝大部分工作,剩下的就是打开游戏下载dll,下载的目录是:
string path1 = "/data/data/" + packname + "/files/";
packname就是你们的包名。
另外你需要将我的so替换你们自己的so,可以直接覆盖unity安装文件夹里的,也可以打包完毕后手动替换,手动替换的话要重新签名,建议写一个打包工具。
当然我目前使用的是4.6,所以其他版本的unity大家就要自己去编译了。
其实还有更好的方法,就是hook技术,这样就可以无视所有版本,只要是unity就可以用。
最后是文件地址:http://pan.baidu.com/s/1c10hhxI
来自:https://blog.csdn.net/yxriyin/article/details/53099985