Studia przypadków

Jak Reddit wykorzystał optymalizator R8, aby znacznie zwiększyć wydajność

4 minuty czytania
Wyświetl profil Bena Weissa
Ben Weiss Inżynier ds. relacji z deweloperami

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 znacznego skrócenia czasu uruchamiania, zmniejszenia liczby wolnych 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 zwiększyć 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.
  • Scalanie 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. Zamiast MyDataModel możesz więc otrzymać klasę o nazwie a.
  • Zmniejszanie zasobów usuwa nieużywane zasoby, takie jak pliki XML i elementy rysowalne, aby jeszcze bardziej zmniejszyć rozmiar aplikacji.
image.png

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 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.

image.png

Jak R8 zwiększył wydajność aplikacji Reddit

Zespół zaobserwował o 40% szybsze uruchamianie 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ł znaczną i pozytywną zmianę w opiniach i zaangażowaniu użytkowników.

image.png

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 wysiłkom. 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 bazoweprofile 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, dexer d8 pobiera klasy i metody oraz tworzy pliki classes.dex aplikacji. Gdy użytkownik otworzy aplikację, te pliki dex są ładowane jeden po drugim, aż aplikacja będzie mogła się uruchomić. Dzięki profilowi uruchamiania możesz poinformować d8, które klasy i metody mają zostać spakowane w pierwszych plikach classes.dex. Ta struktura pozwala aplikacji wczytywać mniej plików, co z kolei zwiększa szybkość uruchamiania.

Głównym narzędziem na tym etapie 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 mniej wystąpień 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.

image.png

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ły przykład 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.

Autor:
Czytaj dalej