Studia przypadków

Jak Reddit wykorzystał optymalizator R8 do znacznego zwiększenia wydajności

Czas czytania: 4 minuty
Ben Weiss
Inżynier ds. relacji z deweloperami

W dzisiejszym świecie aplikacji mobilnych bezproblemowe korzystanie z nich to nie tylko funkcja, ale konieczność. Powolne wczytywanie, brak reakcji interfejsu i niestabilność mogą być znaczącymi przeszkodami w zaangażowaniu i utrzymaniu użytkowników. Podczas współpracy z zespołem ds. relacji z programistami Androida zespół inżynierów z Reddita wykorzystał wynik wydajności aplikacji do oceny swojej aplikacji. Po ocenie wydajności zidentyfikowali znaczny potencjał poprawy i zdecydowali się podjąć działania, aby w pełni wykorzystać możliwości optymalizatora aplikacji na Androida R8. Ta ukierunkowana inicjatywa doprowadziła do znacznej poprawy czasu uruchamiania, zmniejszenia liczby powolnych lub zamrożonych klatek i błędów ANR oraz ogólnego wzrostu ocen w Sklepie Play. To studium przypadku pokazuje, 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. Poprawa wydajności aplikacji wymaga podjęcia różnych działań.Przyjrzyjmy się pokrótce tym, które mają największy wpływ.

  • Usuwanie nieużywanych funkcji to najważniejszy krok w procesie zmniejszania 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, ale o szybkie działanie skompilowanego kodu. 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 rysunkowe, aby jeszcze bardziej zmniejszyć rozmiar aplikacji.
obraz.png

Główne etapy optymalizacji R8

Od twardych danych po zadowolenie użytkowników: określanie sukcesu w produkcji

Po wdrożeniu nowej wersji aplikacji użytkownicy Reddita od razu zauważyli poprawę wyników. Dzięki korzystaniu z Android VitalsCrashlytics Reddit mógł rejestrować dane o wydajności na prawdziwych urządzeniach z rzeczywistymi użytkownikami, co pozwoliło mu porównać nową wersję z poprzednimi.

obraz.png

Jak R8 poprawił wydajność aplikacji Reddit

Zespół zaobserwował 40% szybsze uruchamianie „na zimno”, 30% mniej błędów typu „Aplikacja nie odpowiada” (ANR), 25% lepsze renderowanie klatek14% mniejszy rozmiar aplikacji.

Te ulepszenia są kluczowe dla zadowolenia użytkowników. Szybsze uruchamianie oznacza krótsze oczekiwanie i szybszy dostęp do treści. Mniejsza liczba błędów ANR oznacza bardziej stabilną i 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 szybkie. 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 pod kątem R8 zespół odnotował znaczącą i pozytywną zmianę w opiniach użytkowników i ich zaangażowaniu.

obraz.png

Drew Heavner: „Włączenie pełnego potencjału R8 w mniej niż 2 tygodnie”

Co najważniejsze, udało się to osiągnąć dzięki skoncentrowanym wysiłkom. Drew Heavner, inżynier oprogramowania w Reddit, 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 użyciem testów porównawczych

Po zaobserwowaniu znacznych ulepszeń w rzeczywistych warunkach zespół inżynierów Reddit i zespół ds. relacji z deweloperami Androida w Google przeprowadzili szczegółowe testy porównawcze, aby naukowo potwierdzić uzyskane korzyści i przeprowadzić eksperymenty z dalszymi optymalizacjami. Na potrzeby tej analizy zespół inżynierów Reddit 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 podstawoweprofile uruchamiania.

Profile bazowe skutecznie przenoszą etapy kompilacji Just in Time (JIT) z urządzeń użytkowników na komputery deweloperów. Wygenerowany skompilowany kod AOT (Ahead Of Time) zmniejsza czas uruchamiania i rozwiązywania problemów z renderowaniem.

Podczas pakowania aplikacji program d8 dexer 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 podaniu profilu uruchamiania informujesz d8, które klasy i metody mają być spakowane w pierwszych plikach classes.dex. Dzięki tej strukturze aplikacja wczytuje mniej plików, co z kolei przyspiesza jej uruchamianie.

Jetpack Macrobenchmark to podstawowe narzędzie w tym etapie, które umożliwia precyzyjne pomiary interakcji użytkowników w kontrolowanym środowisku. Aby zasymulować typową ścieżkę użytkownika, wykorzystali interfejs UIAutomator API do utworzenia testu, który otwierał aplikację, przewijał ją 3 razy w dół, a potem przewijał z powrotem do góry.

Ostatecznie do napisania testu porównawczego wystarczyło:

uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

Dane porównawcze 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ę wystąpień kompilacji JITo 1/3 krótszy czas kompilacji JIT. Ulepszyliśmy renderowanie klatek, dzięki czemu w przypadku testowej ścieżki użytkownika renderowanych jest o 19% więcej klatek. Ostatecznie rozmiar aplikacji zmniejszył się o ponad jedną trzecią.

obraz.png

Ogólne ulepszenia skuteczności Reddita

Czas kompilacji JIT możesz zmierzyć za pomocą niestandardowych danych sekcji śledzenia Macrobenchmark, takich jak te:

val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

Włączanie technologii, która umożliwia 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 wspomnieliśmy wcześniej, R8 przeprowadza szeroko zakrojone optymalizacje, aby zmaksymalizować korzyści związane ze skutecznością. R8 wprowadza istotne modyfikacje kodu, 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 zachowywania.

Wzorowanie się na aplikacji Reddit

Sukces Reddit z R8 to doskonały przykład dla każdego zespołu deweloperskiego, który chce w prosty sposób znacząco poprawić wydajność aplikacji. Bezpośrednia korelacja między ulepszeniami technicznymi a późniejszym wzrostem zadowolenia użytkowników podkreśla wartość optymalizacji wydajności.

Postępując zgodnie z planem przedstawionym w tym studium przypadku – korzystając z narzędzi takich jak wynik wydajności aplikacji do identyfikowania możliwości, włączając pełny potencjał optymalizacji R8, monitorując dane ze świata rzeczywistego i używając wartości referencyjnych do potwierdzania i pogłębiania wiedzy – inni deweloperzy mogą osiągnąć podobne korzyści.

Aby zacząć korzystać z R8 w swojej aplikacji, zapoznaj się z oficjalną dokumentacją i wskazówkami na temat włączania, konfigurowania i rozwiązywania problemów z optymalizatorem R8.

Autor:

Czytaj dalej