Что такое сборка IL2CPP для Android
Что проверяют
Понимаете ли разницу между JIT и опережающей компиляцией и знаете ли цену выбора бэкенда скриптов. Вопрос практический: от него зависят сборка, размер артефакта, отладка крэшей и набор того, что перестанет работать.
Как отвечать
IL2CPP берёт промежуточный код, в который компилятор перевёл ваш C#, транслирует его в C++, а дальше нативный компилятор из NDK собирает библиотеку под целевую архитектуру. Альтернатива для Android это Mono, который компилирует промежуточный код во время работы приложения. То есть речь не про интерпретацию против нативного кода, а про опережающую компиляцию против компиляции на устройстве.
Что это даёт на практике. Шестидесятичетырёхбитная сборка под Android доступна только с IL2CPP, а магазины приложений её требуют, так что выбора в реальном проекте почти нет. Плюс ускорение управляемого кода и заметно более трудный разбор сборки чужими руками. Минусы: сборка идёт кратно дольше, артефакт крупнее, отладка сложнее.
Ограничения опережающей компиляции нужно назвать самому: динамическая генерация кода недоступна, обобщённые методы по значимым типам должны быть выведены при сборке, а вырезание неиспользуемого кода выбрасывает типы, которые задействованы только через рефлексию или десериализацию. Спасают файл настроек компоновщика и атрибут сохранения. Крэши прилетают нативными стеками, поэтому символы сборки надо хранить рядом с версией.
Где спотыкаются
Обещают ускорение всего приложения. Ускоряется управляемый код, а узкое место в мобильной игре обычно в отрисовке, количестве вызовов отрисовки, физике и аллокациях, которые дёргают сборщик мусора. Без замера до и после заявление звучит как реклама.
Ловят на устройстве отсутствующий тип или пустую ссылку там, где в редакторе всё работало. Редактор исполняет управляемый код иначе, и вырезание кода в редакторе не применяется, поэтому проверять надо на устройстве в той же конфигурации сборки, а не только в режиме игры.
Называют такую сборку защитой от вскрытия. Разбирать нативный код труднее, но строки, имена методов по метаданным, ресурсы и сетевой обмен остаются доступными, поэтому ключи и проверку покупок в клиенте держать всё равно нельзя.