Pamätáte si, ako vám Android 8 uľahčil tému vášho zariadenia? Pamätáte si, aká to bola zábava? No, je to späť v systéme Android 12, s obratom.
Kompletná stajňa Android 12 vydanie je hneď za rohom a Google má dokonca zverejnil zdrojový kód do svojho repo AOSP. Existuje a veľa noviniek v systéme Android 12, vrátane doplnku k prekrytiam prostriedkov s názvom Vyrobené prekrytia. Čo bolo myslené ako API, ktoré má pomôcť systému spravovať dynamické zmeny používané v Material You a monet sa môže zmeniť na niečo oveľa väčšie – aspoň do vydania Androidu 13.
Pozadie
Mishaal Rahman objavil toto nové API a upozornil ma naň. Používal na to príkaz shell na testovanie rôznych hodnôt zdrojov v systéme Android 12 bez toho, aby to musel manuálne zostaviť prekryvné súbory APK a myslel si, že by to mohol byť zaujímavý nápad na aplikáciu pre zakorenené zariadenia. Keď ma na to upozornil, veľa som si pozrel zdrojový kód pre Android 12 a všimol som si niečo, čo som považoval za celkom zaujímavé. Otestoval som, čo som našiel, a teraz sme tu -- ako sa ukázalo, rozhranie Fabricated Overlay API možno použiť na obnovenie tém bez koreňov. Než sa dostanem príliš ďaleko do toho, čo sa tu deje, vysvetlím, čo to vlastne Fabricated Overlays sú.
Čo sú vyrobené prekrytia?
Vyrobené prekrytia sú novou funkciou zavedenou v systéme Android 12. Sú podobné klasickým prekrytiam zdrojov runtime (RRO), ktoré má Android už niekoľko rokov. RRO aj vyrobené prekrytia môžu prepísať rôzne zdroje pre rôzne aplikácie. Môžete zmeniť boolean z false na true (alebo naopak), nastaviť, aký veľký má byť stavový riadok atď.
Vyrobené prekrytia však majú určité výrazné rozdiely od RRO. Po prvé, nemusíte generovať prekryvný súbor APK a potom ho nainštalovať. Namiesto toho len poviete systému Android, ktoré hodnoty chcete zmeniť pre ktorú aplikáciu, a on sa postará o zaregistrovanie vašich zmien ako prekrytie, ktoré potom môžete povoliť.
Sú tiež o niečo obmedzenejšie ako RRO. Pred Androidom 11 mohli RRO prepísať takmer akýkoľvek zdroj: boolovské hodnoty, celé čísla, dimenzie, atribúty, rozloženia a dokonca aj súbory s nespracovanými údajmi. Android 11 urobil niekoľko zmien v tom, ako fungujú RRO, takže prepisovanie rozloženia už nie je reálne možné, aj keď vďaka tomu boli RRO celkovo stabilnejšie.
Na druhej strane, vyrobené prekrytia môžu prepísať iba hodnoty, ktoré možno reprezentovať ako celé čísla. To zahŕňa celé čísla (duh), rozmery, boolovské hodnoty a farby. Nemôžete ich použiť na prepísanie zdrojov nespracovaných údajov, rozložení, reťazcov alebo polí – aspoň nie ľahko. Toto je do istej miery svojvoľné obmedzenie v rozhraní API: akceptuje iba celočíselné hodnoty a kategórie zdrojov, ako sú definované triedou TypedValue. TypedValue áno podpora reťazcov a iných typov zdrojov, ale iba na odkazovanie na ich zdroj, nie na uchovávanie ich skutočných údajov.
Tieto obmedzenia však nie sú príliš veľké na zamýšľaný účel efektov Fabricated Overlays: Material You a monet. Vytvorené prekrytia uľahčujú systému generovať a aplikovať farebné a rozmerové prekrytia za behu bez toho, aby ste museli reštartovať alebo čakať na kompiláciu súboru APK.
Teraz by to za normálnych okolností bolo len ďalšie úhľadné API, ktoré môžu využiť ľudia s rootnutými zariadeniami. Pokiaľ neexistuje medzera vytvorená výrobcom (ako tá, ktorú využíva Synergy na zariadeniach Samsung), prekrytia môžu inštalovať iba tretie strany s prístupom root. To je však to najlepšie – Google zabudol opraviť dieru v systéme Android 12.
Vyrobené prekrytia bez koreňa
Android 8 predstavil nové rozhranie Overlay Manager Service (alebo OMS) API a ľudia veľmi rýchlo zistili, že prekryvné súbory APK možno nainštalovať ako bežné aplikácie a potom povoliť pomocou ADB. Je smutné, že Google to opravil v systéme Android 9 a odvtedy je možné dynamicky inštalovať iba prekrytia podpísané rovnakým kľúčom ako systém.
Ako sa ukázalo, vyrobené prekrytia systému Android 12 majú medzeru pripomínajúcu tú v systéme Android 8: nepotrebujú prístup root ani povolenia na úrovni podpisov. Potrebujú len niečo, čo beží ako používateľ shellu (t. j. ADB), aby ich zaregistrovali.
Je celkom jasné, že spoločnosť Google zamýšľala, aby boli vyrobené prekrytia prístupné iba pre používateľov root a používateľov systému. Na ich vytváranie existuje implementácia príkazov ADB a nespustí sa, ak spustený používateľ nie je root. Medzera je v tom, že kontrola je iba v príkaze, nie v skutočnom API, čo znamená, že to môžeme využiť s trochou práce.
ADB na zariadení
Už dlho má Android funkciu bezdrôtového ADB. To umožňuje počítaču (alebo čomukoľvek s binárnym ADB a sieťovým prístupom) pripojiť sa k zariadeniu bezdrôtovo. Väčšinou je určený pre zariadenia so systémom Android, ktoré nemajú užívateľsky prístupné USB pripojenia, napr inteligentné hodinky a televízory. Okrem toho, pred Androidom 11 ste na aktiváciu potrebovali káblové pripojenie ADB bezdrôtový režim.
Android 11 oficiálne priniesol bezdrôtovú ADB do telefónov a tabletov. Je to trochu komplikovanejšie ako klasické bezdrôtové ADB, s párovacími a autentifikačnými kódmi, ale môže byť aktivované používateľom úplne na zariadení, pokiaľ je zariadenie pripojené k WiFi. To znamená, že je možné pripojiť sa k vášmu zariadeniu cez ADB z vášho zariadenia a všetko, čo potrebujete, je WiFi spojenie.
Používanie vylepšených rozhraní API v aplikácii
Existuje mnoho dôvodov, prečo by ste mohli chcieť vo svojej aplikácii používať obmedzené rozhrania API. Zvyčajne je to preto, že poskytujú niektoré špeciálne funkcie, ktoré potrebujete. Pokiaľ má API, ktoré potrebujete, implementáciu príkazu shell, je celkom jednoduché ho používať z aplikácie. Všetko, čo musíte urobiť, je vytvoriť proces shellu ako root (alebo ADB), spustiť správny príkaz a analyzovať výsledok, ak existuje.
Čo ak API nemá implementáciu shellu alebo implementácii shellu chýba niečo, čo potrebujete? Ak ste na rootovanom zariadení, môžete použiť niečo ako libRootJava. libRootJava vám umožňuje interagovať s rozhraním API systému Android, ako keby bola vaša aplikácia spustená ako používateľ root. Je to pohodlnejšie a oveľa rýchlejšie ako spúšťanie príkazov shellu, pretože je to všetko v rovnakom jazyku a nemusíte sa obávať ručnej analýzy reťazcov. Má určité obmedzenia, ale väčšinou to funguje skvele.
Rozhranie libRootJava API je dosť flexibilné. Môžete ho prispôsobiť tak, aby bežal ako používateľ shellu namiesto root. Našťastie nemusíte, pretože to už niekto urobil a volá sa to Shizuku. Shizuku je takmer ako kombinácia Magisk Manager a libRootJava.
Aplikácia Shizuku Manager vás prevedie nastavením procesu spusteného ako používateľ prostredia, ku ktorému má Shizuku prístup. Knižnica Shizuku API môže byť implementovaná do aplikácií, aby im umožnila prístup k systémovým API, ako keby boli používateľom shellu. Je to oveľa centralizovanejší proces ako libRootJava, pretože Shizuku je potrebné nastaviť iba raz, kým ho bude môcť používať každá aplikácia implementujúca knižnicu API Shizuku. Ak vás zaujíma, ako Shizuku funguje a ako ho môžete integrovať do svojej aplikácie, Mám tu na to návod.
Shizuku a vyrobené prekrytia
Teraz už pravdepodobne vidíte, kam to smeruje. Službu ako Shizuku môžeme použiť na prístup k Fabricated Overlays API ako používateľ prostredia a môžeme použiť funkciu bezdrôtového ADB systému Android 11 na získanie prístupu na úrovni prostredia, a to všetko na zariadení. Keďže obmedzenie používateľa root je prítomné iba v príkaze prostredia Fabricated Overlays a nie v skutočnom rozhraní API, na priame použitie stačí spustenie ako používateľ prostredia.
Implementácia: Knižnica a vzorová aplikácia
A čo detaily implementácie? No, aj na to som vás prikryl.
V rámci prípravy na to som urobil obe a knižnica a plne funkčná vzorová aplikácia pomocou tejto knižnice.
Samotná knižnica slúži hlavne na pohodlie. Zabalí niektoré zo skrytých systémových rozhraní API a poskytne vám niekoľko pohodlných metód na spracovanie povolení Shizuku. Je tiež flexibilný, takže môžete poskytnúť svoju vlastnú inštanciu rozhrania IOverlayManager API, ak máte iný spôsob, ako ho získať.
Vzorová aplikácia ukazuje, ako môžete implementovať knižnicu pomocou Shizuku. Je to tiež plne funkčná a užitočná aplikácia. Hlavná stránka zobrazuje aktuálne zaregistrované vyrobené prekrytia, ktoré boli prostredníctvom nej vytvorené, zoskupené podľa cieľovej aplikácie. Odtiaľ ich môžete povoliť, zakázať a odstrániť.
Klepnutím na tlačidlo „Pridať prekrytie“ v dolnej časti sa dostanete na zoznam všetkých aplikácií, ktoré možno prekryť. Vyhľadajte alebo rolujte, aby ste našli ten, ktorý potrebujete, a klepnite naň. Potom môžete stlačením tlačidla „Pridať“ v dolnej časti obrazovky zobraziť zoznam zdrojov, ktoré je možné v danej aplikácii prepísať. Vyberte zdroj, nastavte jeho hodnotu a opakujte pre toľko hodnôt, koľko chcete zmeniť. Stlačte tlačidlo „Uložiť“, zadajte názov, potvrďte a vrátite sa späť na hlavnú obrazovku, ktorá teraz zobrazuje nové prekrytie, pripravené na aktiváciu.
Tu je niekoľko snímok obrazovky z aplikácie, vďaka Mishaalovi Rahmanovi.
Ako vedľajšiu poznámku mám aj aplikáciu na správu všeobecných prekrytí s názvom... Správca prekrytia. Samotná predkompilovaná aplikácia je dostupné iba na mojom Patreone, ale zdrojový kód je voľne dostupný každému, kto ho chce skompilovať alebo upraviť.
Záver
Nové rozhranie Fabricated Overlays API v systéme Android 12 je celkom skvelé, hlavne preto, že nepotrebuje root. Nemusí to byť také sofistikované ako úplný súbor RRO APK, ale poskytuje vám oveľa väčšiu flexibilitu bez prístupu root.
Pozrite si aplikáciu Fabricate Overlay na GitHub
Ak máte zariadenie so systémom Android 12 a chcete to vyskúšať, pozrite si úložisko GitHub prepojené vyššie. Sekcia Vydania bude obsahovať súbor APK na stiahnutie a použitie. Knižnicu by malo byť jednoduché zahrnúť do vašej vlastnej aplikácie pomocou JitPack.
Samozrejme, nemali by ste očakávať, že táto funkcia zostane dlho. Google naozaj nemá rád prekrytia tretích strán, takže to bude takmer určite opravené po vydaní systému Android 13. Zatiaľ si to však užite, kým to ide!