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:
- Führt einen Layout- und Messwertdurchlauf aus, bei dem das Framework die Position und Größe basierend auf der Anfrage jedes untergeordneten Publishers an.
- Ermittelt anhand dieser Daten unter Berücksichtigung der Objektgewichte die richtige Position des korrelierte Ansichten.
- Führt einen zweiten Layoutdurchlauf aus, um die Positionen.
- 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ügenmeasureWithLargestChild
, 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 KlasseGravity
, der Vorteil von geht die Vorverarbeitung verloren und das Framework muss möglicherweise mehrere Durchläufe ausführen, istRelativeLayout
.
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">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">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.