Nowości o produktach
Zwiększanie wydajności Androida: wprowadzenie AutoFDO w jądrze
4 minuty czytania
Jesteśmy zespołem ds. łańcucha narzędzi Android LLVM. Jednym z naszych głównych priorytetów jest zwiększanie wydajności Androida dzięki technikom optymalizacji w ekosystemie LLVM. Stale szukamy sposobów na to, aby Android działał szybciej, płynniej i wydajniej.Chociaż większość naszych prac optymalizacyjnych odbywa się w przestrzeni użytkownika, jądro systemu pozostaje sercem systemu. Dziś z radością informujemy, że wprowadzamy do jądra Androida automatyczną optymalizację opartą na informacjach zwrotnych (AutoFDO), aby zapewnić użytkownikom znaczną poprawę wydajności.
Czym jest AutoFDO?
Podczas standardowego tworzenia oprogramowania kompilator podejmuje tysiące drobnych decyzji, np. czy wstawić funkcję w kodzie i którą gałąź warunku prawdopodobnie wybierze, na podstawie statycznych wskazówek w kodzie. Chociaż te heurystyki są przydatne, nie zawsze dokładnie przewidują wykonanie kodu podczas rzeczywistego korzystania z telefonu.
AutoFDO zmienia to, wykorzystując rzeczywiste wzorce wykonania do kierowania kompilatorem. Te wzorce reprezentują najczęstsze ścieżki wykonywania instrukcji, które kod przyjmuje podczas rzeczywistego użycia, rejestrowane przez zapisywanie historii rozgałęzień procesora. Chociaż te dane można zbierać z urządzeń w ramach floty, w przypadku jądra syntetyzujemy je w środowisku laboratoryjnym, używając reprezentatywnych zbiorów zadań, takich jak uruchamianie 100 najpopularniejszych aplikacji. Do zbierania tych danych używamy profilera próbek, który identyfikuje, które części kodu są „gorące” (często używane), a które „zimne”.Gdy ponownie tworzymy jądro z tymi profilami, kompilator może podejmować znacznie bardziej inteligentne decyzje optymalizacyjne dostosowane do rzeczywistych zbiorów zadań Androida.
Aby zrozumieć wpływ tej optymalizacji, weź pod uwagę te kluczowe fakty:
- W Androidzie jądro odpowiada za około 40% czasu procesora.
- Używamy już AutoFDO do optymalizacji natywnych plików wykonywalnych i bibliotek w przestrzeni użytkownika, co pozwala uzyskać około 4% poprawy w przypadku uruchamiania aplikacji na zimno i 1% skrócenia czasu uruchamiania.
Poprawa wydajności w rzeczywistych warunkach
Dzięki wykorzystaniu profili z kontrolowanych środowisk laboratoryjnych zaobserwowaliśmy imponującą poprawę kluczowych danych Androida. Te profile zostały zebrane za pomocą indeksowania i uruchamiania aplikacji oraz zmierzone na urządzeniach Pixel z jądrami 6.1, 6.6 i 6.12.
Najbardziej zauważalne ulepszenia są wymienione poniżej. Szczegółowe informacje o profilach AutoFDO dla tych wersji jądra znajdziesz w odpowiednich repozytoriach jądra Androida dla jąder android16-6.12 i android15-6.6.
To nie są tylko teoretyczne liczby. Przekładają się one na szybszy interfejs, szybsze przełączanie aplikacji, dłuższą żywotność baterii i ogólnie lepszą responsywność urządzenia dla użytkownika.
Jak to działa: potok
Nasza strategia wdrażania obejmuje zaawansowany potok, który zapewnia, że profile pozostają aktualne, a wydajność stabilna.
Krok 1. Zbieranie profili
Chociaż do profilowania plików binarnych w przestrzeni użytkownika korzystamy z naszej wewnętrznej floty testowej, w przypadku ogólnego obrazu jądra (GKI) przeszliśmy na kontrolowane środowisko laboratoryjne. Oddzielenie profilowania od cyklu wydawania urządzenia umożliwia elastyczne i natychmiastowe aktualizacje niezależne od wdrożonych wersji jądra. Co najważniejsze, testy potwierdzają, że dane z laboratorium zapewniają wzrost wydajności porównywalny z danymi z rzeczywistych flot.
- Narzędzia i środowisko: urządzenia testowe flashujemy najnowszym obrazem jądra i używamy simpleperf do przechwytywania strumieni wykonywania instrukcji. Ten proces opiera się na możliwościach sprzętowych w zakresie rejestrowania historii rozgałęzień, w szczególności na wykorzystaniu ARM Embedded Trace Extension (ETE) i ARM Trace Buffer Extension (TRBE) na urządzeniach Pixel.
- Zbiory zadań: tworzymy reprezentatywny zbiór zadań, używając 100 najpopularniejszych aplikacji z Android App Compatibility Test Suite (C-Suite). Aby uzyskać jak najdokładniejsze dane, skupiamy się na:
- Uruchamianie aplikacji: optymalizacja pod kątem najbardziej widocznych opóźnień użytkownika
- **Indeksowanie aplikacji oparte na AI**: symulowanie ciągłych, ewoluujących interakcji użytkownika
- Monitorowanie całego systemu: przechwytywanie nie tylko aktywności aplikacji na pierwszym planie, ale także krytycznych zbiorów zadań w tle i komunikacji międzyprocesowej
- Weryfikacja: ten syntetyczny zbiór zadań wykazuje 85% podobieństwa do wzorców wykonania zebranych z naszej wewnętrznej floty.
- Ukierunkowane dane: dzięki powtarzaniu tych testów wystarczająco często możemy przechwytywać wzorce wykonania o wysokiej wierności, które dokładnie reprezentują interakcje użytkownika z najpopularniejszymi aplikacjami. Ponadto ten rozszerzalny framework umożliwia nam bezproblemowe integrowanie dodatkowych zbiorów zadań i testów porównawczych, aby poszerzyć zakres.
Krok 2. Przetwarzanie profili
Przetwarzamy wstępnie nieprzetworzone dane śledzenia, aby mieć pewność, że są one czyste, skuteczne i gotowe do użycia przez kompilator.
- Agregacja: łączymy dane z wielu przebiegów testów i urządzeń w jeden widok systemu.
- Konwersja: przekształcamy nieprzetworzone ślady w format profilu AutoFDO, w razie potrzeby odfiltrowując niechciane symbole.
- Przycinanie profili: przycinamy profile, aby usunąć dane dotyczące „zimnych” funkcji, co pozwala na stosowanie standardowej optymalizacji. Zapobiega to regresjom w rzadko używanym kodzie i niepotrzebnemu zwiększaniu rozmiaru pliku binarnego.
Krok 3. Testowanie profili
Przed wdrożeniem profile przechodzą rygorystyczną weryfikację, aby mieć pewność, że zapewniają stały wzrost wydajności bez ryzyka utraty stabilności.
- Analiza profilu i pliku binarnego: dokładnie porównujemy zawartość nowego profilu (w tym gorące funkcje, liczbę próbek i rozmiar profilu) z poprzednimi wersjami. Używamy też profilu do utworzenia nowego obrazu jądra, analizując pliki binarne, aby mieć pewność, że zmiany w sekcji tekstowej są zgodne z oczekiwaniami.
- Weryfikacja wydajności: uruchamiamy ukierunkowane testy porównawcze na nowym obrazie jądra. Potwierdza to, że utrzymuje on wzrost wydajności ustalony przez poprzednie wartości bazowe.
Ciągłe aktualizacje
Kod naturalnie „dryfuje” z czasem, więc statyczny profil z czasem traci skuteczność. Aby utrzymać najwyższą wydajność, stale uruchamiamy potok, aby regularnie aktualizować:
- Regularne odświeżanie: odświeżamy profile w gałęziach LTS jądra Androida przed każdą wersją GKI, dzięki czemu każda kompilacja zawiera najnowsze dane profilu.
- Przyszłe rozszerzenie: obecnie dostarczamy te aktualizacje do gałęzi
android16-6.12iandroid15-6.6oraz rozszerzymy obsługę na nowsze wersje GKI, takie jak nadchodzącaandroid17-6.18.
Zapewnianie stabilności
Częstym pytaniem dotyczącym optymalizacji opartej na profilach jest to, czy wprowadza ona ryzyko utraty stabilności. Ponieważ AutoFDO wpływa głównie na heurystyki kompilatora, takie jak wstawianie funkcji w kodzie i układ kodu, a nie na logikę kodu źródłowego, zachowuje integralność funkcjonalną jądra. Ta technologia sprawdziła się już na dużą skalę, służąc od lat jako standardowa optymalizacja bibliotek platformy Android, ChromeOS i własnej infrastruktury serwerowej Google.
Aby dodatkowo zagwarantować spójne działanie, stosujemy strategię „domyślnie konserwatywną”. Funkcje, które nie zostały przechwycone w naszych profilach o wysokiej wierności, są optymalizowane za pomocą standardowych metod kompilatora. Dzięki temu „zimne” lub rzadko wykonywane części jądra zachowują się dokładnie tak, jak w standardowej kompilacji, co zapobiega regresjom wydajności lub nieoczekiwanym zachowaniom w przypadkach brzegowych.
Co dalej
Obecnie wdrażamy AutoFDO w gałęziach android16-6.12 i android15-6.6. Poza tym wstępnym wdrożeniem widzimy kilka obiecujących sposobów na dalsze ulepszanie tej technologii:
- Rozszerzony zasięg: planujemy wdrożyć profile AutoFDO w nowszych wersjach jądra GKI i dodatkowych celach kompilacji poza obecną obsługą
aarch64. - Optymalizacja modułów GKI: obecnie nasza optymalizacja koncentruje się na głównym pliku binarnym jądra (
vmlinux). Rozszerzenie AutoFDO na moduły GKI może przynieść korzyści w zakresie wydajności większej części podsystemu jądra. - Obsługa modułów dostawców: chcemy też obsługiwać AutoFDO w przypadku modułów dostawców tworzonych za pomocą pakietu Driver Development Kit (DDK). Dzięki obsłudze dostępnej już w naszym systemie kompilacji (Kleaf) i narzędziach do profilowania (simpleperf) dostawcy mogą stosować te same techniki optymalizacji do swoich sterowników sprzętowych.
- Szerszy zakres profili: istnieje możliwość zbierania profili z szerszego zakresu krytycznych ścieżek użytkownika (CUJ) w celu ich optymalizacji.
Wprowadzając AutoFDO do jądra Androida, zapewniamy, że sama podstawa systemu operacyjnego jest zoptymalizowana pod kątem codziennego korzystania z urządzenia.
Czytaj dalej
-
r.r.
Nowości o produktach
Procesy i potrzeby każdego dewelopera w zakresie AI są unikalne, dlatego ważne jest, aby móc wybrać, w jaki sposób AI ma pomagać w tworzeniu aplikacji. W styczniu wprowadziliśmy możliwość wyboru dowolnego lokalnego lub zdalnego modelu AI, który będzie obsługiwać funkcje AI w Android Studio.
Matthew Warner • 2 minuty czytania
-
r.r.
Nowości o produktach
Android Studio Panda 3 jest już stabilne i gotowe do użycia w środowisku produkcyjnym. Ta wersja daje jeszcze większą kontrolę i możliwość dostosowywania procesów opartych na AI, dzięki czemu tworzenie wysokiej jakości aplikacji na Androida jest łatwiejsze niż kiedykolwiek.
Matt Dyor • 3 minuty czytania
-
r.r.
Nowości o produktach
W Google dokładamy wszelkich starań, aby udostępniać najbardziej zaawansowane modele AI bezpośrednio na urządzeniach z Androidem. Z radością ogłaszamy dziś wydanie naszego najnowszego, najnowocześniejszego modelu open source: Gemma 4.
Caren Chang, David Chou • 3 minuty czytania
Bądź na bieżąco
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.