Управляемый код стриппинг и Unity линкер
Процесс сборки Unity использует инструмент под названием Unity linker для удаления управляемого кода. Unity linker является версией IL Linker, настроенной для работы с Unity. Настраиваемые части Unity linker, специфичные для движка Unity, не являются общедоступными.
Линкер Unity отвечает как за управляемое удаление кода, так и за часть процесса удаления кода двигателя, который является отдельным процессом, доступным через IL2CPP скриптовый бэкэнд, удаляющий неиспользуемый код двигателя. Дополнительные сведения см. в PlayerSettings.StripEngineCode.
Как линкер Unity удаляет сборки
При сборке проекта Unity процесс сборки компилирует код C# в формат байт-кода .NET, называемый Общим промежуточным языком (CIL). Unity упаковывает этот байт-код CIL в файлы, называемые сборками. Библиотеки .NET и любые библиотеки C# в плагинах, используемых в вашем проекте, также предварительно упакованы как сборки байт-кода CIL.
Для целей управляемого удаления кода сборки подразделяются на следующие категории:
-
.NET Сборки библиотек классов: включает библиотеки классов Mono, такие как
mscorlib.dllиSystem.dll, а также сборки-фасады библиотеки классов .NET, такие какnetstandard.dll. - Платформа SDK сборки: Включает управляемые сборки, специфические для платформы SDK. Например, сборка
windows.winmd, которая является частью универсальной платформы Windows SDK. - Unity Сборки модуля двигателя: Включает управляемые сборки, которые составляют двигатель Unity, например
UnityEngine.Core.dll. -
Project сборки: Включает сборки, специфичные для проекта, такие, как:
- Сборки скриптов, такие как
Assembly-CSharp.dll. - Предварительно скомпилированные сборки.
- Определение сборки Сборки.
- Пакета в сборе.
- Сборки скриптов, такие как
Как правило, любые сборки в вашем проекте, которые не относятся ни к одной из этих категорий, не обрабатываются линкером Unity и исключаются из сборки Player.
Во время сборки линкер Unity обрабатывает все применимые типы сборок и выполняет следующие действия:
- Помечает корневые типы, методы, свойства и поля в соответствии с Правила маркировки корней применимые для типа сборки и настроенного уровня удаления кода.
- Анализ корней, помеченных для идентификации, и маркировка любого управляемого кода, от которого зависят эти корни, в соответствии с применимыми правила маркировки зависимостей.
- Удаляет оставшийся код из сборки, не помеченный как недоступен для любого пути выполнения через код приложения.
Редактирование методов
На Высоком уровне удаления, линкер Unity редактирует тела методов для дальнейшего уменьшения размера кода. Линкер Unity редактирует тела методов только в сборках Библиотеки Классов .NET.
Линкер Unity может редактировать тело метода следующими способами:
- Удаление недоступных веток: блоки команд
if, которые проверяютSystem.Environment.OSVersion.Platformи недоступны для текущей целевой платформы. - Встроенные методы, которые доступны только для полей: заменяют вызов методов, которые получают или устанавливают поле, прямым доступом к полю. Это часто позволяет полностью убрать метод. При использовании скриптового бэк-энда Mono, линкер Unity производит это изменение только тогда, когда вызывающему метод разрешается прямой доступ к полю, исходя из видимости поля. Для IL2CPP правила видимости не применяются, поэтому линкер Unity производит это изменение там, где это необходимо.
- Встроенные методы, которые возвращают только значение
const. - Удалить вызов методов, которые пусты и имеют тип возврата
void. - Удалить блоки
try-finally, когда блокfinallyпуст. Удалить пустые вызовы может создать пустые блокиfinally. Когда это происходит во время редактирования метода, линкер Unity удаляет весь блокtry-finally. Один из сценариев, когда это может произойти, это когда компилятор генерирует блокиtry-finallyкак часть цикловforeachдля вызоваDispose.
Примечание: После редактирования тел методов исходный код сборки больше не соответствует скомпилированному коду в сборке, что может затруднить отладку.