Это происходит по нескольким причинам.
Во-первых, сборка Android с Mono отправляет управляемые сборки в APK.Эти сборки точно вовремя скомпилированы в машинный код на устройстве Android.IL2CPP, с другой стороны, заблаговременно компилирует управляемые сборки в машинный код и отправляет машинный код в APK.Байт-код IL в этих управляемых сборках является более компактным, чем машинный код, по двум причинам:
- Только фактически выполненный управляемый код преобразуется в машинный код с помощью JIT.IL2CPP должен преобразовать все это.
- Обобщения должны быть расширены заранее.IL2CPP может использовать некоторые общие реализации, но не все (в частности, не общие реализации с аргументами типа значения).JIT генерировал только общие реализации по мере их использования.
Во-вторых, по умолчанию Unity генерирует машинный код для архитектур ARMv7 и x86 с IL2CPP.Поскольку IL2CPP должен генерировать этот код заранее, все проблемы с большим кодом, упомянутые в первом пункте, дублируются.Например, если вам не нужна поддержка x86, вы можете изменить настройки проигрывателя, чтобы избежать его сборки.