【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3310|回复: 4

[基础教程] 【文集】Unity的热更新

[复制链接]
发表于 2019-7-31 00:54:40 | 显示全部楼层 |阅读模式
本帖最后由 夜行的猫仔 于 2019-7-31 01:02 编辑

热更新对游戏很重要,但是unity自身是不支持热更新的,因此这方面还是有不少方案和文章

Unity热更新之LuaInterface(上篇)
Unity热更新之LuaInterface(下篇)
Lua 5.2/5.3热更新小结
腾讯也开源了一个热更新的解决方案
腾讯开源手游热更新方案:Unity3D下的XLua方案介绍
slua的热更新方案:
【技术点】Unity的热更新sLua
ulua的热更新方案:
[pettosryg] uLua最新的Unity Lua热更新解决方案!!!
最后附上一个实例
Unity热更新专题(九)Unity热更新实例

点评

请看x.co/aay(网址) 看海外真实报道,肺炎的惊天内幕正在浮现...... git.io/gnnnn (网址)  发表于 2020-6-4 08:06
 楼主| 发表于 2019-7-31 01:03:10 | 显示全部楼层
Unity Android Dll热更新使用说明
1.环境

• OS macOS Sierra 10.13.6(编译so文件使用可Windows上使用虚拟机)
• Mono mono unity2017.4.6f1 https://github.com/Unity-Technologies/mono/tree/unity-2017.4

• Unity Unity 2017.4.6f1
• Android SDK
• Android NDK Android NDK r10e
• Xcode Command Line Tools
• autoconf
• automake
• libtool
• pkg-config

Xcode Command Line Tools 安装方法 xcode-select --install
autoconf automake libtool pkg-config 四项可以使用 Homebrew 安装。

• 获取 Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
• 安装 brew install autoconf automake libtool pkg-config

2.基本原理
在安卓环境下,通过更换Unity-Mono 加载的 Assembly-CSharp.dll 数据文件的方法,达到更新或加密代码的目的。首先编译生成 libmono.so,然后通过修改 mono - image.c - mono_image_open_from_data_with_name 方法达到修改 DLL 的目的。
使用glib库的g_message方法,在 Android Logcat 中输出 Assembly-CSharp.dll 的 name = /data/app/包名-1.apk/assets/bin/Data/Managed/Assembly-CSharp.dll。进入mono_image_open_from_data_with_name函数后,通过辨认name,可以对data和data_len做出修改,从而影响实际加载的 DLL。
3.实现流程
编译 libmono.so
【步骤一】选择 Unity 版本对应的 Mono 分支,例如本文选择 Unity 5.5.0f3 则对应 Mono 的版本是 unity-5.5。进入 mono 根目录,mono 根目录是编译 Mono 的工作目录。
【步骤二】修改./external/buildscripts/build_runtime_android.sh和./external/buildscripts/build_runtime_android_x86.sh。
build_runtime_android_x86.sh主要负责编译 x86 架构下的 libmono.so。
build_runtime_android.sh主要负责编译 arm 架构下的 libmono.so,然后调用build_runtime_android_x86.sh。






修改






修改

build_runtime_android_x86.sh去掉-g,去掉调试符号。
build_runtime_android.sh将 CFLAGS 下的-g修改为-O2,去掉调试符号,并增加优化符号。
-g 调试符号
-O2 优化符号
注意:“O”是英文第15个字母的大写,不是零。
build_runtime_android.sh删除编译armv5、armv6_vfp,只剩下armv7a。
详情可参考:https://github.com/zhenlinyang/m ... 3fad37aa3f4c129730e
【步骤三】在 mono 根目录下,执行./external/buildscripts/build_runtime_android.sh。
编译成功后,终端会提示:
Build SUCCESS!
Build failed? Android STATIC/SHARED library cannot be found... Found 4 libs under builds/embedruntimes/android
total 0
drwxr-xr-x 4 lbs staff 136 12 30 11:40 armv7a
drwxr-xr-x 4 lbs staff 136 12 30 11:42 x86
在./builds/embedruntimes/android目录下,会有armv7a和x86架构下的libmono.so。
DLL 热更新文件修改
打开./mono/metadata/image.c文件,找到mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name)函数。
使用glib库的g_message方法,在 Android Logcat 中输出 Assembly-CSharp.dll 的 name = /data/app/包名-1.apk/assets/bin/Data/Managed/Assembly-CSharp.dll。
从参数可以看出,进入mono_image_open_from_data_with_name函数后,通过辨认name,可以对data和data_len做出修改,从而影响实际加载的 DLL。
本地下载
4.使用说明
1.新建一个文件目录存放打包文件,so文件及build脚本
2.build目录说明
3.上述文件夹下导出unity的Android工程配置选项,(build system选择Gradle player settings 中对应.Net版本选择3.5暂不支持高版本 )
4.在服务器上建一个readme.txt文件存放每次更新的版本号(更新逻辑中写定为1,不为1就会更新),拷贝Assembly-CSharp.dll更新文件到服务器替换保存
5.如果unity版本有更新,对应的mono也要更新为相应版本,并把mono生产的so文件拷贝到上述文件夹中(build过程会自动复制替换到过程文件中)。
6.执行apk-build文件夹下的build.bat文件,生成debug和release版本apk
7.在导出Android工程中的build---outputs---apk目录下获取安装包
参考来源:
https://www.yangzhenlin.com/unity-android-dll-hotupdate-encrypt/
http://blog.sina.com.cn/s/blog_9e5d42ee0102vvtg.html
https://blog.csdn.net/u011643833/article/details/47261015
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-11-23 15:32

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表