unity android so热更,惊鸿哥的港湾

本文介绍了如何在Unity中实现Android的DLL热更新,通过修改Unity Mono的源码,允许在运行时替换Assembly-CSharp.dll。详细步骤包括修改mono/metadata/image.c文件,添加ReadStringFromFile函数,以及在Unity项目中编写Java和C#代码来实现热更新功能。通过这种方法,开发者可以在不发布新版本的情况下更新游戏的C#代码。
摘要由CSDN通过智能技术生成

是的,没错,前两篇(《如何在Debian中编译Unity Mono生成Android版的libmono.so》、《如何在CentOS/RHEL中编译Unity Mono生成Android版的libmono.so》)中说的需求其实就是Android中Unity的DLL热更新。热更新可以说一直都是游戏(特别是手游)必不可少的功能之一。目前由于苹果对JIT的限制,我们无法在IOS上直接的热更新DLL(最多也只能采取一种曲线救国的方式使用Lua之流的脚本语言调用C# API的方式来实现“热更新”,但也只能某种程度上),但安卓却完全不受此限制。此外,不少的游戏商(特别是中小型寨厂)上线一款游戏都会先上安卓版,然后去各大平台、渠道买量,再根据当前的市场环境以及收到的反馈进行程序上与数值、玩法上的修改和调试,等改得差不多了再上Apple store,上线前期会出现比较多的更新需求。如何热更新Android的DLL?使用反射的方式从外部Load程序集?听起来可行,但这却有着一个致命性的缺点,那就是IOS用不了,这就意味着需要分别对Android和IOS分别进行处理,这只会徒然增加工作量。好在Unity是使用Mono作为运行时并且Mono是开源的,这提供了一种“非官方”的解决方案,那就是改掉Mono的源码,让它可以实现Android的DLL热更。

关于改Mono源码实现Android DLL热更新目前已有不少文章有说明,核心代码基本上都是同一份(包括本文),按照那些代码改基本没有啥太大的问题。本文就仅作一个“炒冷饭”以及额外补充一些我自己遇到的坑以及需要注意的事项。

先说说怎么修改,打开“(unity-mono源码根目录)/mono/metadata/image.c”文件,找到 “mono_image_open_from_data_with_name”函数,把这个函数改成:

MonoImage*mono_image_open_from_data_with_name(char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus*status, gboolean refonly,const char *name)

{/修改开始// intdatasize= 0;if(name!=NULL&&strstr(name,"Assembly-CSharp.dll"))

{//强制要求程序包名都是:com.xxx.yyy

const char *_pack=strstr(name,"com.");const char *_pfie=strstr(name,"-");char_name[512];

memset(_name,0,512);int_len0=(int)(_pfie-_pack);

memcpy(_name,"/data/data/",11);//_name = "/data/data/"

memcpy(_name+ 11, _pack, _len0);//_name = "/data/data/com.xxx.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值