Case Studies
Jak Reddit wykorzystał optymalizator R8, aby znacznie zwiększyć wydajność
Czas czytania: 4 minuty
W dzisiejszym świecie aplikacji mobilnych płynne korzystanie z aplikacji to nie tylko funkcja, ale konieczność. Długi czas wczytywania, brak reakcji interfejsu i niestabilność mogą być znacznymi przeszkodami w zaangażowaniu i utrzymaniu użytkowników. Podczas współpracy z zespołem ds. relacji z deweloperami Androida zespół inżynierów z Reddita użył wyniku skuteczności aplikacji do oceny swojej aplikacji. Po ocenie skuteczności zidentyfikowali znaczny potencjał poprawy i postanowili podjąć kroki, aby w pełni wykorzystać możliwości R8, optymalizatora aplikacji na Androida. Ta ukierunkowana inicjatywa doprowadziła do znacznej poprawy czasu uruchamiania, zmniejszenia liczby powolnych lub zawieszonych klatek i błędów ANR oraz ogólnego wzrostu ocen w Sklepie Play. Z tego studium przypadku dowiesz się, jak Reddit osiągnął te imponujące wyniki.
Jak optymalizator R8 pomógł Redditowi
Optymalizator R8 to podstawowe narzędzie do optymalizacji wydajności na Androidzie. Podejmuje różne kroki, aby poprawić wydajność aplikacji.Przyjrzyjmy się szybko najważniejszym z nich.
- Usuwanie nieużywanego kodu to najważniejszy krok w celu zmniejszenia rozmiaru aplikacji. W tym przypadku usuwany jest nieużywany kod z zależności aplikacji i samej aplikacji.
- Wstawianie kodu metody zastępuje wywołania metod rzeczywistym kodem, co zwiększa wydajność aplikacji.
- Łączenie klas i inne strategie są stosowane w celu zmniejszenia rozmiaru kodu. W tym momencie nie chodzi już o czytelność kodu źródłowego dla człowieka, ale o szybkie działanie skompilowanego kodu. Dlatego abstrakcje, takie jak interfejsy czy hierarchie klas, nie mają tu znaczenia i zostaną usunięte.
- Minimalizacja identyfikatorów zmienia nazwy klas, pól i metod na krótsze, bez znaczenia nazwy. Dlatego zamiast
MyDataModelmożesz mieć klasę o nazwie a. - Zmniejszanie zasobów usuwa nieużywane zasoby, takie jak pliki XML i obiekty rysowalne, aby jeszcze bardziej zmniejszyć rozmiar aplikacji.
Główne etapy optymalizacji R8
Od twardych danych do zadowolenia użytkowników: identyfikowanie sukcesu w środowisku produkcyjnym
Reddit odnotował poprawę wydajności od razu po udostępnieniu użytkownikom nowej wersji aplikacji.Dzięki użyciu Android Vitals i Crashlytics Reddit mógł rejestrować dane o wydajności na rzeczywistych urządzeniach z prawdziwymi użytkownikami, co pozwoliło mu porównać nową wersję z poprzednimi.
Jak R8 poprawił wydajność aplikacji Reddita
Zespół zaobserwował o 40% szybsze uruchomienie „na zimno”, o 30% mniej błędów typu „Aplikacja nie odpowiada” (ANR), o 25% lepsze renderowanie klatek i o 14% mniejszy rozmiar aplikacji.
Te ulepszenia mają kluczowe znaczenie dla zadowolenia użytkowników. Szybsze uruchamianie oznacza krótsze oczekiwanie i szybszy dostęp do treści. Mniejsza liczba błędów ANR przekłada się na stabilniejszą i bardziej niezawodną aplikację, co zmniejsza frustrację użytkowników. Płynniejsze renderowanie klatek eliminuje zacinanie się interfejsu, dzięki czemu przewijanie i animacje są płynne i responsywne. Ten pozytywny wpływ techniczny był też wyraźnie widoczny w opiniach użytkowników.
Wskaźniki zadowolenia użytkowników z optymalizacji były bezpośrednio widoczne w Sklepie Google Play. Po wdrożeniu wersji zoptymalizowanej za pomocą R8 zespół zaobserwował znaczącą i pozytywną zmianę w opiniach i zaangażowaniu użytkowników.
Drew Heavner: „Wdrożenie pełnego potencjału R8 zajęło mniej niż 2 tygodnie”
Co najważniejsze, udało się to osiągnąć dzięki ukierunkowanym działaniom. Drew Heavner, starszy inżynier oprogramowania w Reddicie, który pracował nad tą inicjatywą, zauważył, że wprowadzenie zmian umożliwiających pełne wykorzystanie potencjału R8 zajęło mniej niż 2 tygodnie.
Potwierdzanie korzyści: szczegółowa analiza z wykorzystaniem testów porównawczych
Po zaobserwowaniu znacznych ulepszeń w rzeczywistych warunkach zespół inżynierów Reddita i zespół ds. relacji z deweloperami Androida w Google przeprowadzili szczegółowe testy porównawcze, aby naukowo potwierdzić korzyści i przeprowadzić eksperymenty z dalszą optymalizacją. Na potrzeby tej analizy zespół inżynierów Reddita udostępnił 2 wersje aplikacji: jedną bez optymalizacji i drugą, w której zastosowano R8 oraz 2 inne podstawowe narzędzia do optymalizacji wydajności: profile bazowe i profile uruchamiania.
Profile bazowe skutecznie przenoszą kroki kompilacji Just in Time (JIT) z urządzeń użytkowników na komputery deweloperów. Wygenerowany kod skompilowany Ahead Of Time (AOT) zmniejsza zarówno czas uruchamiania, jak i problemy z renderowaniem.
Gdy aplikacja jest pakowana, narzędzie d8 dexer pobiera klasy i metody oraz tworzy pliki classes.dex aplikacji. Gdy użytkownik otwiera aplikację, te pliki dex są ładowane jeden po drugim, aż aplikacja będzie mogła się uruchomić. Dzięki udostępnieniu profilu uruchamiania możesz poinformować narzędzie d8, które klasy i metody mają zostać spakowane w pierwszych plikach classes.dex. Ta struktura umożliwia aplikacji wczytywanie mniejszej liczby plików, co z kolei przyspiesza uruchamianie.
Głównym narzędziem w tej fazie był Jetpack Macrobenchmark, który umożliwiał dokładne pomiary interakcji użytkowników w kontrolowanym środowisku. Aby zasymulować typową ścieżkę użytkownika, zespół użył interfejsu API UIAutomator do utworzenia testu, który otwierał aplikację, przewijał ją 3 razy w dół, a następnie przewijał z powrotem do góry.
Aby napisać test porównawczy, wystarczyło wykonać te czynności:
uiAutomator {
startApp(REDDIT)
repeat(3) {
onView { isScrollable }.fling(Direction.DOWN) }
repeat(3) {
onView {isScrollable }.fling(Direction.UP)
}
}
Dane testu porównawczego potwierdziły obserwacje w terenie i dostarczyły bardziej szczegółowych informacji. W pełni zoptymalizowana aplikacja uruchamiała się o 55% szybciej , a użytkownicy mogli zacząć przeglądać treści o 18% wcześniej. Zoptymalizowana aplikacja wykazała też o 2/3 mniejszą liczbę kompilacji Just in Time (JIT) i o 1/3 krótszy czas kompilacji JIT. Renderowanie klatek uległo poprawie, co spowodowało, że podczas testu porównawczego ścieżki użytkownika wyrenderowano o 19% więcej klatek. Rozmiar aplikacji został zmniejszony o ponad 1/3.
Ogólna poprawa wydajności Reddita
Czas kompilacji JIT możesz zmierzyć za pomocą niestandardowej sekcji śledzenia testu porównawczego, takiej jak ta:
val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")
Włączanie technologii stojącej za transformacją: R8
Aby włączyć R8 w trybie pełnym, skonfiguruj plik app/build.gradle.kts, ustawiając minifyEnabled i shrinkResources na true w rodzaju kompilacji do publikacji.
android {
...
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"keep-rules.pro",
)
}
}
}
Po tym kroku należy przeprowadzić kompleksowe testy, ponieważ optymalizacja wydajności może prowadzić do niepożądanych zachowań, które lepiej wykryć przed użytkownikami.
Jak pokazano wcześniej w tym artykule, R8 przeprowadza szeroko zakrojoną optymalizację, aby zmaksymalizować korzyści z wydajności. R8 wprowadza znaczące modyfikacje w kodzie, w tym zmianę nazw, przenoszenie i usuwanie klas, pól i metod. Jeśli zauważysz, że te modyfikacje powodują błędy, musisz określić, których części kodu R8 nie powinien modyfikować, deklarując je w regułach keep.
Wykorzystaj przykład Reddita w swojej aplikacji
Sukces Reddita z R8 to doskonałe studium przypadku dla każdego zespołu deweloperów, który chce w znaczący sposób i przy niewielkim wysiłku wpłynąć na wydajność swojej aplikacji. Bezpośrednia korelacja między ulepszeniami technicznymi a późniejszym wzrostem zadowolenia użytkowników podkreśla wartość optymalizacji wydajności.
Inni deweloperzy mogą osiągnąć podobne korzyści, korzystając z planu przedstawionego w tym studium przypadku – używając narzędzi takich jak wynik skuteczności aplikacji do identyfikowania możliwości, włączając pełny potencjał optymalizacji R8, monitorując dane z rzeczywistych warunków i używając testów porównawczych do potwierdzania i pogłębiania wiedzy.
Aby zacząć korzystać z R8 w swojej aplikacji, zapoznaj się z niedawno zaktualizowaną oficjalną dokumentacją i wskazówkami dotyczącymi włączania, konfigurowania i rozwiązywania problemów z optymalizatorem R8.
Czytaj dalej
-
Case Studies
Monzo to brytyjski bank cyfrowy, który ma 15 milionów klientów i stale się rozwija. W miarę skalowania aplikacji zespół inżynierów uznał czas uruchamiania aplikacji za kluczowy obszar do poprawy, ale obawiał się, że będzie to wymagało znacznych zmian w bazie kodu.
Ben Weiss • Czas czytania: 2 minuty
-
Case Studies
Karrot to hiperlokalna, oparta na społeczności aplikacja typu peer-to-peer, która umożliwia użytkownikom kupowanie, sprzedawanie i wymienianie przedmiotów z innymi zweryfikowanymi użytkownikami. Od czasu uruchomienia w Korei Południowej w 2015 roku platforma rozszerzyła się na rynki globalne, zdobywając ponad 43 miliony zarejestrowanych użytkowników.
Thomas Ezan, Tracy Agyemang • Czas czytania: 2 minuty
-
Case Studies
TikTok to globalna platforma krótkich filmów znana z ogromnej bazy użytkowników i innowacyjnych funkcji.
Ben Trengrove, Ajesh Pai • Czas czytania: 2 minuty
Bądź na bieżąco
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.