|
楼主 |
发表于 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
|
|