Dziś nikt nie ma cierpliwości, by czekać na załadowanie aplikacji. W ekosystemie mobilnym responsywność decyduje o tym, czy użytkownik pozostanie w aplikacji, czy usunie ją w ciągu kilku sekund. Natychmiastowe załadowanie złożonego interfejsu wymaga wyjścia poza konwencjonalną optymalizację kodu i skupienia się na tym, jak urządzenie przetwarza instrukcje, zanim dotrą one na ekran.
Aby rozwiązać problem opóźnień w uruchamianiu, Google wprowadził Baseline Profiles – przełomowe narzędzie, które pozwala programistom oznaczać ścieżki kodu, które są kluczowe. Dzięki temu urządzenie nie musi „odkrywać”, jak uruchomić aplikację za pierwszym razem, zapewniając płynne działanie od pierwszego uruchomienia , niezależnie od tego, czy jest to czysta instalacja, czy aktualizacja.
Czym właściwie są Profile Bazowe i jak działają?
Aby je zrozumieć, najpierw musisz wiedzieć, że Android korzysta ze środowiska uruchomieniowego Android Runtime (ART). Tradycyjnie kod był wykonywany za pomocą kompilacji Just-In-Time (JIT) , która tłumaczy kod podczas działania aplikacji, lub kompilacji Ahead-Of-Time (AOT) , która wykonuje wszystko z wyprzedzeniem. Problem z JIT polega na tym, że może powodować drobne zacięcia lub początkowe spowolnienie, ponieważ kod nie jest zoptymalizowany od samego początku.
Profile bazowe pełnią funkcję przewodnika głównego. Są to w zasadzie listy klas i metod, które system musi prekompilować za pomocą AOT , zanim użytkownik uruchomi aplikację. Dzięki temu środowisko wykonawcze nie musi interpretować kodu „w locie”, co może skutkować poprawą szybkości nawet o 30% przy pierwszym uruchomieniu.
W przeciwieństwie do profili w chmurze, które wymagają od tysięcy użytkowników aplikacji i Google Play dodawania tych danych (proces trwający kilka dni), profile bazowe są dostarczane bezpośrednio w pakiecie Android App Bundle (AAB) . Oznacza to, że optymalizacja jest dostępna natychmiast, eliminując okres „opóźnienia”, który często występuje w przypadku nowych wersji.
Kiedy konieczne jest wdrożenie tej techniki?
Nie wszystkie aplikacje wymagają tego samego poziomu optymalizacji, ale są sytuacje, w których są one zbawienne. Korzystanie z profili jest kluczowe dla skrócenia czasu zimnego uruchamiania , zwłaszcza jeśli ekran powitalny ma duże zależności lub złożone renderowanie. Jeśli zauważysz, że pierwsze uruchomienie jest wolne, a drugie błyskawiczne, masz problem z kompilacją, który profile mogą rozwiązać.
Co więcej, nie są one przeznaczone tylko do uruchamiania. Są niezwykle przydatne do poprawy płynności przewijania . Dzięki wstępnej kompilacji logiki listy i animacji, zapobiegasz gubieniu klatek, dzięki czemu nawigacja po treściach jest niezwykle płynna. Idealnie nadają się również do optymalizacji funkcji cyklicznych , takich jak proces płatności czy rejestracji, zapewniając, że najczęściej używane ścieżki są najszybsze.
Konfiguracja modułu generacyjnego krok po kroku
Najnowocześniejszym sposobem wdrożenia tego jest dedykowany moduł w Android Studio. Aby rozpocząć, należy przejść do Nowy moduł i wybierz szablon Generator profilu bazowegoTutaj zdefiniujesz aplikację docelową, nazwę modułu (na przykład, baselineprofile) i preferowany język, Kotlin lub Java.
Ten proces automatyzuje tworzenie środowiska testowego. Kreator skonfiguruje wtyczkę. androidx.baselineprofile i dodam bibliotekę instalator profili w module aplikacji. Ten ostatni odpowiada za prawidłową instalację profilu na urządzeniach użytkowników, nawet w starszych wersjach Androida, które nie obsługują profili w chmurze.
Ważnym szczegółem technicznym jest zarządzanie zaciemnianiem. Aby profil był prawidłowy, musi zostać wygenerowany w wariancie, w którym `isMinifyEnabled` jest ustawione na `false` . Nie martw się jednak o wersję finalną: R8 jest w stanie przepisać reguły profilu tak, aby pasowały do zaciemnionego kodu produkcyjnego pliku APK, zachowując w ten sposób maksymalne bezpieczeństwo i optymalizację rozmiaru.
Tworzenie krytycznych ścieżek użytkowników (CUJ)
Przydatny jest podstawowy profil, który uruchamia tylko aplikację, ale aby w pełni wykorzystać jej wydajność, musimy zdefiniować Krytyczne podróże użytkownikówOdbywa się to w ramach klasy BaselineProfileGenerator utilizado la regla BaselineProfileRuleWewnątrz bloku collectMusimy symulować rzeczywiste działania, jakie wykonałby użytkownik.
Na przykład, jeśli Twoja aplikacja ma asynchroniczne ładowanie, samo wywołanie nie wystarczy startActivityAndWait()Należy wdrożyć inteligentne oczekiwania, aby system zarejestrował kod, który zostanie wykonany, gdy treść w końcu się pojawi. Osiąga się to poprzez interakcję z interfejsem za pośrednictwem UiAutomator, wyszukując konkretne elementy i czekając, aż staną się widoczne przed zakończeniem testu.
W przypadku zaawansowanego przepływu pracy można zaprogramować generator przewijaj listy w pionie przy użyciu metody flingPrzechodź do szczegółowych ekranów, a nawet zarządzaj oknami dialogowymi uprawnień systemowych. Im dokładniejszy symulowany przebieg, tym dokładniejszy będzie wygenerowany profil, a co za tym idzie, Im płynniejsze będzie doświadczenie rzeczywisty użytkownik końcowy.
Generowanie i walidacja wydajności
Po napisaniu generatora czas go uruchomić. Najlepiej byłoby użyć Urządzenie zarządzane przez Gradle (GMD) lub emulator z obrazem aosp mieć uprawnienia roota, chociaż ostatnie wersje biblioteki pozwalają już na generowanie profili na urządzeniach fizycznych z Android 13 lub nowszy bez komplikacji.
Podczas uruchamiania zadania Gradle :app:generateBaselineProfileSystem uruchamia aplikację kilka razy, zbiera wywołane klasy i metody oraz tworzy plik baseline-prof.txtPlik ten jest automatycznie umieszczany w folderze zasobów aplikacji i można go spakować w AAB.
Aby sprawdzić, czy to naprawdę działa, użyliśmy Jetpack MacrobenchmarkStworzyliśmy test porównujący dwa scenariusze: jeden z CompilationMode.None() (bez optymalizacji) i drugi z CompilationMode.Partial() (korzystając z profilu). Analizując metrykę timeToFullDisplayCzęsto można zaobserwować drastyczne skrócenie czasu w milisekundach, co potwierdza, że krytycznego kodu nie trzeba już kompilować w czasie rzeczywistym.
W rzeczywistych scenariuszach, na przykład w aplikacjach na dużą skalę, zaobserwowano, że wątek Just-in-Time (JIT) jest zajęty z 25% czasu do zaledwie 3%. Uwalnia to zasoby procesora i zmniejsza obciążenie termiczne urządzenia, co przekłada się na większą stabilność i wydajność aplikacji , szczególnie na urządzeniach o niższej wydajności.
Wdrożenie profili bazowych to jedna z najbardziej opłacalnych inwestycji w doświadczenie użytkownika, ponieważ sprawia, że oprogramowanie wydaje się lekkie i responsywne od pierwszej sekundy. Łącząc wykorzystanie modułów testowych do generowania i ciągłego weryfikowania czasów rozruchu, każdy programista może przekształcić powolną aplikację w natychmiastowe , profesjonalne narzędzie , które przyciągnie użytkowników.