Leistungs- und Ansichtshierarchien

Die Art und Weise, wie Sie die Hierarchie Ihrer View Objekte können sich erheblich auf die Leistung Ihrer App zu verbessern. Auf dieser Seite wird beschrieben, wie Sie beurteilen können, ob sich Ihre Ansichtshierarchie verlangsamt. Ihre App lahmlegen, und Sie zeigen Ihnen Strategien zur Behebung möglicher Probleme.

Auf dieser Seite geht es um die Verbesserung von View-basierten Layouts. Weitere Informationen zum Leistung von Jetpack Compose, siehe Jetpack Compose Leistung.

Layout und Leistung messen

Die Rendering-Pipeline umfasst eine Layout-and-measure-Phase, in der das System und positioniert die relevanten Elemente in Ihrer Ansichtshierarchie entsprechend. Der Teil measure dieses Artikels bestimmt die Größe und Begrenzungen der View-Objekte. Der Teil Layout legt die Position der View-Objekte auf dem Bildschirm fest.

Für beide Pipelinephasen fallen geringe Kosten pro Ansicht oder Layout an. Die meisten sind diese Kosten minimal und wirken sich nicht spürbar auf die Leistung aus. Es kann jedoch auch größer sein, Wenn eine App View-Objekte hinzufügt oder entfernt, z. B. wenn ein RecyclerView -Objekt sie wiederverwenden oder wiederverwenden. Die Kosten können auch höher sein, wenn ein View-Objekt die erforderliche die Größenanpassung so konzipiert, dass sie ihre Einschränkungen erfüllt. Wenn Ihre App beispielsweise SetText() Bei einem View-Objekt mit einem Textumbruch muss möglicherweise die Größe von View angepasst werden.

Wenn solche Fälle zu lange dauern, können sie verhindern, dass ein Frame innerhalb der zulässigen 16 ms, wodurch die Frames verfälscht werden und die Animation ruckelig wird.

Da Sie diese Vorgänge nicht in einen Worker-Thread verschieben können, müssen sie von Ihrer Anwendung verarbeitet werden auf Haupt-Thread – am besten ist es, sie so zu optimieren, dass sie so wenig Zeit wie möglich in Anspruch nehmen.

Komplexe Layouts verwalten

Mit Layouts in Android können Sie UI-Objekte in Ansichtshierarchie. Diese Verschachtelung kann außerdem Layoutkosten verursachen. Wenn Ihre App ein Objekt verarbeitet für das Layout führt die App denselben Prozess für alle untergeordneten Elemente des Layouts aus.

Bei einem komplizierten Layout entstehen manchmal Kosten nur bei der ersten Berechnung Layout. Das ist beispielsweise der Fall, wenn deine App ein komplexes Listenelement in einem RecyclerView wiederverwertet. -Objekt enthält, muss das System alle Objekte anordnen. In einem anderen Beispiel können geringfügige Änderungen die Kette in Richtung übergeordneter Elemente aus, bis sie ein Objekt erreichen, das sich nicht auf die Größe des das übergeordnete Element.

Ein häufiger Grund dafür, dass das Layout sehr lange dauert, sind Hierarchien von View-Objekten. die ineinander verschachtelt sind. Jedes verschachtelte Layoutobjekt erhöht die Kosten für die Layoutphase. Das Schmeichere desto schneller ist der Layoutprozess abgeschlossen.

Wir empfehlen die Verwendung des Layout-Editor, um ein ConstraintLayout statt RelativeLayout oder LinearLayout, wie es ist im Allgemeinen effizienter und reduziert das Verschachteln von Layouts. Für einfache Layouts, die erreicht werden, indem FrameLayout, wir empfehlen mit FrameLayout.

Wenn Sie die Klasse RelativeLayout verwenden, könnten Sie dasselbe schaffen. Auswirkungen bei geringeren Kosten, wenn Sie stattdessen verschachtelte, ungewichtete LinearLayout-Ansichten verwenden. Sie können jedoch wenn Sie verschachtelte, gewichtete LinearLayout-Ansichten verwenden, sind die Layoutkosten viel höher da hierfür mehrere Layout-Durchläufe erforderlich sind, wie im nächsten Abschnitt erläutert.

Wir empfehlen auch die Verwendung von RecyclerView anstelle von ListView, da dieses recyceln kann Layouts einzelner Listenelemente, was sowohl effizienter ist als auch das Scrollen verbessern kann die Leistung.

Doppelbesteuerung

In der Regel führt das Framework die Layout- oder Messungsphase in einem einzigen Durchlauf aus. Mit komplizierter Layout-Fälle kann es sein, dass das Framework mehrmals über Teile des Hierarchien, bei denen mehrere Durchgänge aufgelöst werden müssen, bevor schließlich die Elemente positioniert werden. Wenn Sie mehrere Layout- und Mess-Iterationen durchzuführen, wird als doppelte Besteuerung.

Wenn Sie beispielsweise den Container RelativeLayout verwenden, mit dem Sie View-Objekte in Bezug auf die Positionen anderer View-Objekte, das führt das Framework folgende Sequenz aus:

  1. Führt einen Layout- und Messwertdurchlauf aus, bei dem das Framework die Position und Größe basierend auf der Anfrage jedes untergeordneten Publishers an.
  2. Ermittelt anhand dieser Daten unter Berücksichtigung der Objektgewichte die richtige Position des korrelierte Ansichten.
  3. Führt einen zweiten Layoutdurchlauf aus, um die Positionen.
  4. Wechselt zur nächsten Phase des Rendering-Prozesses.

Je mehr Ebenen die Ansichtshierarchie hat, desto größer ist die Wahrscheinlichkeit, dass die Leistung beeinträchtigt wird.

Wie bereits erwähnt, ist ConstraintLayout im Allgemeinen effizienter als andere Layouts außer FrameLayout. Sie ist weniger anfällig für mehrere Layoutübergänge, dass Layouts nicht mehr verschachteln müssen.

Auch für andere Container als RelativeLayout kann sich die doppelte Besteuerung erhöhen. Für Beispiel:

  • Eine LinearLayout-Ansicht kann zu einem doppelten Layout und Messergebnis führen, wenn du horizontal. Eine doppelte Layout- und Messkarte kann auch bei einer vertikalen Ausrichtung auftreten, wenn Sie Hinzufügen measureWithLargestChild, In diesem Fall muss das Framework möglicherweise einen zweiten Durchlauf durchführen, um die richtige Größe Objekte.
  • Die GridLayout eine relative Positionierung ermöglicht, aber normalerweise eine doppelte Besteuerung durch Vorverarbeitung des die Positionsbeziehungen zwischen untergeordneten Ansichten. Werden für das Layout Gewichtungen oder Füllungen mit dem Klasse Gravity, der Vorteil von geht die Vorverarbeitung verloren und das Framework muss möglicherweise mehrere Durchläufe ausführen, ist RelativeLayout.

Mehrere Durchläufe für Layout und Messung beeinträchtigen nicht unbedingt die Leistung. Sie können jedoch wenn sie am falschen Ort sind. Seien Sie vorsichtig, wenn einer der folgenden Punkte zutrifft: Bedingungen für Ihren Container gelten:

  • Es ist ein Stammelement in Ihrer Ansichtshierarchie.
  • darunter eine tiefe Ansichtshierarchie.
  • Es wird oft auf dem Bildschirm angezeigt, ähnlich wie bei Kindern in einem ListView-Objekt.

Probleme mit der Ansichtshierarchie diagnostizieren

Die Layoutleistung ist ein komplexes Problem mit vielen Facetten. Die folgenden Tools können Ihnen dabei helfen, zu erkennen, wo Leistungsengpässe auftreten. Einige Tools liefern weniger endgültige Informationen kann aber hilfreiche Hinweise geben.

Logo: Perfetto

Perfetto ist ein Tool, das Daten zur Leistung liefert. Sie können Android-Traces in der Perfetto-Hilfe UI:

GPU-Rendering für Profil

Das Profil-GPU-Rendering auf dem Gerät das auf Geräten mit Android 6.0 (API-Level 23) und höher verfügbar ist, konkrete Informationen über Leistungsengpässe. Mit diesem Tool können Sie sehen, wie lange Layout- und Messphase für jedes Unternehmen des Rendering-Frames. Anhand dieser Daten können Sie Probleme mit der Laufzeitleistung diagnostizieren ermitteln, welche Layout- und Messprobleme Sie beheben müssen.

In der grafischen Darstellung der erfassten Daten verwendet das Profil-GPU-Rendering die Farbe Blau dargestellt, um die Layoutzeit darzustellen. Weitere Informationen zur Verwendung dieses Tools finden Sie unter GPU-Rendering-Geschwindigkeit im Profil

Fusseln

Mit dem Tool Lint von Android Studio können Sie sich ein Bild von Ineffizienzen in der Ansichtshierarchie auftreten. Wählen Sie zur Verwendung dieses Tools Analysieren > Code prüfen: wie in Abbildung 1 dargestellt.

<ph type="x-smartling-placeholder">
</ph>
Abbildung 1: Wählen Sie in Android Studio Code prüfen aus.

Informationen zu verschiedenen Layoutelementen finden Sie unter Android > Lint > Leistung: Wenn Sie weitere Details sehen möchten, klicken Sie auf die einzelnen Elemente, um sie zu maximieren. Weitere Informationen werden im Bereich auf der auf der rechten Seite des Bildschirms. Abbildung 2 zeigt ein Beispiel für erweiterte Informationen.

<ph type="x-smartling-placeholder">
</ph>
Abbildung 2: Informationen zu bestimmten Problemen mit dem Lint-Tool aufrufen identifiziert.

Wenn Sie auf ein Element klicken, werden die mit diesem Element verbundenen Probleme im Fenster rechts angezeigt.

Weitere Informationen zu bestimmten Themen und Problemen in diesem Bereich finden Sie in der Lint-Dokumentation.

Layout Inspector

Der Layout Inspector von Android Studio bietet eine visuelle Darstellung der Ansichtshierarchie Ihrer App. Es ist eine gute Möglichkeit, sich in der Hierarchie App mit einer klaren visuellen Darstellung der übergeordneten Kette einer bestimmten Ansicht und die von Ihrer App erstellten Layouts überprüfen.

Die Ansichten des Layout Inspectors können auch dabei helfen, Leistungsprobleme zu erkennen, Doppelbesteuerung. Sie können damit auch tiefe Verkettungen verschachtelter Layouts oder Layoutbereiche mit einer großen Anzahl verschachtelter untergeordneter Elemente, was zu Leistungskosten führen kann. In In diesen Fällen können die Phasen Layout und Messung kostspielig sein und zu Leistungsproblemen führen.

Weitere Informationen finden Sie unter Layoutfehler beheben mit Layout Inspector und Layout Validation.

Probleme mit der Ansichtshierarchie beheben

Das grundlegende Konzept der Lösung von Leistungsproblemen, die sich aus Ansichtshierarchien ergeben, kann in der Praxis schwierig sein. Wenn Sie verhindern möchten, dass Ansichtshierarchien Leistungseinbußen verhängen, Ihre Ansichtshierarchie zu vereinfachen und Doppelbesteuerung zu reduzieren. In diesem Abschnitt werden Strategien um diese Ziele zu erreichen.

Redundante verschachtelte Layouts entfernen

ConstraintLayout ist eine Jetpack-Bibliothek mit vielen verschiedenen Mechanismen zur Positionierung von Ansichten im Layout. Dies reduziert die Notwendigkeit, eine ConstaintLayout zu verschachteln, und kann dazu beitragen, die Ansicht zu vereinfachen. Hierarchie. In der Regel ist es einfacher, Hierarchien mit ConstraintLayout zu vereinfachen als im Vergleich zu anderen Layouttypen.

Entwickler verwenden oft mehr verschachtelte Layouts als nötig. Beispiel: RelativeLayout-Container kann ein einzelnes untergeordnetes Element enthalten, das auch ein RelativeLayout-Container. Diese Verschachtelung ist redundant und verursacht unnötige Kosten Hierarchieansicht. Lint kann dieses Problem für Sie melden und die Fehlerbehebungszeit verkürzen.

Zusammenführen oder Einbeziehen anwenden

Eine häufige Ursache für redundante verschachtelte Layouts sind <include> Tag. Sie können ein wiederverwendbares Layout beispielsweise so definieren:

<LinearLayout>
    <!-- some stuff here -->
</LinearLayout>

Dann können Sie ein <include>-Tag hinzufügen, um dem übergeordneten Element das folgende Element hinzuzufügen: Container:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/app_bg"
    android:gravity="center_horizontal">

    <include layout="@layout/titlebar"/>

    <TextView android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:text="@string/hello"
              android:padding="10dp" />

    ...

</LinearLayout>

Beim vorhergehenden include ist das erste Layout unnötigerweise im zweiten Layout verschachtelt.

Die <merge> Tag kann dieses Problem verhindern. Informationen zu diesem Tag finden Sie unter Die Funktion <merge> verwenden -Tag.

Ein günstigeres Layout verwenden

Möglicherweise können Sie Ihr vorhandenes Layoutschema nicht so anpassen, dass es redundante Layouts. In einigen Fällen besteht die einzige Lösung möglicherweise darin, Ihre Hierarchie zu vereinfachen, indem Sie zu einen ganz anderen Layouttyp.

Vielleicht stellen Sie fest, dass TableLayout bietet dieselben ein komplexeres Layout mit vielen Positionsabhängigkeiten. Die Jetpack-Bibliothek ConstraintLayout bietet ähnliche Funktionen wie RelativeLayout sowie weitere Funktionen zum Erstellen und effizientere Layouts.