Unity安卓热更新:通过Mono加载新的重新编译的dll

发表于2018-08-16
评论0 6.3k浏览
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

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引