# 1. 简介
这是Unity Android APP il2cpp热更完美解决方案的Demo([Git地址](https://github.com/noodle1983/UnityAndroidIl2cppPatchDemo/))的说明。
和现有的热更解决方案不同的是,他不会引入多余的语言(只是UnityScript,c#...),对Unity程序设计和编码没有任何限制。你可以在预置和场景里的GameObject上添加任何的Compnents组件,需要序列化的和不需要序列化的,他们都是可以热更的,也不需要做额外的标记处理。简而言之,在此方案下,Unity的所有资源和脚本,都是可以热更的。
本文接下来将介绍如何去制作热更文件和如何应用这些热更文件。为了简化Demo的设计,Demo包含的热更文件会事先以全量更新的方式制作好,一起打到了Apk里面。具体到项目中热更文件得放服务器,正式上线得放CDN,以增量更新的方式捣鼓出和文中一样的目录结构就OK了。
Demo代码适用Unity2018-?,2017需要自己看版本历史回退Zip库。
# 2. 方案总览
Unity在以il2cpp方式导出Android工程(或者Apk文件)的时候,代码会被编译成libil2cpp,而相关的资源、配置和序列化数据会以他们各自的格式导出到android的assets目录(assets/bin/Data)。这两部分,libil2cpp和assets目录,必须匹配(即需要在同一次打包中提取,可能有的变了,有的没变,增量方式只提取变化的部分)才能正常工作,不然Unity会在启动时崩溃。本方案就是热更这两部分。
热更的正式流程如下图.
![运行时流程图](https://github.com/noodle1983/private/raw/master/UnityAndroidIl2cppPatch/patch_workflow.png)
流程说明:
* 步骤1,在Unity的逻辑之前,libbootstrap会检查本地是否有Patch. Apk安装后,没应用过任何热更,本地是不会有Patch文件的,走no流程。如果热更过,则会有Patch目录,走yes流程。如果是覆盖安装,会检查apk和Patch文件的修改时间,走no流程。Patch目录如何准备,后面会将到。
* 步骤2,加载Patch目录对应架构(arm/x86)的libil2cpp库,并应用assets目录的更新文件。
* 步骤3,开始Unity的流程,进入Unity第一个场景,并执行相关的Unity Script,一般是C#,我们都以C#举例。
* 步骤4,检查服务端是否有新的patch,这步demo没有演示,需要自己实现。
* 步骤5,下载新的patch,这步demo也没有演示,需要自己实现
* 步骤6,根据规则准备patch目录,详细规则会在后面描述。在Demo中只是将全量更新包解压,全量更新包打包的时候目录结构就是对的,所以不需要做其他的处理。
* 步骤7,调用libbootstrap的接口设置patch目录,因为libil2cpp已经加载进进程,所以需要重启APP,从新的patch目录加载patch。这步Demo中有设置patch目录的例子。
* 步骤8,重启APP,Demo提供了纯C#代码。
* 步骤9,没有新的Patch,就正常进入游戏了。
流程里更详细的描述和如何生成Patch文件,见第三章。
# 3. Demo详述
## 3.1. Demo目录结构
工程所有文件均置于AndroidIl2cppPatchDemo目录下。各文件目录说明如下表。
| 名字 | 说明 |
| -------- | ----- |
| Editor/AndroidBuilder.cs| 这个文件包含所有从导出Android工程,到输出Patch和生成Apk安装文件的代码。|
| Editor/Exe/zip.exe| zip压缩工具,用来将asset/bin/Data下的文件压缩成标准zip格式。 |
| Plugin/| 包含libbootstrap库. |
| PrebuiltPatches/| 包含预先生成的两个全量热更新版本。|
| Scene/*.unity| 演示场景,母包和版本1仅有0.unity,版本2增加了1.unity,测试新增场景和脚本的patch |
| Script/Bootstrap.cs| 这个文件定义了libbootstrap的c#接口和重启APP的纯c#实现|
| Script/VersionSettor.cs| 这个脚本用于运行时准备相应的热更版本目录。|
| Script/UI/MessageBoxUI.cs| 这是一个简单的运行时MessageBox控制器。|
| ZipLibrary/| c#版的压缩解压工具,输出的zip文件为非标准文件,Patch制作中不能用于asset/bin/Data文件的压缩,仅用于libil2cpp库的压缩,运行时用于全量热更包的解压. |
所有文件就这么多,项目用git管理,master分支为母包分支,version1和version2分支为热更1和热更2分支,分支间会有些细微的差别,version1主要测试序列化数据,version2添加了新场景和新脚本,具体可以diff查看。下面会详细描述打包过程和如何应用热更文件。
## 3.2. 打包过程
所有的打包逻辑在文件Editor\AndroidBuilder.cs里。展开主菜单**AndroidBuilder**, 可以看到有5步,为了和热更启动流程区分,我们就叫他过程。
- 过程1:以il2cpp的方式,导出Gradle Android工程。选择Gradle Android工程,而不是ADT Android工程,只是因为Unity2018不再支持ADT方式。Demo并不依赖AndroidStudio,只是导出的Android工程目录结构是以Gradle的方式注释,之后的构建步骤都是调用原始JDK/SDK的方式。Demo这部分的代码可以复用,但需要根据项目需求做一些修改。
* 过程2:需要修改一下Android工程,因为libbootstrap需要在进入Unity的帧循环前,检查加载本地准备好的patch。大多数情况,你可以复用这个步骤的代码。但是如果你的项目修改了Unity Java的继承体系,你需要检查一下这块代码是否有调用到。如果没有调用到,后面Unity帧循环中的逻辑和资源,用的都是Apk内的相应文件。
* 过程3:生成热更文件。如在第二章所述,patch分为两部分,il2cpp库和assets/bin/Data目录。具体做法代码均有提供,需要注意的是必须遵守各个文件的命名方式和相对路径。各个文件均有压缩,对于增量包,如果压缩前的文件和之前相比没有变化,则不需要制作对应的压缩文件。这部分制作压缩部分的代码可复用,增量部分需要自己实现,热更文件最好也加进版本管理(svn/git/...)中。
* 过程4: 生成打包的windows脚本。脚本仅依赖JDK/SDK命令,可复用。生成脚本后,Android工程就不依赖Unity了,可以随意替换文件,再次调用脚本生成新的Apk。需要注意的是,打包用的so动态库,是pkg_raw目录下的so文件,替换时请注意。首次会在Unity目录下生成keystore目录和相应的签名文件,可以将此签名替换,并修改导出脚本中的签名密码。
* 过程5: 执行过程4中的脚本,生成Apk安装文件,可复用。
主菜单AndroidBuilder下还提供了菜单“Running Step 1, 2, 4, 5 for the base version”,这是一键构建母包版本用的,母包不需要制作patch文件,所以少了过程3;和菜单“Runnnig Step 1-4 for patch versions”,这是一键构建Patch用的,因为在demo里,不需要导出Apk文件。
关于打包这里得多说两句。 如果没有采用AssetBundle的方式打包,Unity会按各自格式,将所有场景和依赖输出到assets/bin/Data目录,这样子也是可以热更的。但是,不要这么做,因为这样做微小的改动会影响到多个文件,导致热更文件过大。最好是自己用AssetBundle的方式将资源做一个清晰的划分,打包好的AssetBundle放在assets下的其他目录。需要注意和libil2cpp库和assets/bin/Data的文件向匹配(保证是同一个版本的输出)。运行时可以重写AssetBundleManager.overrideBaseDownloadingURL加载最新的AssetBundle。
## 3.3. 运行时应用热更文件
我们回顾一下第二章的流程图,结合打包过程和Demo的代码,做进一步的说明.
![运行时流程图](https://github.com/noodle1983/private/raw/master/UnityAndroidIl2cppPatch/patch_workflow.png)
打包过程2里,需要在UnityPlayerA
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.简介 这是Unity Android APP il2cpp热更完美解决方案的Demo( )的说明。 和现有的热更解决方案不同的是,他不会约会多余的语言(只是UnityyScript,c#...),对Unityy程序设计和编码没有任何限制。你可以在预先和场景里的GameObject上添加任何的组件,需要序列化的和不需要序列化的,他们都是可以热更的,也不需要做额外的标记处理。简而言之,在此方案下,Unity的所有资源和脚本,都是可以热更的。 本文随后将介绍如何去制作热更文件和如何应用这些热更文件。为了简化Demo的设计,Demo包含的热更文件会事先以全量更新的方式制作好,一起打到了Apk里面。
资源推荐
资源详情
资源评论
收起资源包目录
UnityAndroidIl2cppPatchDemo-master.zip (95个子文件)
UnityAndroidIl2cppPatchDemo-master
Assets
AndroidIl2cppPatchDemo
ZipLibrary
ICSharpCode.SharpZipLib.pdb 93KB
ICSharpCode.SharpZipLib.pdb.meta 155B
ICSharpCode.SharpZipLib.xml 512KB
ZipHelper.cs 9KB
ICSharpCode.SharpZipLib.dll.meta 2KB
ICSharpCode.SharpZipLib.dll 192KB
ICSharpCode.SharpZipLib.xml.meta 158B
ZipHelper.cs.meta 284B
Editor
Exe
unzip.exe.meta 196B
zip.exe 132KB
unzip.exe 164KB
zip.exe.meta 196B
AndroidBuilder.cs.meta 284B
AndroidBuilder.cs 22KB
Exe.meta 213B
PrebuiltPatches.meta 213B
ZipLibrary.meta 213B
Editor.meta 213B
Scene.meta 107B
Script
RunningArchABIController.cs.meta 284B
UnityAssetStoreNavigator.cs.meta 284B
RunningArchABIController.cs 451B
VersionSettor.cs 5KB
Bootstrap.cs.meta 284B
UI
MessageBoxUI.cs.meta 178B
MessageBoxUI.cs 885B
UI.meta 213B
Bootstrap.cs 2KB
VersionSettor.cs.meta 284B
UnityAssetStoreNavigator.cs 373B
PrebuiltPatches
null 0B
null.meta 155B
Scene
0.unity.meta 90B
0.unity 60KB
Plugins.meta 213B
Script.meta 107B
Plugins
Android
java.meta 172B
libs.meta 213B
java
io.meta 172B
io
github
noodle1983
Boostrap.java 330B
Boostrap.java.meta 608B
noodle1983.meta 172B
github.meta 172B
libs
arm64-v8a.meta 172B
x86.meta 213B
arm64-v8a
libbootstrap.so.meta 2KB
libbootstrap.so 910KB
x86
libbootstrap.so.meta 2KB
libbootstrap.so 946KB
armeabi-v7a.meta 213B
armeabi-v7a
libbootstrap.so.meta 2KB
libbootstrap.so 534KB
Android.meta 213B
Art.meta 172B
Art
Logo.meta 172B
Logo
icon.png.meta 2KB
icon.png 26KB
Others
Json.meta 172B
Script
SupportPhoneStat.cs 3KB
NativeShareScript.cs.meta 243B
NativeShareScript.cs 2KB
SupportPhoneStat.cs.meta 243B
Json
JsonNet-Lite
Newtonsoft.Json.dll.mdb 99KB
Newtonsoft.Json.dll 249KB
Newtonsoft.Json.dll.mdb.meta 147B
Newtonsoft.Json.dll.meta 645B
JsonNet-Lite.meta 106B
JsonNet-Lite.unitypackage.json.meta 92B
JsonNet-Lite.unitypackage.json 388B
Script.meta 172B
Others.meta 172B
AndroidIl2cppPatchDemo.meta 213B
.gitignore 146B
ProjectSettings
Physics2DSettings.asset 1KB
ProjectSettings.asset 19KB
TagManager.asset 378B
DynamicsManager.asset 763B
NavMeshAreas.asset 1KB
EditorBuildSettings.asset 138B
InputManager.asset 6KB
QualitySettings.asset 5KB
EditorSettings.asset 589B
GraphicsSettings.asset 2KB
ProjectVersion.txt 29B
AudioManager.asset 357B
NetworkManager.asset 151B
TimeManager.asset 202B
UnityConnectSettings.asset 886B
ClusterInputManager.asset 114B
build_demo_apk.cmd 2KB
build_demo_apk_2017_not_support_by_zip_lib.cmd 2KB
README.md 14KB
Packages
manifest.json 2KB
build_demo_apk_2019.cmd 2KB
build_demo_apk_2018.cmd 2KB
共 95 条
- 1
资源评论
- kening002021-08-08用户下载后在一定时间内未进行评价,系统默认好评。
PaytonSun
- 粉丝: 20
- 资源: 4577
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功