JankStats wird Alpha. Bibliothek für echte Mülljagd… | von Chet Haase | Android-Entwickler Februar 2022

Illustration von Virginia Poltrack

Eine Bibliothek, die Janko in der realen Welt verfolgt

Das Debuggen der Leistung ist … schwierig. Es ist oft nicht klar, wo man anfangen soll, welche Tools zu verwenden sind, welche Probleme Benutzer haben oder wie sich diese Probleme auf realen Geräten manifestieren.

Das Android-Team hat in den letzten Jahren mehr Debugging-Tools für verschiedene Teile des Problems bereitgestellt, angefangen bei der Analyse Startleistung beim Testen bestimmte Codepfade insbesondere auf das Testen und Optimieren Anwendungsfälle zu visuelle Profiler in der IDE. All dies dient zum Testen der Entwicklungszeit, um Ihnen bei der Fehlerbehebung und Behebung von Problemen zu helfen, die Sie lokal sehen.

Inzwischen sind beide Google Play Android-Vitals ich Firebase Bieten Sie Dashboards an, in denen Entwickler sehen können, wie ihre Apps auf Benutzergeräten im Feld funktionieren.

Es ist jedoch schwierig zu wissen, wie Sie Probleme finden können, die Ihre Anwendung in realen Situationen haben kann, insbesondere Probleme, die auf Benutzergeräten auftreten, und nicht nur Situationen, die Sie auf dieser praktischen Entwicklungsmaschine sehen, die Sie bequem von Ihrem Stuhl aus verwenden. Leistungssteuerungsfelder sind hilfreich, bieten jedoch nicht unbedingt die Detailgenauigkeit, die Sie benötigen, um zu wissen, was passiert ist, wenn Ihre Benutzer Probleme hatten.

Eingeben JankStats: Die erste AndroidX-Bibliothek, die speziell für die Instrumentierung und Meldung von Leistungsproblemen Ihrer App auf Benutzergeräten entwickelt wurde.

JankStats ist eine relativ kleine API mit im Wesentlichen drei Zielen: Erfassen von Leistungsinformationen pro Frame, Ausführen Ihrer Anwendung auf Benutzergeräten (nicht nur Entwicklungsgeräten) und Aktivieren von Instrumentierung und Berichten darüber, was in Ihrer Anwendung passiert, wenn es Leistungsprobleme gibt.

Die Android-Plattform bietet bereits Möglichkeiten, Frame-Performance-Daten abzurufen. Beispielsweise können Sie FrameMetrics ab API 24 verwenden, und wir haben es in neueren Versionen hinzugefügt, um noch mehr Informationen bereitzustellen. Wenn Sie frühere Versionen verwenden, gibt es verschiedene Ansätze, um weniger genaue, aber dennoch nützliche Wetterinformationen zu erhalten.

Wenn Sie also möchten, dass Ihre eigene Frame-Dauer-Logik in allen Editionen funktioniert, müssen Sie diese verschiedenen Mechanismen in allen Versionen der API implementieren. Oder Sie können die einzigartige JankStats-API verwenden, die für Sie funktioniert … zusätzlich zu den zusätzlichen Funktionen oben (lesen Sie weiter!).

JankStats vereinfacht dies, indem es eine einzelne Bildraten-Berichts-API bereitstellt und geeignete Mechanismen intern delegiert (FrameMetrics auf API 24+ usw.). Sie müssen sich keine Gedanken darüber machen, woher diese Informationen stammen, Sie können JankStats einfach fragen, wie lange es gedauert hat, und Sie erhalten Rückrufe mit diesen Informationen.

Das Erstellen und Anhören von JankStats-Daten ist im Grunde so einfach: Sie erstellen sie, und dann lehnen Sie sich zurück (okay, Ihr Code entspannt sich) und hören zu. Hier sind Beispiele für diese Schritte aus dem JankStats-Beispiel, JankLoggingActivity:

val jankFrameListener = JankStats.OnFrameListener { frameData ->
// real app would do something more interesting than log this...
Log.v("JankStatsSample", frameData.toString())
}
jankStats = JankStats.createAndTrack(
window,
Dispatchers.Default.asExecutor(),
jankFrameListener,
)

Im Gegensatz zu neueren Benchmarking-Bibliotheken wurde JankStats erstellt, um Ergebnisse von Benutzergeräten bereitzustellen. Es ist großartig, Fehler auf Ihrem Entwicklungscomputer zu beheben, aber es hilft nicht in Situationen, in denen Ihre Anwendung von echten Menschen in der realen Welt auf sehr unterschiedlichen Geräten und unter sehr unterschiedlichen Einschränkungen verwendet wird.

JankStats bietet eine API zum Instrumentieren Ihrer Anwendung, um die benötigten Leistungsdaten bereitzustellen, und einen Berichtsmechanismus, damit Sie diese Daten hochladen und offline analysieren können.

Schließlich (hören Sie: Das ist eine wirklich neue Sache mit dieser Bibliothek) bietet JankStats eine Möglichkeit zu verstehen, was wirklich in Ihrer App vor sich ging, als Leistungsprobleme auftraten. Die Beschwerde, die wir oft gehört haben, ist, dass vorhandene Tools, Dashboards und Ansätze Ihnen nicht genug geben Kontext für Leistungsprobleme, die Ihre Benutzer möglicherweise sehen.

Beispielsweise kann Ihnen die FrameMetrics-API (eingeführt in API 24 und intern in JankStats verwendet) mitteilen, wie lange es dauert, Frames zu zeichnen, aus denen Sie Informationen über den Ruck extrahieren können. Aber es kann Ihnen nicht sagen, was damals in Ihrer Bewerbung vor sich ging. Dieses Problem müssen Sie verstehen, wenn Sie versuchen, Ihren Code zu instrumentieren und in FrameMetrics oder andere Tools zur Leistungsmessung zu integrieren. Aber jeder hat genug zu tun, ohne dass diese Art von Infrastruktur intern aufgebaut werden muss, sodass der Ruck in der Regel ungemessen bleibt und die Performance-Probleme weiterhin bestehen.

In ähnlicher Weise kann Ihnen das Android Vitals-Dashboard mitteilen, dass Ihre App Leistungsprobleme hat, aber es kann Ihnen nicht sagen, was Ihre App tat, als diese Probleme auftraten. Es ist also schwer zu wissen, was man mit diesen Informationen anfangen soll.

JankStats präsentiert PerformanceMetricsState API, ein einfacher Satz von Methoden, mit denen Sie dem System jederzeit paarweise mitteilen können, was in Ihrer Anwendung passiert StringS. Beispielsweise möchten Sie möglicherweise aufzeichnen, wenn dies angegeben ist Activity oder Fragment aktiv sind, oder wenn a RecyclerView blättert.

Hier ist beispielsweise der Code aus dem JankStats-Beispiel, der zeigt, wie RecyclerView angewiesen wird, JankStats diese Informationen bereitzustellen:

val scrollListener = object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView,
newState: Int)
{
val metricsState = metricsStateHolder?.state ?: return
when (newState) {
RecyclerView.SCROLL_STATE_DRAGGING -> {
metricsState.addState("RecyclerView", "Dragging")
}
RecyclerView.SCROLL_STATE_SETTLING -> {
metricsState.addState("RecyclerView", "Settling")
}
else -> {
metricsState.removeState("RecyclerView")
}
}
}
}

Dieser Status kann von überall in Ihre Anwendung eingefügt werden (oder sogar aus einer anderen Bibliothek), und JankStats nimmt ihn auf, wenn Ergebnisse gemeldet werden. Auf diese Weise erfahren Sie, wenn Sie Berichte von JankStats erhalten, nicht nur, wie lange die Dinge in jedem Frame gedauert haben, sondern auch, was der Benutzer während dieses Frames getan hat, was ein beitragender Faktor sein könnte.

Hier sind einige Ressourcen, um mehr über JankStats zu erfahren:

AndroidX-Projekt: JankStats ist dabei androidx.metrics-Bibliothek in AndroidX.

Dokumente: Unsere Website für Entwickler hat eine neue Entwicklerleitfaden die beschreibt, wie man JankStats benutzt.

Codebeispiel: Dies Projekt enthält Beispiele, die zeigen, wie JankStats-Objekte instanziiert und überwacht werden, zusammen mit der Instrumentierung Ihrer Anwendung mit wichtigen UI-Statusinformationen:

Fehler, Fehler, Fehler: Wenn Sie irgendwelche Probleme mit der Bibliothek haben oder API-Anforderungen haben, bitte einen Fehler melden.

JankStats hat gerade seine erste Alpha-Version veröffentlicht, was bedeutet: „Wir denken, dass dies eine API und Funktionalität ist, die für 1.0 sinnvoll sind, aber bitte versuchen Sie es und lassen Sie es uns wissen.“

Es gibt andere Dinge, die wir in Zukunft gerne mit JankStats machen würden, darunter das Hinzufügen einer Art Aggregationsmechanismus oder sogar die Synchronisierung mit bestehenden Upload-Diensten. Aber wir wollten diese erste Version mit grundlegenden Installationen veröffentlichen, um zu sehen, wie Sie sie verwenden und was Sie sonst noch sehen möchten. Wir hoffen, dass es in seinem jetzigen Grundzustand nützlich sein wird; allein die Möglichkeit, Statusinformationen der Benutzeroberfläche einfach zu instrumentieren und dann aufzuzeichnen, sollte besser sein, als … diese Fähigkeit nicht zu haben.

So herunterladen das, damit spielen, und lassen Sie uns wissen, wenn Sie irgendwelche Probleme haben. Und am wichtigsten; Finden und beheben Sie diese Leistungsprobleme! Ihre Kunden warten auf Sie – lassen Sie sie nicht zu lange warten!