Buen dia a todos! Este artículo trata sobre cómo perfilar juegos de Unity en Android con Android Studio. Hablaré sobre cómo configurar Android Studio y obtener la cantidad máxima de datos. Las cuestiones de análisis y conclusiones basadas en el resultado están fuera del alcance de este artículo.
Requisitos
Para crear un perfil completo de la aplicación, necesita un teléfono con Android 8 o posterior (API 27). En la experiencia, la creación de perfiles con versiones anteriores de Android es más aventurera que buena. Por esta razón, recomiendo obtener una línea completa de dispositivos Nexus, ya que tienen hardware antiguo y las últimas actualizaciones de Android.
Configurar un proyecto de Unity
Para obtener el resultado, debe configurar el proyecto Unity de cierta manera.
Configuración en la configuración de compilación

- En primer lugar, debe cambiar el Sistema de compilación a "Gradle" y marcar la casilla junto a "Exportar proyecto" . Por lo tanto, obtendremos un proyecto de Android Studio listo para usar, que continuaremos perfilando. Perfilar un APK terminado también es posible, pero es más limitado y requiere más preparación.
- Es aconsejable desactivar el modo "Desarrollo de desarrollo" , ya que los tiempos resultantes en el generador de perfiles serán lo más cercanos posible a los reales.
Configuración en la configuración del jugador

- Instalar backend de secuencias de comandos en IL2CPP . Si deja Mono, entonces con el perfil nativo veremos muchas funciones Mono, sin información sobre cómo se relacionan con el código C #.
- La opción 'Configuración del compilador C ++' para Android no tiene ningún efecto (en Unity 2018.3). Puede ponerlo en 'Release', tal vez en futuras versiones de la cadena de herramientas de Unity Android esta configuración afectará la configuración del compilador.
- Es aconsejable limitar la 'Arquitectura de destino' a ARMv7 . Así que ahorras tiempo de compilación y experimentas que muchas arquitecturas a veces ponen a Android Studio en un estado de estupor.
- También vale la pena establecer una serie de configuraciones adicionales:
- Ubicación de instalación: 'Preferencia externa'
- Acceso a Internet: 'Requerir'
- Permiso de escritura - 'Externo (tarjeta SD)'
Android Studio y otros perfiladores usan simpleperf para recopilar estadísticas, y necesitará acceso a una tarjeta de memoria para grabar archivos temporales.
Preparando el Proyecto Gradle
Después de haber instalado todas las configuraciones, cree un proyecto de Unity. Debería obtener una carpeta con el proyecto Gradle.

Por defecto, Unity crea un proyecto para que planees construir el APK final a partir de él. Por lo tanto, toda la información de depuración se ha eliminado, pero afortunadamente puede devolverse. Para hacer esto, debe reemplazar libil2cpp.so y libunity.so con la versión con información de depuración.
libil2cpp.so
Este es un archivo que contiene todo el código C ++ que IL2CPP generó a partir de su código C #. Unity genera toda la información necesaria para la creación de perfiles, pero para optimizar el tamaño de la APK, la corta durante el proceso de compilación. Para devolverlo:
- Ve a la carpeta de tu proyecto
- Localice la subcarpeta Temp en ella y vaya a la subcarpeta Temp / StagingArea / symbols / armeabi-v7a
- Busque 'libil2cpp.so.debug' en él. Esta es la versión de 'libil2cpp.so' con información de depuración.
- Ahora vaya al proyecto Gradle y busque la carpeta '\ src \ main \ jniLibs \ armeabi-v7a' en él
- Reemplace 'libil2cpp.so' con el archivo 'libil2cpp.so.debug'
libunity.so
Este es el archivo que contiene la parte de bajo nivel de Unity Player. Como estamos haciendo versiones de lanzamiento, Unity coloca un archivo en su proyecto sin depurar la información. Debe reemplazar libunity.so con un archivo de caracteres.
- Vaya a la carpeta donde tiene instalado Unity
- Vaya a la carpeta "\ Data \ PlaybackEngines \ AndroidPlayer \ Variations \ il2cpp \ Development \ Libs \ armeabi-v7a \"
- Tome el archivo libunity.so de allí y reemplace el archivo en su proyecto, que se encuentra en la carpeta '\ src \ main \ jniLibs \ armeabi-v7a'
Perfilado
Ahora puede comenzar a crear perfiles en Android Studio, simplemente haga clic en el botón Iniciar perfilador.

Android Studio inicia la aplicación y comienza la sesión de creación de perfiles

De manera predeterminada, Android Studio muestra gráficos, pero no muestra datos. Para comenzar el proceso, debe hacer clic en la pista de la CPU para que el generador de perfiles cambie a la vista de la CPU. En este caso, aparecerá un menú desplegable y el botón 'Grabar' en la parte superior de la ventana.

Seleccione "Nativo" muestreado (en Android Studio 3.3 - C / C ++ Native) y haga clic en el botón "Grabar".
Dado que la grabación se realiza en el disco del dispositivo, es mejor no grabar más de 5 a 8 segundos de experiencia, muchos dispositivos también fallarán en una cantidad menor de datos (consulte la lista de dispositivos probados al final del artículo).
Para obtener el resultado, haga clic en 'Detener' y luego en un cuadrado rojo para interrumpir la sesión. Es difícil entender la idea de los autores, pero si no detiene la grabación por completo, el generador de perfiles no siempre comienza a analizar los datos recibidos y su segmento con los datos irá muy lejos.

Después de eso, solo queda esperar un poco, después de 30-50 segundos, el perfilador le dará el resultado. Si todo está configurado correctamente, obtendrá la captura con todos los nombres de funciones

Características conocidas
- Los resultados más estables se pueden obtener en dispositivos raíz
- No use Samsung, y tienen muchas campanas y silbatos protectores que interfieren con la depuración
- En muchos lugares, su pila colectiva irá a funciones de la forma 'kernel.kptr + address'. Estas son llamadas dentro del kernel de Android que están protegidas debido a políticas de seguridad. En un dispositivo rooteado, la protección se puede deshabilitar:
- Ejecute el `adb shell`
- Ejecute `su` para obtener privilegios de root
- Ejecute 'sysctl -w kernel.kptr_restrict = 0': esto eliminará la protección del núcleo
- [!] Una vez finalizada la depuración, ejecute 'sysctl -w kernel.kptr_restrict = 1'. Algunos dispositivos no podrán iniciar el sistema operativo de lo contrario al reiniciar. En muchos casos, se trata solo con un núcleo limpio.
- Si Android Studio se bloquea con frecuencia, puede intentar aumentar el montón de Java VM:
- 2 Gb: para proyectos de tamaño mediano ('-Xmx2g')
- 4Gb - para grandes proyectos ('-Xmx4g')
- En dispositivos no rooteados, a veces cambiar el núcleo al 'modo permisivo' mejora la situación.
- Ejecute el comando 'adb shell setenforce 0'
Detalles de la unidad
- El hilo principal de Unity se llama UnityMain, pero puede ver un montón de UnityMain al perfilar. Estos son hilos de usuario que crea dentro del código C #. Por defecto, obtienen el mismo nombre. El hilo principal de Unity suele ser fácil de distinguir, ya que será el más cargado.
- La secuencia de gráficos se llama UnityGfxWorkerW
- Los subprocesos del sistema Unity Job se denominan subprocesos de trabajo.
- Desafortunadamente, algunas funciones de espera que usa Unity (futex-s), Android Studio muestra y considera no como tiempo de espera, sino como actividad.
- Cuando miras el gráfico de llamadas en la vista de arriba hacia abajo, tienes que pasar por muchos niveles con una llamada de Java, desafortunadamente no puedes filtrarlo en Android Studio.

Dispositivos recomendados
Utilizamos los siguientes dispositivos para experimentos:
- Samsung Galaxy S8
- Google Pixel 2XL
- Google pixel
- Sony Xperia XA1
- Huawei Honor 7
- Huawei Nexus 6P
- Moto G5P
- Asus Nexus 7 (2013)
Todos los dispositivos fueron instalados, para Huawei Nexus 6P hemos ensamblado el núcleo y
AOSP . Como resultado, Google y Sony resultaron ser los más libres de problemas y fáciles de trabajar. Sony tiene un gran sitio para desarrolladores:
dispositivos abiertos . Huawei ya no le permite desbloquear dispositivos de una manera fácil, Samsung causa dificultades constantes con niveles adicionales de protección. El Moto G5P a menudo bloqueaba el proceso de recopilación de datos del generador de perfiles (simpleperf).