Home / Android-Entwicklung / Verbessern Sie die App-Leistung mit ART, indem Sie Profile in der Cloud optimieren

Verbessern Sie die App-Leistung mit ART, indem Sie Profile in der Cloud optimieren

Gepostet von Calin Juravle, Software Engineer

In Android Pie haben wir ART-Optimierungsprofile in Play Cloud gestartet, eine neue Optimierungsfunktion, die die Startzeit der Anwendung nach einer Neuinstallation oder Aktualisierung erheblich verbessert. Im Durchschnitt haben wir festgestellt, dass Apps auf einer Vielzahl von Geräten 15% schneller gestartet werden (Kaltstart). Einige Heldenfälle zeigen sogar 30% + schnellere Startzeiten. Einer der wichtigsten Aspekte ist, dass Benutzer dies kostenlos erhalten, ohne dass sie oder Entwickler sich darum bemühen müssen!

Quelle: Google-interne Daten

ART-Optimierung von Profilen in Play Cloud

Die Funktion baut auf früheren Arbeiten zur profilgeführten Optimierung (Profile Guided Optimization, PGO) auf, die in Android 7.0 Nougat eingeführt wurden. Mit PGO kann die Android Runtime die Leistung einer App verbessern, indem ein Profil des wichtigsten Hotcodes der App erstellt und die Optimierungsanstrengungen darauf konzentriert werden. Dies führt zu großen Verbesserungen und verringert gleichzeitig die Auswirkungen einer vollständig kompilierten App auf den Speicher. Es hängt jedoch davon ab, dass das Gerät Apps basierend auf diesen Codeprofilen im Wartungsmodus im Leerlauf optimiert. Dies bedeutet, dass es einige Tage dauern kann, bis ein Benutzer die Vorteile erkennt – etwas, das wir verbessern wollten.

Quelle: Google-interne Daten

Die ART-Optimierung von Profilen in der Play Cloud nutzt die Leistung von Android Play, um alle PGO-Vorteile bei der Installation / Aktualisierung zu erzielen: Die meisten Benutzer können eine hervorragende Leistung erzielen, ohne zu warten!

Die Idee beruht auf zwei wesentlichen Beobachtungen:

  1. Apps haben normalerweise viele häufig verwendete Codepfade (Hot Code) zwischen einer Vielzahl von Benutzern und Geräten, z. Klassen, die während des Startvorgangs oder bei kritischen Benutzerpfaden verwendet werden. Dies kann häufig durch Aggregation einiger hundert Datenpunkte festgestellt werden.
  2. App-Entwickler führen ihre Apps häufig schrittweise ein, beginnend mit Alpha / Beta-Kanälen, bevor sie sich einem breiteren Publikum zuwenden. Auch wenn es keine Alpha / Beta-Gruppe gibt, kommt es häufig zu einem Hochlauf der Benutzer auf eine neue Version einer App.

Dies bedeutet, dass wir den anfänglichen Rollout einer App verwenden können, um die Leistung für den Rest der Benutzer zu steigern. ART analysiert, welcher Teil des Anwendungscodes es wert ist, auf den ersten Geräten optimiert zu werden, und lädt dann die Daten in Play Cloud hoch, wodurch ein kernaggregiertes Codeprofil erstellt wird (das Informationen enthält, die für alle Geräte relevant sind). Sobald genügend Informationen vorliegen, wird das Codeprofil veröffentlicht und zusammen mit den APKs der App installiert.

Auf einem Gerät fungiert das Codeprofil als Startwert und ermöglicht eine effiziente profilgesteuerte Optimierung zum Zeitpunkt der Installation. Diese Optimierungen tragen zur Verbesserung der Kaltstartzeit und der Leistung im eingeschwungenen Zustand bei, ohne dass ein App-Entwickler eine einzige Codezeile schreiben muss.

Schritt 1: Erstellen des Code-Profils

Eines der Hauptziele besteht darin, aus aggregierten und anonymisierten Daten so schnell wie möglich ein stabiles Code-Profil zu erstellen (um die Anzahl der Benutzer zu maximieren, die davon profitieren können) Stellen Sie außerdem sicher, dass wir über genügend Daten verfügen, um die Leistung einer App genau zu optimieren. Das Abtasten zu vieler Daten beansprucht bei der Installation mehr Bandbreite und Zeit. Je länger die Erstellung des Code-Profils dauert, desto weniger Benutzer profitieren von den Vorteilen. Wenn zu wenig Daten abgetastet werden und das Code-Profil nicht genügend Informationen enthält, was zu optimieren ist, um einen Unterschied zu bewirken.

Das Ergebnis der Aggregation ist ein sogenanntes Kerncodeprofil, das nur anonyme Daten über den Code enthält, die häufig in einer zufälligen Stichprobe von Sitzungen pro Gerät angezeigt werden. Wir entfernen Ausreißer, um sicherzustellen, dass wir uns auf den Code konzentrieren, der für die meisten Benutzer von Bedeutung ist.

Experimente haben gezeigt, dass die am häufigsten verwendeten Codepfade in kurzer Zeit sehr schnell berechnet werden können. Dies bedeutet, dass wir in der Lage sind, schnell genug ein Codeprofil zu erstellen, von dem die Mehrheit der Benutzer profitieren wird.

* Aus Google Apps gemittelte Daten, Quelle: interne Google-Daten

Schritt 2: Installieren des Codeprofils

In Android 9.0 Pie haben wir einen neuen Typ von Installationsartefakten eingeführt: Dex-Metadatendateien. Ähnlich wie bei den APKs handelt es sich bei den Dex-Metadatendateien um reguläre Archive, die Daten darüber enthalten, wie die APK optimiert werden sollte – wie die in der Cloud erstellten Kerncodeprofile. Ein wesentlicher Unterschied besteht darin, dass die Dex-Metadaten ausschließlich von der Plattform und den App Stores verwaltet werden und für Entwickler nicht direkt sichtbar sind.

Es gibt auch eine integrierte Unterstützung für App Bundles / Google Play Dynamic Delivery: Ohne Eingreifen des Entwicklers werden alle Funktionssplits der App optimiert.

Schritt 3: Verwenden der Codeprofile zur Optimierung der Leistung

Um zu verstehen, wie diese Codeprofile eine bessere Leistung erzielen, müssen Sie ihre Struktur untersuchen. Code-Profile enthalten Informationen zu:

  • Klassen wurden beim Start geladen
  • Heiße Methoden, die die Laufzeit für optimierungswürdig erachtete
  • Das Layout des Codes (z. B. Code, der während des Starts oder nach dem Start ausgeführt wird)

Mit diesen Informationen verwenden wir eine Vielzahl von Optimierungstechniken, von denen die folgenden drei die meisten Vorteile bieten:

  • App-Bilder: Mit den Startklassen wird ein vorab ausgefüllter Heap erstellt, in dem die Klassen vorinitialisiert sind (als App-Bild bezeichnet). Wenn die Anwendung gestartet wird, ordnen wir das Image direkt dem Speicher zu, sodass alle Startklassen sofort verfügbar sind.
    • Der Vorteil hierbei ist, dass die Ausführung der App Zyklen spart, da sie die Arbeit nicht erneut ausführen muss, was zu einer schnelleren Startzeit führt.
  • Code-Vorkompilierung: Wir kompilieren den gesamten Hot-Code vor. Wenn die Apps ausgeführt werden, sind die wichtigsten Teile des Codes bereits optimiert und können nativ ausgeführt werden. Die App muss nicht mehr auf den JIT-Compiler warten.
    • Der Vorteil besteht darin, dass der Code als sauberer Speicher abgebildet wird (im Vergleich zum JIT-Dirty-Speicher), wodurch die Gesamtspeichereffizienz verbessert wird. Der saubere Speicher kann vom Kernel freigegeben werden, wenn er unter Speicherdruck steht, während der verschmutzte Speicher dies nicht kann. Dies verringert die Wahrscheinlichkeit, dass der Kernel die App beendet.
  • Effizienteres Dex-Layout: Wir reorganisieren den Dex-Bytecode basierend auf Methodeninformationen, die das Profil verfügbar macht. Das Dex-Bytecode-Layout sieht wie folgt aus: [startup code, post startup code, the rest of non profiled code] .
    • Dies hat den Vorteil, dass der Dex-Bytecode wesentlich effizienter in den Speicher geladen wird: Die Speicherseiten sind besser belegt, und da alles zusammen passt, müssen wir weniger laden und können weniger E / A-Vorgänge ausführen.

Verbesserungen und Beobachtungen

Ende letzten Jahres haben wir Profile in der Cloud für alle Apps im Playstore eingeführt.

  • Mehr als 30.000 Apps haben Verbesserungen gezeigt
  • Im Durchschnitt ist der Kaltstart auf einer Vielzahl von Geräten um 15% schneller
    • mit vielen Top-Apps, die 20% + (z. B. Youtube) oder sogar 30% (z. B. Google-Suche) auf ausgewählten Geräten erhalten.
  • Über 90% der App-Installationen auf Android Pie erhalten Profile
  • Geringe Verlängerung der Installationszeit für die zusätzliche Optimierung
  • Verfügbar für alle Pie-Geräte.

Eine sehr interessante Beobachtung ist, dass ART im Durchschnitt etwa 20% der Anwendungsmethoden abbildet (sogar weniger, wenn wir die tatsächliche Größe des Codes berücksichtigen). Bei einigen Apps deckt das Profil nur 2% des Codes ab, bei einigen steigt die Anzahl auf 60%.

Quelle: Google-interne Daten

Warum ist das eine wichtige Beobachtung? Dies bedeutet, dass die Laufzeitumgebung nicht viel vom Anwendungscode gesehen hat und daher nicht in die Optimierung des Codes investiert. Es gibt zwar viele gültige Anwendungsfälle, in denen der Code nicht ausgeführt wird (z. B. Fehlerbehandlung oder Abwärtskompatibilitätscode), dies kann jedoch auch an nicht verwendeten Funktionen oder unnötigem Code liegen. Die Versatzverteilung ist ein starkes Signal dafür, dass letztere eine wichtige Rolle bei weiteren Optimierungen spielen könnte (z. B. Verringern der APK-Größe durch Entfernen von nicht benötigtem Dex-Bytecode).

Zukünftige Entwicklung

Wir freuen uns über die Verbesserungen, die ART-Optimierungsprofile gezeigt haben, und werden dieses Konzept in Zukunft weiter ausbauen. Durch das Erstellen eines Codeprofils pro App ergeben sich Möglichkeiten für noch mehr Anwendungsverbesserungen. Daten können von Entwicklern verwendet werden, um die App zu verbessern, je nachdem, was für ihre Endbenutzer relevant und wichtig ist. Mithilfe der in Profilen gesammelten Informationen kann der Code für eine bessere Effizienz neu organisiert oder gekürzt werden. Entwickler können möglicherweise App Bundles verwenden, um ihre Funktionen nach Verwendungszweck aufzuteilen und unnötigen Code nicht an ihre Benutzer zu senden. Wir haben bereits große Verbesserungen bei der Startzeit von Apps festgestellt und hoffen, dass Profile weitere Vorteile bringen, die das Leben von Entwicklern erleichtern und unseren Benutzern eine bessere Benutzererfahrung bieten.

About AndroidWeltEditor

Check Also

lift off with Jetpack Compose

Posted by The Jetpack Compose Team Jetpack Compose is Android’s modern toolkit for building native …

Leave a Reply

Your email address will not be published. Required fields are marked *