这是Unity Android APP il2cpp热更
Demo
Unity
热更
-
步 骤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,就正常 进入游 戏了。
说明 | |
---|---|
Editor/AndroidBuilder.cs | 这个 |
Editor/Exe/zip.exe | zip压缩 |
Plugin/ | |
PrebuiltPatches/ | |
Scene/*.unity | |
Script/Bootstrap.cs | 这个 |
Script/VersionSettor.cs | 这个 |
Script/UI/MessageBoxUI.cs | 这是一个简单的运行时MessageBox |
ZipLibrary/ | c# |
- 过程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安 装 文 件 ,可 复用。
关于
import android.view.WindowManager;
+ import io.github.noodle1983.Boostrap;
+ Boostrap.InitNativeLibBeforeUnityPlay(getApplication().getApplicationContext().getFilesDir().getPath());
mUnityPlayer = new UnityPlayer(this);
这三行代码保证了上图中步骤1-2
如前
//4. tell libboostrap.so to use the right patch after reboot
string error = Bootstrap.use_data_dir(runtimePatchPath);
if (!string.IsNullOrEmpty(error))
{
messageBox.Show("use failed. path:" + zipLibil2cppPath + ", error:" + error, "ok", () => { messageBox.Close(); });
yield break;
}
//5. reboot app
yield return StartCoroutine(Restart());
- Unity (
我 用 Unity2017/Unity2018/Unity2019) - Unity2019.4
自 带的JDK,SDK,NDK - Git
-
在 Unity中 (Edit->Preference->External tools)设置好 JDK/SDK/NDK路 径 ,打 包 代 码里会 从Unity中 读取。
-
- 确保gradle
能 正常 工作 (Unity内 能 正常 导出apk)
- 确保gradle
-
出 母 包 ,执行菜 单 AndroidBuilder->Run Step 1, 2, 4, 5 for base version,成功 后 会 弹出文 件 管理 器 显示apk所在 的 目 录.
-
- 一般来说你不需要打Patch
文 件 ,如果要 打 ,用 git checkout version1或 version2,执行菜 单 AndroidBuilder->Run Step 1-4 for Patch Version。PrebuildPatches目 录下的 相 应文件 会 被 更新 。
- 一般来说你不需要打Patch
- 设置
部分 需要 根 据 项目实际做修改 。 - 热更
文 件 的 增量 版本 化 管理 。
运行时
- 检查
新 版本 和 下 载热更 文 件 。 持 续增量 更新 的 Patch目 录的准 备。用 Asset Bundle管理 资源。
另外,
MIT license.
-
- noodle1983(Noodle)
完成 了 第 一 版 , MIT开源
- noodle1983(Noodle)
-
- DesperateZero(_DespAir.)贡献
了 首 次 上 线机会 ,协助解 决了一 下 问题
文 件 句柄 泄漏- 适配:oppo
手 机 ,/data/data/appid/files 访问不 了 - Google abb
打 包 的 适配问题(原因 是 abb的 方式 会 有 多 个apk包 ,原 来 是 patch第 一 个,目前 方案 是 patch含路径 asset/bin/Data的 那 个)
- DesperateZero(_DespAir.)贡献
-
- [qq:
墨 (2900180710)abram_ped@126.com]发现并解决了原 读写锁不生 效 的 问题,测试文 件 test_mutex.cpp
- [qq:
-
- sisong(e
侯 子 .net)实现了 基 于hook和 ApkDiffPatch的 另一种实现方式 ,实现了 mono和 Unity版本 的 热更,并做了 大量 的 机 型 和 各 个API Level的 测试。项目地 址
- sisong(e
-
- qq:
木子 (406351314)、西 's my baby(871967866)quange0314@163.com团队和 Sin(446541451)yudimo@vip.qq.com团队,帮忙发现和 验证随 机 崩 溃问题:#12
- qq:
-
- qq:Enough.(1098839800) 实践
文 档:通 过IL2CPP热更代 码
- qq:Enough.(1098839800) 实践
-
- qq:
粽 仔 001(1144916875) 发现的 Demo中 回 退 base version,脚本 常 量 仍然是 patch版本 的 问题。(il2cpp cache没 清 )
- qq:
-
- qq:みなの
総長 (53957801) 发现的 新 版本 没 有 更新 文 件 ,仍走了 没 必要 的 更新 逻辑的 问题。
- qq:みなの
-
- github: ganlvtech tests/fixs spin lock issue.
-
集成 中 如果有 问题,先 看 看 Demo的 release版本 有 没 有 问题。如果Demo有 问题,直接 找我吧,QQ或 邮件都 行 。
-
- 如果
感 兴趣,可 以在log.h里 ,把 日 志 全 开,会 有 一些很有意思的日志,对理解 原理 和 调试都 很有用 。
- 如果
-
- Android obb
的 支持 ,欢迎pull request,提供 支持
- Android obb
-
- Q
群 :593413410
- Q
-
- 遗留问题见Github Issues
- 邮件: noodle1983@126.com.
- Q
群 :593413410(广告免 扰)