Profil d'un projet Unity avec Android Studio

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


image

  • 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


image

  • 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.
image

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.

image

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

image

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.

image

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.

image

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

image

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.

image

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).

Source: https://habr.com/ru/post/fr437602/


All Articles