Profilieren Sie ein Unity-Projekt mit Android Studio

Guten Tag an alle! In diesem Artikel erfahren Sie, wie Sie Unity-Spiele auf Android mit Android Studio profilieren. Ich werde darüber sprechen, wie Sie Android Studio konfigurieren und die maximale Datenmenge erhalten. Fragen der Analyse und Schlussfolgerungen, die auf dem Ergebnis basieren, fallen nicht in den Geltungsbereich dieses Artikels.

Anforderungen


Um die Anwendung vollständig zu profilieren, benötigen Sie ein Telefon mit Android 8 oder höher (API 27). Erfahrungsgemäß ist die Profilerstellung mit älteren Android-Versionen eher abenteuerlich als gut. Aus diesem Grund empfehle ich, eine vollständige Reihe von Nexus-Geräten zu erwerben, da diese über alte Hardware und die neuesten Android-Updates verfügen.

Einrichten eines Unity-Projekts


Um das Ergebnis zu erhalten, müssen Sie das Unity-Projekt auf eine bestimmte Weise konfigurieren.

Einstellungen in den Build-Einstellungen


Bild

  • Zunächst sollten Sie das Build-System auf "Gradle" stellen und das Kontrollkästchen neben "Projekt exportieren" aktivieren . So erhalten wir ein fertiges Android Studio-Projekt, das wir weiterhin profilieren werden. Das Profilieren einer fertigen APK ist ebenfalls möglich, jedoch eingeschränkter und erfordert mehr Vorbereitung.
  • Es ist ratsam, den Modus "Development Build" zu deaktivieren, da die resultierenden Timings im Profiler so nah wie möglich an den tatsächlichen liegen.

Einstellungen in den Player-Einstellungen


Bild

  • Installieren Sie das Scripting Backend in IL2CPP . Wenn Sie Mono verlassen, werden bei der nativen Profilerstellung viele Mono-Funktionen angezeigt, ohne Informationen darüber, wie sie sich auf C # -Code beziehen.
  • Die Option 'C ++ Compiler Configuration' für Android hat keine Auswirkung (in Unity 2018.3). Sie können es in 'Release' einfügen. In zukünftigen Versionen der Unity Android-Toolchain wirkt sich diese Einstellung möglicherweise auf die Compilereinstellungen aus.
  • Es ist ratsam, die 'Zielarchitektur' auf ARMv7 zu beschränken . So sparen Sie Kompilierungszeit und erleben, dass viele Architekturen Android Studio manchmal in einen Stupor versetzen.
  • Es lohnt sich auch, eine Reihe zusätzlicher Einstellungen vorzunehmen:
    • Installationsort - 'Externe externe'
    • Internetzugang - 'Erforderlich'
    • Schreibberechtigung - 'Extern (SDCard)'

    Android Studio und andere Profiler verwenden simpleperf zum Sammeln von Statistiken und benötigen Zugriff auf eine Speicherkarte, um temporäre Dateien aufzuzeichnen.

Gradle-Projekt vorbereiten


Nachdem Sie alle Einstellungen installiert haben, erstellen Sie ein Unity-Projekt. Sie sollten einen Ordner mit dem Gradle-Projekt erhalten.
Bild

Unity erstellt standardmäßig ein Projekt, sodass Sie die endgültige APK daraus erstellen möchten. Daher wurden alle Debugging-Informationen daraus gelöscht, aber zum Glück können sie zurückgegeben werden. Dazu müssen Sie libil2cpp.so und libunity.so durch die Version mit Debugging-Informationen ersetzen.

libil2cpp.so


Dies ist eine Datei, die den gesamten C ++ - Code enthält, den IL2CPP aus Ihrem C # -Code generiert hat. Unity generiert alle für die Profilerstellung erforderlichen Informationen. Um die Größe der APK zu optimieren, werden sie jedoch während des Erstellungsprozesses abgeschnitten. Um es zurückzugeben:
  • Gehen Sie zu Ihrem Projektordner
  • Suchen Sie den darin enthaltenen Unterordner Temp und wechseln Sie zum Unterordner Temp / StagingArea / symbole / armeabi-v7a
  • Suchen Sie darin nach 'libil2cpp.so.debug' . Dies ist die Version von 'libil2cpp.so' mit Debugging-Informationen.
  • Gehen Sie nun zum Gradle-Projekt und suchen Sie darin den Ordner '\ src \ main \ jniLibs \ armeabi-v7a'
  • Ersetzen Sie 'libil2cpp.so' durch die Datei 'libil2cpp.so.debug'.

libunity.so


Dies ist die Datei, die den untergeordneten Teil von Unity Player enthält. Da wir Release-Builds durchführen, hat Unity eine Datei in Ihr Projekt eingefügt, ohne Informationen zu debuggen. Sie müssen libunity.so durch eine Zeichendatei ersetzen.

  • Wechseln Sie zu dem Ordner, in dem Sie Unity installiert haben
  • Wechseln Sie in den Ordner "\ Data \ PlaybackEngines \ AndroidPlayer \ Variations \ il2cpp \ Development \ Libs \ armeabi-v7a \".
  • Nehmen Sie die Datei libunity.so von dort und ersetzen Sie die Datei in Ihrem Projekt, die sich im Ordner '\ src \ main \ jniLibs \ armeabi-v7a' befindet.

Profilerstellung


Jetzt können Sie die Profilerstellung in Android Studio starten. Klicken Sie einfach auf die Schaltfläche Profiler starten.

Bild

Android Studio startet die Anwendung und die Profilerstellungssitzung beginnt

Bild

Standardmäßig zeigt Android Studio Grafiken an, zeigt jedoch keine Beispieldaten an. Um den Prozess zu starten, müssen Sie auf die CPU-Spur klicken, damit der Profiler in die CPU-Ansicht wechselt. In diesem Fall werden oben im Fenster ein Dropdown-Menü und die Schaltfläche "Aufzeichnen" angezeigt.

Bild

Wählen Sie Sampled 'Native' (In Android Studio 3.3 - C / C ++ Native) und klicken Sie auf die Schaltfläche 'Record'.
Da die Aufzeichnung auf der Festplatte des Geräts erfolgt, sollten Sie aus Erfahrung nicht länger als 5 bis 8 Sekunden aufzeichnen. Viele Geräte schlagen auch bei einer geringeren Datenmenge fehl (siehe Liste der getesteten Geräte am Ende des Artikels).

Um das Ergebnis zu erhalten, klicken Sie auf "Stopp" und dann auf ein rotes Quadrat, um die Sitzung zu unterbrechen. Es ist schwierig, die Idee der Autoren zu verstehen, aber wenn Sie die Aufzeichnung nicht vollständig stoppen, beginnt der Profiler nicht immer mit der Analyse der empfangenen Daten, und Ihr Segment mit den Daten wird weit entfernt sein.

Bild

Danach bleibt nur noch ein wenig zu warten, nach 30-50 Sekunden gibt Ihnen der Profiler das Ergebnis. Wenn alles richtig eingerichtet ist, werden Sie mit allen Funktionsnamen erfasst

Bild

Bekannte Funktionen


  • Die stabilsten Ergebnisse können auf Root-Geräten erzielt werden
  • Verwenden Sie Samsung nicht, und es gibt viele Schutzmaßnahmen, die das Debuggen beeinträchtigen
  • An vielen Stellen wird Ihr Sammelstapel Funktionen der Form 'kernel.kptr + address' annehmen. Dies sind Aufrufe innerhalb des Android-Kernels, die aufgrund von Sicherheitsrichtlinien geschützt sind. Auf einem gerooteten Gerät kann der Schutz deaktiviert werden:
    • Führen Sie die `adb shell` aus
    • Führen Sie `su` aus, um Root-Berechtigungen zu erhalten
    • Führen Sie 'sysctl -w kernel.kptr_restrict = 0' aus - dies entfernt den Schutz vom Kernel
    • [!] Führen Sie nach Abschluss des Debuggens 'sysctl -w kernel.kptr_restrict = 1' aus. Einige Geräte können das Betriebssystem sonst beim Neustart nicht starten. In vielen Fällen wird es nur durch Flashen eines sauberen Kerns behandelt.
  • Wenn Android Studio häufig abstürzt, können Sie versuchen, den Heap von Java VM zu erhöhen:
    • 2 GB - für mittelgroße Projekte ('-Xmx2g')
    • 4 GB - für große Projekte ('-Xmx4g')
  • Auf Geräten ohne Rootberechtigung verbessert sich manchmal die Situation, wenn der Kernel in den zulässigen Modus geschaltet wird.
    • Führen Sie den Befehl 'adb shell setenforce 0' aus.

Besonderheiten der Einheit


  • Der Haupt-Unity-Thread heißt UnityMain, aber Sie können beim Erstellen von Profilen viel UnityMain sehen. Dies sind Benutzer-Threads, die Sie in C # -Code erstellen. Standardmäßig erhalten sie den gleichen Namen. Der Haupt-Thread von Unity ist normalerweise leicht zu unterscheiden, da er am meisten geladen ist.
  • Der Grafik-Stream heißt UnityGfxWorkerW
  • Unity Job-Systemthreads werden als Worker-Thread bezeichnet.
  • Leider zeigt und betrachtet Android Studio einige von Unity verwendete Wartefunktionen (Futex-s) nicht als Wartezeit, sondern als Aktivität.
  • Wenn Sie sich das Anrufdiagramm in der Ansicht von oben nach unten ansehen, müssen Sie mit einem Java-Aufruf viele Ebenen durchlaufen. Leider können Sie es in Android Studio nicht filtern.

Bild

Empfohlene Geräte


Wir haben die folgenden Geräte für Experimente verwendet:
  • Samsung Galaxy S8
  • Google Pixel 2XL
  • Google Pixel
  • Sony Xperia XA1
  • Huawei Honor 7
  • Huawei Nexus 6P
  • Moto G5P
  • Asus Nexus 7 (2013)

Alle Geräte wurden installiert, für Huawei Nexus 6P haben wir den Kern und AOSP zusammengebaut . Infolgedessen erwiesen sich Google und Sony als die störungsfreiesten und am einfachsten zu handhabenden. Sony hat eine großartige Website für Entwickler - Open Devices . Mit Huawei können Sie Geräte nicht mehr auf einfache Weise entsperren. Samsung verursacht ständig Schwierigkeiten mit zusätzlichen Schutzstufen. Das Moto G5P hat den Profiler-Datenerfassungsprozess (simpleperf) häufig zum Absturz gebracht.

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


All Articles