最近有空研究了一下游戏的代码热更。
代码热更主流方案有如下几种:
1.通过代码改写mono读取dll的路径,从而实现旧dll替换为新dll。这个过程中最难的是编译mono,里面有非常多的坑。不过幸好网上已经有很多人把避坑指南给我们了。我是照着这篇文章编译mono的,还是遇到了很多坑。只能说环境一定要先搭建正确。
2.热更lua代码,这个其实已经很成熟了。大部门项目会用到toLua、xLua这两个方案。只要在创建lua虚拟机之前热更玩lua代码就没问题了。
3.热更IL2CPP。网上找了一些文章,大部分文章其实都是在讲一位大佬写的解决方案。我也是通过这个案例成功的实现了热更IL2CPP。
热更IL2CPP案例地址:https://github.com/noodle1983/UnityAndroidIl2cppPatchDemo/
依赖库地址:https://github.com/noodle1983/UnityAndroidIl2cppPatchDemo-libboostrap
通过案例中的ReadMe文件,我们可以知道他是如何实现热更的。
最主要的部实现方式就是使用libbootstrap库将libil2cpp的加载重定向到新的libil2cpp并且实现旧apk读取新的patch文件。作者已经帮我们做好了。
该文主要记录我在实现热更IL2CPP时遇到的一些坑。
-
使用demo中的libbootstrap库不能热更自己的app
其实在readme文件中作者已经说了,demo中的库只适用于包名为cn.noodle1983.unitypatchdemo的apk,那么要想热更自己定义包名的apk只有重新编译出一个libbootstrap库了。下载上文提到的依赖库,然后编译出一个新的库。简单说下如何编译出新的库。
1.如果你还没有android-ndk-r16b环境,那么就去https://developer.android.google.cn/ndk/downloads/older_releases.html这个地址下载安装NDK。然后配置一下环境变量。当你在控制台输入ndk-build命令出现下图的输出后就表示你的NDK环境已经搭建好了。
2.下载解压完libboostrap后,需要编辑build_android.bat文件,然后把NDK的路径填写好。
3.运行bat文件,等待编译完成,在ndk路径下的libs文件夹中就会有对于cpu架构的libboostrap库
4.将这里面的库替换掉项目中的库,然后就可以热更自己项目的了。