美文网首页
Unity Android Dll热更新使用说明

Unity Android Dll热更新使用说明

作者: 码农老K | 来源:发表于2018-10-28 18:13 被阅读0次

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 安装。

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/mono/commit/a936f250c33b0fe216f9a3fad37aa3f4c129730e

【步骤三】在 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

Demo有空附上

相关文章

网友评论

      本文标题:Unity Android Dll热更新使用说明

      本文链接:https://www.haomeiwen.com/subject/tjkmtqtx.html