- AutoFDO uporablja podatke o dejanskem izvajanju za optimizacijo jedra in binarnih datotek Android, pri čemer daje prednost najpogosteje uporabljeni kodi.
- Testi kažejo merljive izboljšave pri zagonu, odpiranju aplikacij in učinkovitosti procesorja, kar pozitivno vpliva na življenjsko dobo baterije.
- Google nenehno uporablja profile za veje jedra LTS in načrtuje razširitev pokritosti na več različic in modulov.
- Tehnika ohranja stabilnost s spreminjanjem le hevristike prevajalnika, ne da bi pri tem spremenila logiko izvorne kode.

V zadnjih letih je Google zelo resno vzel poslanstvo, da bi Android postal hitrejši, bolj tekoč in učinkovitejši pri porabi baterije, ne da bi pri tem potreboval kakršno koli posredovanje uporabnika. Eden ključnih elementov te strategije je AutoFDO, optimizacijska tehnologija, ki se je do sedaj uporabljala predvsem v uporabniškem prostoru (izvorne aplikacije in knjižnice), zdaj pa dosega tudi jedro, srce sistema.
Ta nova funkcija se morda sliši zelo tehnično zahtevna, vendar so njeni učinki precej običajni: telefoni se zaženejo nekoliko hitreje, aplikacije se odprejo hitreje in poraba energije je nekoliko manjša . Ne boste imeli občutka, kot da imate čisto nov telefon, vendar pa prispeva k zbirki majhnih izboljšav, zaradi katerih je Android vse bolj agilen in učinkovit.
Kaj je AutoFDO in zakaj je pomemben v Androidu?
AutoFDO je kratica za Automatic Feedback-Directed Optimization (Automatic Feedback-Directed Optimization), ki je samodejna optimizacija, ki jo vodijo dejanski podatki med izvajanjem. Za razliko od klasičnih metod, kjer se prevajalnik zanaša na statična pravila in predpostavke, AutoFDO uporablja informacije, zbrane med dejanskim izvajanjem kode, da se odloči, kako jo optimizirati.
Pri tradicionalnem prevajanju prevajalnik nenehno sprejema na tisoče mikroodločitev o tem, kako organizirati kodo : ali vdelati funkcijo ali jo pustiti ločeno, katera veja stavka if se bo najverjetneje izvedla, kako razporediti ukaze v pomnilniku, da jih procesor kar najbolje izkoristi itd. Vse te odločitve običajno temeljijo na splošnih hevristikah, ki se ne ujemajo vedno s tem, kar se dejansko zgodi, ko vsakodnevno uporabljate mobilni telefon.
Z AutoFDO se sistem namesto zanašanja zgolj na predpostavke zbira z resničnimi profili izvajanja : katere funkcije se uporabljajo najpogosteje, katere poti kode se nenehno prepisujejo in katere se komaj kaj dotaknejo. Ti podatki se pridobijo iz nadzornih zmogljivosti strojne opreme (sledenje vej CPU) in se pretvorijo v profile, ki jih prevajalnik razume in uporablja za veliko natančnejše prerazporejanje kode.
Ta tehnika je razvoj klasične instrumentalno vodene optimizacije profilov (PGO) , ki se že uporablja v sistemih Windows, Linux in brskalnikih, kot je Chrome . Razlika je v tem, da je AutoFDO manj invaziven, omogoča zbiranje podatkov brez ponovnega prevajanja z uporabo posebej instrumentiranih različic in se bolj približa uporabi naprav v resničnem svetu.
V sistemu Android je bil AutoFDO prvotno predstavljen v sistemu Android 12 za optimizacijo izvedljivih datotek in izvornih knjižnic . Zdaj Google isto idejo prenaša na še nižjo raven: jedro Androida, ki predstavlja približno 40 % časa procesorja. Optimizacija tam neposredno vpliva na skoraj vse, kar počnete na telefonu.
Kako AutoFDO pospeši jedro Androida?
Ekipa za orodjarno Android LLVM je zasnovala dovršen cevovod, ki omogoča delovanje AutoFDO v jedru brez ogrožanja stabilnosti. Ključno je ustvarjanje visokokakovostnih profilov v laboratorijskem okolju in njihova nato uporaba v generični sliki jedra (GKI) , ki služi kot osnova za številne naprave.
Za začetek mora Google razumeti, kako se jedro dejansko obnaša, ko uporabljate telefon. Da bi to dosegel, na testne naprave (predvsem Pixel) namesti najnovejšo sliko jedra in za beleženje zgodovine razvejanja procesorja uporablja orodja, kot je simpleperf, ki jih podpirajo posebne strojne funkcije, kot sta ARM Embedded Trace Extension (ETE) in ARM Trace Buffer Extension (TRBE).
Te naprave izvajajo reprezentativno delovno obremenitev, ki vključuje 100 najbolj priljubljenih aplikacij iz zbirke testov združljivosti (C-Suite) . Ne gre le za to, da jih enkrat odprete in to je to; simulirajo se celotne interakcije uporabnikov v resničnem svetu, vključno z dejanji, ki jih vodi umetna inteligenca in spremljajo, kako se aplikacije uporabljajo skozi čas.
Med temi testi se spremlja celoten sistem: aplikacije v ospredju, procesi v ozadju, kritične storitve in komunikacija med procesi . Rezultat je dokaj podroben zemljevid, ki prikazuje, kateri deli jedra so "vroči" (tečejo neprekinjeno) in kateri so "hladni" (komaj se jih dotakne). Google trdi, da ta sintetična delovna obremenitev posnema približno 85 % vzorcev izvajanja, opaženih v dejanski notranji floti, kar je zelo visoka številka za nadzorovano okolje.
Ko so te informacije na voljo, se jedro ponovno prevede z vključitvijo teh profilov AutoFDO. Prevajalnik, ki ima zdaj na voljo dejanske podatke, lahko določi prioritete optimizacije točno tam, kjer je to najpomembnejše : kritične izvedbene poti, intenzivno upravljanje V/I, preklapljanje konteksta med procesi itd., hkrati pa omogoča optimizacijo preostale kode z uporabo standardnih tehnik.
Celoten cevovod: od zbiranja profilov do stalnega posodabljanja
Da bi bil AutoFDO dolgoročno uporaben, ni dovolj, da preprosto enkrat ustvarite profil in nanj pozabite. Jedro in sistemska koda se spreminjata z vsako različico in popravkom, zato profili sčasoma zastarajo . Zato je Google vzpostavil neprekinjen postopek z več zelo jasnimi koraki.
V prvem koraku, zbiranju profilov, je postopek profiliranja ločen od cikla izdaje posamezne naprave . To pomeni, da se generična slika jedra profilira v laboratoriju, ne glede na dejansko floto ali specifične različice, ki jih imajo uporabniki. To omogoča veliko bolj prilagodljive in hitrejše posodobitve profilov, kadar koli je na voljo nova različica jedra GKI.
Sledi profiliranje. Surovi podatki sledi, ki jih ustvari strojna oprema, se naknadno obdelajo, da jih lahko prevajalnik uporabi. Meritve iz več izvedb in več naprav so združene , da se zagotovi celovit pogled, te sledi se pretvorijo v standardno obliko AutoFDO, nepomembni simboli, ki ne prispevajo k zmogljivosti, pa se izločijo.
Pomembna točka je obrezovanje profila. S čiščenjem podatkov se iz profila odstranijo hladne funkcije, tako da še naprej uporablja "staromodne" optimizacije . S tem se izognemo nenavadnim regresijam v kodi, ki se redko izvaja, in ohranimo velikost binarnih datotek pod nadzorom, saj podatki profila vplivajo tudi na postavitev kode v pomnilniku.
Pred uvedbo katerega koli novega profila se izvede temeljito preverjanje. Ekipa analizira in primerja vsebino profila (aktivne funkcije, število vzorcev, velikost profila) s prejšnjimi različicami ter ustvari novo sliko jedra z uporabljenim AutoFDO. Spremembe v besedilnem delu (kodi) se nato natančno pregledajo, da se potrdi, da spremembe ustrezajo pričakovanjem.
Vzporedno se izvajajo posebni primerjalni testi, ki preverjajo, ali nova slika ohranja ali izboljšuje ciljne metrike delovanja: čase zagona, čase hladnega zagona aplikacij, pretočnost vmesnika itd. Če je kaj narobe ali se pojavi kakršna koli regresija, se profil prilagodi ali zavrže, preden doseže uporabnike.
Končno, Google ta cevovod izvaja neprekinjeno. Profili se periodično posodabljajo v vejah Androidovega jedra LTS in so integrirani v vsako izdajo GKI. Trenutno je uvajanje osredotočeno na veji android16-6.12 in android15-6.6, vendar je namen razširiti ga na kasnejše različice, kot je prihajajoča android17-6.18.
Rezultati: Kako opazen je AutoFDO v vsakdanjem življenju
Ves ta inženiring bi bil nesmiseln, če ga ne bi podpirale številke. Glede na interne meritve Googla je uporaba AutoFDO v jedru Androida na napravah Pixel dosegla oprijemljive, čeprav zmerne, izboljšave pri več ključnih metrikah.
V laboratorijskih testih je bilo v specifičnih scenarijih zabeleženo povprečno povečanje zmogljivosti za približno 10,5 % , kar doseže približno 85 % koristi, ki bi jo zagotovila klasična optimizacija na podlagi povratnih informacij in instrumentacije. Ključna prednost je, da AutoFDO doseže nekaj zelo podobnega, ne da bi pri tem nastali stroški in kompleksnost instrumentacije kode.
Če pogledamo številke, ki so uporabniku najbolj vidne, Google poroča o zmanjšanju časa zagona sistema za približno 2,1 % in izboljšanju časa zagona hladnih aplikacij za približno 4–4,3 %. To se morda sliši skromno, vendar je pomembno vedeti, da jedro predstavlja približno 40 % celotnega časa procesorja, zato se vsaka prilagoditev na tem mestu odraža v izboljšani splošni zmogljivosti.
Poleg hitrosti optimizacija jedra vpliva tudi na porabo energije. Z reorganizacijo kode, da so pogosto uporabljene poti učinkovitejše , lahko procesor hitreje zaključi operacije in se hitreje vrne v stanje nizke porabe energije. V praksi to pomaga varčevati z baterijo, zlasti med ponavljajočimi se dejanji, kot so preklapljanje med aplikacijami, upravljanje obvestil ali navigacija po vmesniku.
Vse to prispeva k izboljšavam, ki jih AutoFDO že ponuja v uporabniškem prostoru. V sistemu Android se ta tehnologija že dolgo uporablja za optimizacijo izvedljivih datotek in kritičnih knjižnic , z izboljšavami, kot sta 4-odstotno povečanje hitrosti hladnega zagona aplikacij in 1-odstotno zmanjšanje časa zagona naprave zaradi optimizacije uporabniškega prostora. Novost je, da je v ta paket optimizacij zdaj vključeno tudi sistemsko jedro.
Stabilnost in varnost: zakaj AutoFDO ne pokvari sistema
Logično vprašanje pri razpravi o prilagoditvah jedra je, ali bi to lahko vplivalo na stabilnost ali zanesljivost sistema . Google se tega zaveda in je AutoFDO v Androidu zasnoval z zelo konzervativnim pristopom.
Najprej je treba razumeti, da AutoFDO ne spreminja logike izvorne kode. Vpliva pa na hevristiko prevajalnika : odloča, kam vstaviti funkcije (inlining), kako razporediti bloke kode, katerim potem dati prednost v predpomnilniku in tako naprej. Z drugimi besedami, funkcionalnost ostaja enaka; spremeni pa se le način razporeditve kode, tako da jo procesor izvaja z manj truda.
Poleg tega se uporablja pristop »konzervativen po privzetku«. Funkcije, ki se ne pojavljajo v visokozvestnih profilih – ker se v analiziranih scenarijih redko ali nikoli ne izvajajo – se prevedejo z enakimi standardnimi optimizacijami kot vedno . To pomaga preprečiti presenečenja v redkih poteh izvajanja, kot so zelo redke napake ali nenavadno vedenje v robnih primerih.
Pomembno si je tudi zapomniti, da AutoFDO ni strel v temo. Ta tehnologija se že leta uporablja v sistemih Android, ChromeOS in Googlovi strežniški infrastrukturi , pa tudi na drugih platformah, kot standardno orodje za optimizacijo. Pretekle izkušnje kažejo, da ob pravilni uporabi ne prinaša večjih dodatnih tveganj.
Pri Androidu vsak nov profil opravi temeljito testiranje, preden je izdan v vejo jedra LTS. Vsebina profila se primerja s prejšnjimi različicami, analizirajo se nastale binarne datoteke in izvedejo se ciljni primerjalni testi. Šele ko se potrdi, da ni regresij v delovanju ali nestabilnega vedenja, se profil integrira in pripravi za uvajanje v slike GKI.
AutoFDO v AOSP in podpora razvijalcem
Poleg jedra sistem za gradnjo Androida podpira AutoFDO že od različice Android 12, ko omogoča optimizacijo izvornih modulov s posebnimi pravili gradnje . V AOSP (Android Open Source Project) je AutoFDO privzeto omogočen za večino projektov, kjer je zmogljivost ključnega pomena.
Profili, vključeni v AOSP, so bili zbrani iz telefonov in tablic ter odražajo splošne vzorce uporabe. Shranjeni so v imeniku toolchain/pgo-profiles/sampling in se samodejno uporabijo med prevajanjem številnih ustreznih knjižnic in binarnih datotek, kar izboljša delovanje in v mnogih primerih celo zmanjša velikost izvedljivih datotek.
Če želi proizvajalec, prodajalec ali razvijalec uporabiti AutoFDO za dodatne module ali lokalno spremenjeno kodo , ima možnost zbiranja lastnih profilov. To je še posebej uporabno pri dodajanju novih projektov, prilagajanju sistema z veliko kode po meri ali pri zelo specifičnih vzorcih uporabe, ki ne ustrezajo povsem generičnim profilom.
Za pravila gradnje tipa Blueprint je omogočanje AutoFDO tako preprosto kot dodajanje atributa `afdo:true` definiciji deljene knjižnice ali binarne datoteke. Od takrat naprej sistem gradnje ve, da mora med postopkom gradnje poiskati in uporabiti ustrezen profil AutoFDO.
Android podpira zbiranje profilov v napravah x86, x86_64, ARM in ARM64 , te profile pa je mogoče ponovno uporabiti v različnih arhitekturah. Za zbiranje podatkov v sistemu ARM so dokumentirani postopki, ki temeljijo na razširitvi sledenja (ETM), medtem ko se v sistemu x86 uporabljajo zmogljivosti, kot je zapis zadnje veje (LBR). Poleg tega obstaja Profcollect, mehanizem za avtomatizacijo zbiranja, obdelave in nalaganja profilov v ozadju , zasnovan posebej za te scenarije.
Ko so profili AutoFDO ustvarjeni, jih je mogoče pregledati s standardnimi orodji LLVM, kot je llvm-profdata . Skripti, kot je afdo_summary.sh, vam omogočajo hiter pregled funkcij, ki so v posameznem profilu najbolj aktivne, kar olajša tako diagnostiko kot tudi optimizacijo delovanja.
Načrti za prihodnost: večja pokritost in bolj optimizirane komponente
Trenutna uvedba AutoFDO v jedru se osredotoča na veji android16-6.12 in android15-6.6, vendar Google že gleda dlje v prihodnost. Namen je razširiti pokritost na novejše različice GKI , vključno s tisto, ki je načrtovana za Android 17 (android17-6.18) in druge ciljne različice, ki presegajo aarch64.
Zaenkrat se je optimizacija osredotočila predvsem na glavno binarno datoteko jedra (vmlinux) . Naslednji logični korak pa je razširitev AutoFDO tudi na module GKI, ki predstavljajo pomemben del podsistema jedra in pokrivajo specifične funkcionalnosti, ki vplivajo tudi na delovanje sistema.
Druga odprta fronta je morebitna združljivost z moduli proizvajalcev, zgrajenimi s kompletom za razvoj gonilnikov (DDK) . Ker sistem za gradnjo (Kleaf) in orodja za profiliranje (simpleperf) že podpirajo AutoFDO, obstaja trdna osnova za proizvajalce, da isto tehniko uporabijo za lastne gonilnike strojne opreme in tako dodatno izboljšajo delovanje svojih specifičnih naprav.
Google razmišlja tudi o širitvi raznolikosti uporabniških profilov z vključitvijo dodatnih kritičnih uporabniških poti (CUJ), ki bi zajemale širši nabor resničnih situacij: igranje iger, večpredstavnost, zahtevno večopravilnost in drugo. Bolj kot je zbirka profilov raznolika, bolj natančna bo optimizacija, ne da bi pri tem izgubila splošnost, ki je potrebna za dobro delovanje na milijonih naprav.
Na splošno je AutoFDO del širše strategije, s katero si Google prizadeva ohraniti konkurenčnost Androida, ne le z dodajanjem privlačnih funkcij za uporabnika, temveč tudi z izboljšanjem notranje učinkovitosti operacijskega sistema . V tako raznolikem ekosistemu s tisoči različnih modelov te izboljšave na nižji ravni pomagajo, da se celo skromna strojna oprema odziva bolje, saj telefoni višjega cenovnega razreda kar najbolje izkoristijo njihove vire.
Na koncu se vse to delo AutoFDO na Androidu za uporabnika prevede v nekaj precej preprostega: sistem, ki se odziva nekoliko hitreje, deluje nekoliko bolj gladko ter pametneje uporablja procesor in baterijo , brez skritih menijev ali zapletenih nastavitev, preprosto zato, ker se programska oprema uči od tega, kako jo dejansko uporabljamo.
Strasten pisec o svetu bajtov in tehnologije nasploh. Rad delim svoje znanje s pisanjem in to je tisto, kar bom počel v tem blogu, saj vam bom pokazal vse najbolj zanimive stvari o pripomočkih, programski opremi, strojni opremi, tehnoloških trendih in še več. Moj cilj je, da vam pomagam krmariti po digitalnem svetu na preprost in zabaven način.