menu

Unity3d 2019 Managed 文件夹缓存机制

在 il2cpp 模式下,对比 unity3d 2018 与 2019 版本,我们发现了一个有意思的小变化,分享给大家。

1. 起始

Unity3d app 运行时,会把 apk 包中的 assets/bin/Data/Managed 目录释放到 Application.persistentDataPath 下的 il2cpp 目录,根据 apk 权限 / 是否有 sdcard 等因素,该目录可能在外部存储上 /storage/emulated/0/Android/data/com.packagname.xxx/files, 也有可能在内部存储上 /data/data/com.packagename.xxx/files。

apk 中:

2

apk 运行后释放:

2. Unity3d 2018

在 unity3d 2018 中会直接释放,不会判断游戏是否已经运行过。即使游戏上一次运行已经释放过,第二次运行仍然会释放覆盖。逻辑在 libunity.so 中的 UnityInitApplication 函数:

3

3. Unity3d 2019

在 unity3d 2019 中会判断是否已经释放过,如果没有释放过,则执行释放; 如果已经释放过,会再判断版本信息是否一致,若一致,则不再释放,若不一致,则执行释放。

4

用于判断版本信息是否一致的这个 s_BuildData 来自哪里呢? 它主要来自 libunity.so 中的 BootConfig 类:

5

而 BootConfig 类中的初始化数据来自 assets/bin/Data/boot.config 文件:

6

boot.config 文件内容:

7

Unity3d 2019 在导出 apk 时,会生成一个 buildDate 字段放到 boot.config 文件,运行时使用此字段来判断是否需要释放 il2cpp 资源覆盖磁盘上的 il2cpp 资源内容。

4. 小结

1). Unity3d 2018 会直接释放 il2cpp 资源到 Application.persistentDataPath 目录。

2). Unity3d 2019 在释放 il2cpp 资源时,则会先判断是否已经释放过,如果 buildDate 一致,则使用缓存,如果不一致,则执行释放。

5. FairGuard 专注于 Unity 加密以及反外挂,为 Unity 提供全方位的保护方案

我们可以对 il2cpp 资源做全方面的加密处理,保护 il2cpp 资源。