Всем добрый день! Эта статья о том, как профилировать игры Unity на Android с помощью Android Studio. Я расскажу о том, как настроить Android Studio и получить максимальный объем данных.
Вопросы анализа и выводы на основе полученных результатов выходят за рамки данной статьи.
Требования
Чтобы полностью профилировать приложение, вам понадобится телефон с Android 8 или более поздней версии (API 27).
По опыту, профилирование в старых версиях Android — это больше приключений, чем того стоит. По этой причине я рекомендую приобрести полную линейку устройств Nexus, поскольку у них более старое оборудование и последние обновления Android.
Настройка проекта Unity
Чтобы получить результат, вам придется определенным образом настроить проект Unity.Настройки в настройках сборки
- Прежде всего, необходимо переключиться Система сборки В "Грейдл" и поставьте галочку рядом с ним «Экспортный проект» .
Таким образом мы получим готовый проект Android Studio, который в дальнейшем профилируем.
Профилирование готового APK также возможно, но оно более ограничено и требует дополнительной подготовки.
- Режим «Развитие строительства» желательно его отключить, так как таким образом результирующие тайминги в профайлере будут максимально приближены к реальным
Настройки в настройках плеера
- Установить Скриптовый бэкэнд В IL2CPP .
Если мы оставим Mono, то при нативном профилировании мы увидим множество функций Mono, без информации о том, как они связаны с кодом C#.
- Вариант «Конфигурация компилятора C++» для Android это не имеет никакого эффекта (в Unity 2018.3).
Вы можете установить для него значение «Release», возможно, в будущих версиях набора инструментов Unity для Android этот параметр повлияет на настройки компилятора.
- Целесообразно ограничить «Целевая архитектура» до ARMv7 .
Таким образом вы сэкономите время компиляции, а по опыту многие архитектуры иногда путают Android Studio.
- Также стоит установить ряд дополнительных настроек:
- Место установки — «Предпочитать внешний»
- Доступ в Интернет – «Требуется»
- Разрешение на запись — «Внешнее (SDCard)»
Подготовка проекта Gradle
После того, как вы установили все настройки, создайте проект Unity. Вы должны получить папку с проектом Gradle.Unity по умолчанию собирает проект на основе того, что вы планируете собрать из него окончательный APK. Поэтому из него была удалена вся отладочная информация, но ее, к счастью, можно вернуть.
Для этого нужно заменить libil2cpp.so и libunity.so на версии с отладочной информацией.
libil2cpp.so
Это файл, содержащий весь код C++, сгенерированный IL2CPP на основе вашего кода C#.Unity генерирует всю необходимую для профилирования информацию, но для оптимизации размера APK вырезает ее в процессе сборки.
Чтобы вернуть его:
- Перейдите в папку вашего проекта
- Найдите его в подпапке Температура и перейдите в подпапку Temp/StagingArea/символы/armeabi-v7a
- Найдите в нем 'libil2cpp.so.debug' .
Это версия libil2cpp.so с отладочной информацией.
- Теперь перейдите в проект Gradle и найдите в нем папку '\src\main\jniLibs\armeabi-v7a'
- Заменять 'libil2cpp.so' файл 'libil2cpp.so.debug'
libunity.so
Это файл, содержащий низкоуровневую часть Unity Player. Поскольку мы делаем сборку Release, Unity включила в ваш проект файл без отладочной информации.Вам необходимо заменить libunity.so файлом символов.
- Перейдите в папку, в которой у вас установлен Unity.
- Перейти в папку "\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Development\Libs\armeabi-v7a\"
- Возьмите файл оттуда libunity.so и замените файл в вашем проекте, который находится в папке '\src\main\jniLibs\armeabi-v7a'
Профилирование
Теперь вы можете начать профилирование в Android Studio, просто нажмите кнопку запуска профилировщика.
Android Studio запустит приложение и начнет сеанс профилирования.
По умолчанию Android Studio отображает графики, но не выполняет выборку данных.
Чтобы запустить процесс, вам нужно нажать на дорожку ЦП, чтобы профилировщик переключился на представление ЦП.
При этом в верхней части окна появится раскрывающийся список и кнопка «Запись».
Выберите «Собственный вариант» (в Android Studio 3.3 — C/C++ Native) и нажмите кнопку «Запись».
Так как запись производится на диск устройства, по опыту лучше не записывать более 5-8 секунд; многие устройства выйдут из строя даже при меньшем объёме данных (см.
список протестированных устройств в конце статьи).
Чтобы получить результат, нажмите «Стоп», а затем красный квадрат, чтобы завершить сеанс.
Трудно понять замысел авторов, но если не остановить запись полностью, профайлер не всегда начнет анализировать полученные данные и ваш сегмент с данными уйдет в отдаленные места.
После этого вам останется только немного подождать, через 30-50 секунд профайлер выдаст вам результат. Если все настроено правильно, вы получите захват со всеми названиями функций.
Примечательные особенности
- Наиболее стабильные результаты можно получить на рутированных устройствах.
- Не используйте Samsung, у них много наворотов безопасности, которые мешают отладке.
- Во многих местах ваш стек вызовов будет включать такие функции, как «kernel.kptr + адрес».
Это вызовы внутри ядра Android, защищенные политиками безопасности.
На рутованном устройстве вы можете отключить защиту:
- Запустите `adb Shell`
- Запустите `su`, чтобы получить root-права
- Запустите 'sysctl -w kernel.kptr_restrict=0' — это снимет защиту с ядра.
- [!] После завершения отладки запустите «sysctl -w kernel.kptr_restrict=1».
В противном случае некоторые устройства не смогут загрузить ОС после перезагрузки.
Во многих случаях вылечить можно только прошивкой чистого ядра.
- Если Android Studio часто дает сбой, вы можете попробовать увеличить кучу виртуальной машины Java:
- 2Гб — для проектов среднего размера ('-Xmx2g')
- 4Gb — для больших проектов ('-Xmx4g')
- На нерутированных устройствах иногда переключение ядра в «разрешительный режим» улучшает ситуацию.
- Запустите команду «adbshell setenforce 0».
- Запустите команду «adbshell setenforce 0».
Специфика Unity
- Основной поток Unity называется UnityMain, но при профилировании вы можете увидеть несколько UnityMain. Это пользовательские потоки, которые вы создаете внутри своего кода C#.
По умолчанию они получают одно и то же имя.
Основной поток Unity обычно легко определить, поскольку это самый загруженный поток.
- Графический поток называется UnityGfxWorkerW.
- Системные потоки Unity Job называются Worker Thread.
- К сожалению, некоторые функции ожидания, которые использует Unity (фьютекс), отображаются и учитываются Android Studio не как время ожидания, а как активность.
- Когда вы смотрите на график вызовов в представлении «Сверху вниз», вам придется пройти множество уровней вызова Java; к сожалению, это никак нельзя отфильтровать в Android Studio.
Рекомендуемые устройства
Для экспериментов мы использовали следующие устройства:- Самсунг Галакси С8
- Гугл Пиксель 2XL
- Google Пиксель
- Сони Иксперия ХА1
- Хуавей Хонор 7
- Хуавей Нексус 6П
- Мото G5P
- Асус Нексус 7 (2013 г.
)
По итогам наиболее безотказными и простыми в работе оказались Google и Sony. У Sony есть отличный сайт для разработчиков — Открытые устройства .
Huawei больше не позволяет легко разблокировать устройства; У Samsung постоянные трудности с дополнительными уровнями защиты.
Moto G5P часто приводил к сбою в процессе сбора данных профилировщика (simpleperf).
Теги: #Разработка Android #Разработка мобильных приложений #unity #Android Studio #unity3d #andriod
-
Персонажи, Сплетенные Из Медной Проволоки
19 Oct, 24 -
Нет, Нельзя Жалеть Всех Сразу
19 Oct, 24 -
Итоги Конкурса Pwnfest
19 Oct, 24 -
Эффект Доплера В Сетях: Gsm, 3G, 4G
19 Oct, 24 -
Macbook Air Взломали За Две Минуты
19 Oct, 24 -
Как Мы Рисовали Эротический Баннер
19 Oct, 24