为什么使用IL2CPP后端构建会导致Unity中的APK更大

时间:2018-09-26 08:31:49

标签: unity3d

我正在将Unity 2018.2.3与.Net 4.6脚本运行时一起使用。
我有两场比赛。当我使用IL2CPP后端构建时,apk大小总是大于Mono后端。

第一局:
单声道的APK大小:12.9 MB
带IL2CPP的APK大小:13.7 MB

第二局:
单声道的APK大小:39 MB
带IL2CPP的APK大小:45 MB

为什么会这样?

1 个答案:

答案 0 :(得分:5)

发生这种情况有几个原因。

首先,带有Mono的Android版本会在APK中交付托管程序集。这些程序集会及时编译为Android设备上的机器代码。另一方面,IL2CPP提前将托管程序集编译为机器代码,并将机器代码发送到APK中。这些受管程序集中的IL字节代码比机器代码更紧凑,这有两个原因:

  1. JIT仅将实际执行的托管代码转换为机器代码。 IL2CPP必须将其全部转换。
  2. 泛型需要提前全部扩展。 IL2CPP可以共享某些通用实现,但不能共享所有(特别是不能共享带有值类型参数的通用实现)。 JIT仅在使用通用生成时生成它们。

第二,默认情况下,Unity为带有IL2CPP的ARMv7和x86体系结构生成机器代码。由于IL2CPP需要提前生成该代码,因此重复了第一点提到的所有较大代码的问题。例如,如果不需要支持x86,则可以修改播放器设置以避免构建它。