0x00 前言

Unity 2018.3之后,新的“Managed Stripping Level”选项将替换 player settings 中原有的“Stripping Level”选项。 这个新的选项可用于所有平台以及Mono和IL2CPP脚本运行时。而这个功能的主要目的则是通过删除一些未使用的代码来减小应用程序的大小。 嗯,听起来不错,但这里存在一个潜在的副作用,即Unity如何知道哪些代码才是未使用的代码呢?

0x01 Load From Assetbundle 以及 “the script is missing”

但是,在继续讨论代码剔除流水线之前,让我们看一下由于代码剔除导致问题的一个情景。

现在,让我们在编辑器中创建一个Cube和一个Timeline资源。 使用Timeline,我们可以将Cube从A点移动到B点。

为了更好地管理和更新资源,我们将场景中的Cube制作为Prefab并将Cube本身从场景中删除。 然后,我们将这个prefab和Timeline资源制成AssetBundle,以便在运行时动态加载资源。

我们可以在编辑器中加载Assetbundle并实例化Prefab,然后我们可以看到Cube开始了从点A到点B的移动——Timeline的脚本生效了。

 

此时,这个工作流似乎工作正常: 从场景中删除资源,将它们放入Assetbundle中,并在运行时动态加载它们。

之后,我们将项目构建到iOS平台,运行相同的场景并加载相同的Assetbundle以在运行时创建Cube对象。 但是这次,Cube并没有开始按预期移动,并且我们从Unity收到了一条错误消息。

“The referenced script (UnityEngine.Timeline.AnimationTrack) on this Behaviour is missing!”

Timeline的脚本丢失了,并且导致了Cube无法在iOS平台上移动。

0x02 代码剔除流水线

丢失与Timeline相关的脚本的原因是,在构建iOS版本时Unity删除了相关代码。

首先要注意的是,iOS使用IL2CPP脚本运行时。 因为Apple的App Store不再接受Mono版本,并且iOS 11及更高版本也不支持Mono。 而选择IL2CPP脚本运行时的时候,“Managed code stripping”的“Disabled”选项将不可用。 这意味着当我们选择IL2CPP脚本运行时的结果就是无法关闭代码剔除。

要注意的第二件事是代码剔除流水线本身。 Unity的Build Pipeline会使用一个称为UnityLinker的工具来剔除托管代码。该过程的工作方式是定义root assemblies,然后使用静态代码分析来确定这些root assemblies还要使用哪些其他的托管代码。 之后删除所有无法访问的代码,即所谓的未使用代码。 其中Unity Engine的程序集也是有可能被剥离的。 root assemblies是Unity Editor根据用户脚本代码编译的程序集,例如Assembly-CSharp.dll。同时构建中包含的场景也会被视为root。

因此,在运行时从Assetbundle加载资产时,至少有3种方法可以避免类似脚本丢失的问题。

  1. 在构建的场景中引用所需的脚本,以防止在构建项目时剔除需要的代码。

如图,将PlayableDirector组件和一个空的Timeline对象添加到场景中。

2. 在脚本中引用所需的类,以防止在构建项目时剔除需要的代码。

3. 添加一个link.xml文件,以防止UnityLinker剔除所需的代码。

可以在下面的代码仓库中查看这三种方式的示例,4个分支分别代表了会被剔除代码(Master)以及3种防止代码被错误剔除的方式。

https://github.com/chenjd/CodeStripExample​github.com

0x03 结论

如果你开启了代码剔除功能以减小构建的包体大小,那么请留意Unity是否会剔除你在运行时所需的代码,例如反射相关的代码等等。 特别是对于那些使用IL2CPP脚本运行时的平台(例如iOS),默认情况下会启用代码剔除。 如果使用Assetbundle管理资源,则需要注意不要删除所需的代码。

不要忽视Managed code stripping的副作用的更多相关文章

  1. Optimize Managed Code For Multi-Core Machines

    Parallel Performance Optimize Managed Code For Multi-Core Machines Daan Leijen and Judd Hall This ar ...

  2. Passing JavaScript Objects to Managed Code

    Silverlight If the target managed property or input parameter is strongly typed (that is, not typed ...

  3. How to: Synchronize Files by Using Managed Code

    The examples in this topic focus on the following Sync Framework types: FileSyncProvider FileSyncOpt ...

  4. [转]Passing Managed Structures With Strings To Unmanaged Code Part 3

    1. Introduction. 1.1 In part 1 of this series of blogs we studied how to pass a managed structure (w ...

  5. [转]Passing Managed Structures With Strings To Unmanaged Code Part 2

    1. Introduction. 1.1 In part 1 of this series of blogs we studied how to pass a managed structure (w ...

  6. [转]Passing Managed Structures With Strings To Unmanaged Code Part 1

    1. Introduction. 1.1 Managed structures that contain strings are a common sight. The trouble is that ...

  7. Native code on Windows Phone 8(转)

    Windows Phone 8 introduces the ability to use native code to implement Windows Phone. In this sectio ...

  8. Calling C++ code from C# z

    http://blogs.msdn.com/b/borisj/archive/2006/09/28/769708.aspx I apologize for the long delay for thi ...

  9. code 代码分析 及其解决方案

    官网地址:http://msdn.microsoft.com/zh-cn/library/ms182135.aspx [FxCop.设计规则]11. 不应该使用默认参数 参考地址:http://blo ...

随机推荐

  1. 关于css中hover下拉框的一个bug

    写hover下拉框的时候会遇到一个奇怪的bug,就是下拉框下来的时候会被所在位置的div遮挡,哪怕下拉框使用的absolute,也会被遮挡. 如图: 这个语言选择的下拉框会被下面的div挡住(截图是已 ...

  2. 5)关于CSS和js静态文件引入路径

    (1)参考资料   thinkphp5手册      视图--->输出替换 (2)方法(1)在我们的application中,找到config.php,在里面输入这样的配置: <?php ...

  3. 在windows系统下安装使用msf

    前沿 msf基本是我在kali里最经使用的工具了 因为今天碰到一些关于VmWare的事情没有解决 windows在前一段时间更新,要求我卸载vmware虚拟机,否则就无法更新. 卸载之后再装回来就无法 ...

  4. rest framework-restful介绍-长期维护

    ###############   django框架-rest framework    ############### # django rest framework 框架 # 为什么学习这个res ...

  5. Linux基本操作_20191117

    VMware和Ubuntu的安装, 想来想去,还是需要安装,不能老是使用Windows的,后面还有很多都要用到Linux系统的,这个可以说是开发人员必备的了, 基本的使用: 1,Windows下面C: ...

  6. [Codefoeces398B]Painting The Wall(概率DP)

    题目大意:一个$n\times n$的棋盘,其中有$m$个格子已经被染色,执行一次染色操作(无论选择的格子是否已被染色)消耗一个单位时间,染色时选中每个格子的概率均等,求使每一行.每一列都存在被染色的 ...

  7. android完整智能家居、备忘录、蓝牙配对、3D动画库、购物车页面、版本更新自动安装等源码

    Android精选源码 app 版本更新.下载完毕自动自动安装 android指针式分数仪表盘 ANdroid蓝牙设备搜索.配对 Android 图片水印框架,支持隐形数字水印 android3D旋转 ...

  8. Visual Studio 2017 Professional 下载

    可以进行Office 2013/2016 VSTO开发 安装平台:Win 7 SP1.Win 10. 下载: VisualStudio2017_Professional.rar

  9. MySQL 之全文索引

    最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录. 引入概念通过数值比较.范围过滤等就可以 ...

  10. Qt 获取当前时间

    时间日期是经常遇到的数据类型,Qt 中时间日期类型的类如下: QTime:时间数据类型,仅表示时间,如11:12:13. QDate:日期数据类型,仅表示日期,如2011-11-11. QDateTi ...