Einführung
ShareChat ist eine führende Social-Media-Plattform in Indien, auf der Nutzer ihre Meinungen teilen, ihr Leben dokumentieren und neue Freunde in ihrer Muttersprache finden können. Weitere Funktionen sind Chatrooms und private Nachrichten, mit denen Nutzer Videos, Witze, Songs und andere sprachbasierte soziale Inhalte teilen können. ShareChat möchte die Internetrevolution in Indien vorantreiben und verändert die Art und Weise, wie die nächste Milliarde Nutzer im Internet interagieren.
Die App in Zahlen
- Über 100 Millionen Downloads
- Über 180 Millionen monatlich aktive Nutzer
- Über 32 Millionen Creator
- 15 verschiedene indische Sprachen
- ~1,5 Millionen Beiträge werden täglich erstellt
Die Herausforderung
Da ShareChat täglich von Tausenden von Menschen genutzt wurde, hatte die App Schwierigkeiten, kontinuierlich neue Frames zu liefern. Dies führte zu schlechten Reaktionszeiten, die die Nutzerfreundlichkeit beeinträchtigten.
In der Folge kam es in der App zu einer erhöhten Anzahl von ausgelassenen oder verzögerten Frames (auch als „Jank“ bezeichnet). Die Behebung dieser Jank-Probleme durch die Verbesserung langsamer und eingefrorener Frames war entscheidend, um allen Nutzern eine reibungslose Nutzung zu ermöglichen. Dies würde auch dazu beitragen, dass Nutzer mehr Zeit in der App verbringen, was das Engagement steigern und die Bewertung von ShareChat im Android Play Store verbessern würde.
Die Umsetzung
ShareChat hat mit dem Developer Relations-Team von Google zusammengearbeitet, um Jank zu reduzieren und durch die Verbesserung langsamer und eingefrorener Frames (Jank) in der App einen positiven geschäftlichen Einfluss zu erzielen. Insbesondere wurde an der Verbesserung der folgenden Probleme gearbeitet:
Gemeinsamer RecyclerView-Pool: Beim Profiling wurde festgestellt, dass das Erstellen verschiedener Viewholder länger dauert. Um dies zu minimieren, wurde ein gemeinsamer RecyclerView-Pool erstellt. Außerdem konnten so die Kosten für die Erstellung ähnlicher Feeds für die Nutzer gesenkt werden.
Zu viele Layoutdurchläufe: Beim Profiling wurde auch beobachtet, dass für einige Viewholder zusätzliche requestLayouts angefordert wurden. Zur Optimierung wurde der Code so aktualisiert, dass der Wert bei der Erstellung und nicht bei jeder Bindung berücksichtigt wird. Dadurch werden zusätzliche requestLayout-Kosten eingespart.
OverDraw: Die Layouts wurden vereinfacht, um die Anzahl der Ebenen zu reduzieren. Außerdem wurden Farben entfernt, die für jede Ebene separat festgelegt wurden.
Abflachung der Hierarchie: Die Inflation wurde durch Profiling und manuelle Überprüfung vieler Bildschirme beobachtet. Die Hierarchie wurde mit ConstraintLayout vereinfacht, um dieses Problem zu beheben.
Übermäßige View-Inflation: Beim Profiling wurde für bestimmte Ansichten eine lange Inflationszeit festgestellt. Diese Ansichten wurden in ViewStubs konvertiert.
Entfernen rechenintensiver Aufgaben aus dem UI-Thread: Mit einem Profiler konnten einige Stellen beobachtet werden, an denen rechenintensive Aufgaben im Haupt-Thread ausgeführt wurden, z. B. das Erstellen von SpannableStringBuilder mit Tagging und Styling für jede recyclerView-Bindung, BlurHash-Decodierung usw. Diese Aufgaben wurden aus dem UI-Thread entfernt und in einen Hintergrund-Thread verschoben.
Migration von Rx zu Coroutine: Der Arbeitsspeicherverbrauch führte auch zu häufigen GC-Aufrufen und es gab sehr viele Threads über den >100 RX-Thread. Viele Anwendungsfälle wurden zu Coroutine migriert, um diese Probleme zu beheben.
Einführung von Coil für das Laden von Bildern: Glide hat beim Laden von Bildern Probleme verursacht, insbesondere in den mit Jetpack Compose erstellten Komponenten. Außerdem wurde festgestellt, dass die Leiste für den Rendering-Schwellenwert beim Laden von Bildern in LazyColumn hoch war. Diese Vorkommnisse führten zur Einführung von Coil für das Laden von Bildern.
Bereinigung und Refactoring von altem Code: Durch das Entfernen von altem Code und alten Tests konnten unnötige verborgene Ansichten aus der Benutzeroberfläche entfernt und einige der Bildschirme neu geschrieben werden.
Ergebnisse
Durch die Analyse von Verbesserungsmöglichkeiten und die Entwicklung von Optimierungsstrategien konnte ShareChat die Nutzerfreundlichkeit insgesamt verbessern und gleichzeitig die Interaktionsrate und die Play Store-Bewertungen steigern. Unten finden Sie eine quantitative Übersicht der Ergebnisse, die ShareChat erzielt hat:
- Etwa 45% weniger Frames mit langsamer Darstellung im Play Store
- Etwa 30% weniger „eingefrorene“ Frames im Play Store
- Anteil falsch gerenderter Frames pro 10.000 gerenderte Frames von 10,72% auf 3,98 % gesenkt
- 60 % mehr Aufrufe von Feeds
- Die Gesamtbewertungen im Store sind von etwa 4,0 auf 4,3 gestiegen.
- 10% mehr Aufrufe von Beiträgen
„Unser Ziel bei ShareChat ist es, die beste Social-Media-App zu sein, die unsere Nutzer begeistert.Das bedeutet auch, dass wir die beste App in Bezug auf die Leistung sein wollen. Durch die Zusammenarbeit mit dem Developer Relations-Team von Google konnten wir Bereiche identifizieren, in denen wir unsere am häufigsten verwendeten Low-End-Geräte verbessern können. Wir haben die besten Leistungspraktiken und Tools kennengelernt, um eingefrorene Frames, Ruckler, Overdraws und ANRs zu erkennen und zu beheben.“
– Vihaan Verma, Engineering Manager, Android Team bei ShareChat