Bonne journée à tous! Cet article explique comment profiler les jeux Unity sur Android avec Android Studio. Je vais vous expliquer comment configurer Android Studio et obtenir le maximum de données. Les questions d'analyse et de conclusions basées sur le résultat sortent du cadre de cet article.
Prérequis
Pour profiler pleinement l'application, vous avez besoin d'un téléphone avec Android 8 ou version ultérieure (API 27). Dans l'expérience, le profilage avec les anciennes versions d'Android est plus aventureux que bon. Pour cette raison, je recommande d'obtenir une gamme complète d'appareils Nexus, car ils ont un ancien matériel et les dernières mises à jour Android.
Configuration d'un projet Unity
Pour obtenir le résultat, vous devez configurer le projet Unity d'une certaine manière.
Paramètres dans les paramètres de build

- Tout d'abord, vous devez basculer le système de construction sur «Gradle» et cocher la case à côté de «Exporter le projet» . Ainsi, nous aurons un projet Android Studio prêt à l'emploi, que nous continuerons à profiler. Le profilage d'un fichier APK fini est également possible, mais plus limité et nécessite plus de préparation.
- Il est conseillé de désactiver le mode «Development Build» , car les timings résultants dans le profileur seront aussi proches que possible des vrais.
Paramètres dans les paramètres du lecteur

- Installez le backend de script dans IL2CPP . Si vous quittez Mono, avec le profilage natif, nous verrons de nombreuses fonctions Mono, sans informations sur la façon dont elles se rapportent au code C #.
- L'option 'Configuration du compilateur C ++' pour Android n'a aucun effet (dans Unity 2018.3). Vous pouvez le mettre dans 'Release', peut-être que dans les futures versions de la chaîne d'outils Unity Android, ce paramètre affectera les paramètres du compilateur.
- Il est conseillé de limiter l '«architecture cible» à ARMv7 . Ainsi, vous économisez du temps de compilation et faites l'expérience de nombreuses architectures qui mettent parfois Android Studio dans une stupeur.
- Il convient également de définir un certain nombre de paramètres supplémentaires:
- Emplacement d'installation - «Préférer externe»
- Accès Internet - «Requis»
- Autorisation d'écriture - «Externe (SDCard)»
Android Studio et d'autres profileurs utilisent simpleperf pour collecter des statistiques, et il aura besoin d'accéder à une carte mémoire pour enregistrer des fichiers temporaires.
Préparation du projet Gradle
Après avoir installé tous les paramètres, créez un projet Unity. Vous devriez obtenir un dossier avec le projet Gradle.

Par défaut, Unity crée un projet afin que vous envisagiez de créer le fichier APK final à partir de celui-ci. Par conséquent, toutes les informations de débogage en ont été supprimées, mais heureusement, elles peuvent être renvoyées. Pour ce faire, vous devez remplacer libil2cpp.so et libunity.so par la version contenant des informations de débogage.
libil2cpp.so
Il s'agit d'un fichier qui contient tout le code C ++ généré par IL2CPP à partir de votre code C #. Unity génère toutes les informations nécessaires au profilage, mais pour optimiser la taille de l'APK, il les supprime pendant le processus de génération. Pour le retourner:
- Accédez à votre dossier de projet
- Localisez-y le sous-dossier Temp et accédez au sous-dossier Temp / StagingArea / symboles / armeabi-v7a
- Recherchez 'libil2cpp.so.debug' dedans. Il s'agit de la version de «libil2cpp.so» avec des informations de débogage.
- Maintenant, allez dans le projet Gradle et trouvez le dossier '\ src \ main \ jniLibs \ armeabi-v7a' dedans
- Remplacez 'libil2cpp.so' par le fichier 'libil2cpp.so.debug'
libunity.so
Il s'agit du fichier qui contient la partie de bas niveau de Unity Player. Puisque nous effectuons des versions Release, Unity place un fichier dans votre projet sans déboguer les informations. Vous devez remplacer libunity.so par un fichier de caractères.
- Accédez au dossier dans lequel vous avez installé Unity
- Accédez au dossier "\ Data \ PlaybackEngines \ AndroidPlayer \ Variations \ il2cpp \ Development \ Libs \ armeabi-v7a \"
- Prenez le fichier libunity.so Ă partir de lĂ et remplacez le fichier dans votre projet, qui se trouve dans le dossier '\ src \ main \ jniLibs \ armeabi-v7a'
Profilage
Vous pouvez maintenant démarrer le profilage dans Android Studio, cliquez simplement sur le bouton Démarrer le profileur.

Android Studio lance l'application et la session de profilage commence

Par défaut, Android Studio affiche des graphiques, mais n'échantillonne pas de données. Pour démarrer le processus, vous devez cliquer sur la piste CPU afin que le profileur passe à la vue CPU. Dans ce cas, une liste déroulante et le bouton «Enregistrer» apparaîtront en haut de la fenêtre.

Sélectionnez Sampled 'Native' (Dans Android Studio 3.3 - C / C ++ Native), puis cliquez sur le bouton 'Enregistrer'.
Étant donné que l'enregistrement se fait sur le disque de l'appareil, il est préférable de ne pas enregistrer plus de 5 à 8 secondes d'expérience, de nombreux appareils échoueront également sur une plus petite quantité de données (voir la liste des appareils testés à la fin de l'article).
Pour obtenir le résultat, cliquez sur «Arrêter» puis sur un carré rouge pour interrompre la session. Il est difficile de comprendre l'idée des auteurs, mais si vous n'arrêtez pas complètement l'enregistrement, le profileur ne commence pas toujours à analyser les données reçues et votre segment avec les données ira loin.

Après cela, il ne reste plus qu'à attendre un peu, après 30-50 secondes le profileur vous donnera le résultat. Si tout est correctement configuré, vous obtiendrez la capture avec tous les noms de fonction

Caractéristiques connues
- Les résultats les plus stables peuvent être obtenus sur les appareils racine
- N'utilisez pas Samsung, et ils ont de nombreuses cloches et sifflets de protection qui interfèrent avec le débogage
- Dans de nombreux endroits, votre pile collective ira dans des fonctions de la forme «kernel.kptr + address». Ce sont des appels dans Android Kernel qui sont protégés en raison de politiques de sécurité. Sur un appareil rooté, la protection peut être désactivée:
- Exécutez le `adb shell`
- Exécutez `su` pour obtenir les privilèges root
- Exécutez 'sysctl -w kernel.kptr_restrict = 0' - cela supprimera la protection du noyau
- [!] Une fois le débogage terminé, exécutez 'sysctl -w kernel.kptr_restrict = 1'. Certains appareils ne pourront pas démarrer le système d'exploitation sinon au redémarrage. Dans de nombreux cas, il n'est traité qu'en faisant clignoter un noyau propre.
- Si Android Studio se bloque fréquemment, vous pouvez essayer d'augmenter le tas de machine virtuelle Java:
- 2 Go - pour les projets de taille moyenne («-Xmx2g»)
- 4Gb - pour les grands projets ('-Xmx4g')
- Sur les périphériques non rootés, le passage du noyau en «mode permissif» améliore parfois la situation.
- Exécutez la commande 'adb shell setenforce 0'
Spécificités de l'unité
- Le thread principal Unity s'appelle UnityMain, mais vous pouvez voir beaucoup d'UnityMain lors du profilage. Ce sont des threads utilisateur que vous créez dans le code C #. Par défaut, ils obtiennent le même nom. Le thread principal d'Unity est généralement facile à distinguer, car il sera le plus chargé.
- Le flux graphique est appelé UnityGfxWorkerW
- Les threads du système Unity Job sont appelés Thread Worker.
- Malheureusement, certaines fonctions d'attente qu'Unity utilise (futex-s), Android Studio affiche et considère non pas comme un temps d'attente, mais comme une activité.
- Lorsque vous regardez le graphique des appels dans la vue descendante, vous devez passer par plusieurs niveaux avec un appel Java, malheureusement vous ne pouvez pas le filtrer dans Android Studio.

Appareils recommandés
Nous avons utilisé les appareils suivants pour les expériences:
- Samsung Galaxy S8
- Google Pixel 2XL
- Pixel Google
- Sony Xperia XA1
- Huawei Honor 7
- Huawei Nexus 6P
- Moto G5P
- Asus Nexus 7 (2013)
Tous les appareils ont été installés, pour Huawei Nexus 6P, nous avons assemblé le cœur et l'
AOSP . En conséquence, Google et Sony se sont avérés être les plus faciles et les plus faciles à travailler. Sony a un excellent site pour les développeurs -
Open Devices . Huawei ne vous permet plus de déverrouiller facilement des appareils, Samsung cause des difficultés constantes avec des niveaux de protection supplémentaires. Le Moto G5P a souvent bloqué le processus de collecte de données du profileur (simpleperf).