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