Rozhraní Fabricated Overlay API systému Android 12 přináší témata bez kořenů

Pamatujete si, jak Android 8 usnadnil motiv vašeho zařízení? Pamatujete si, jaká to byla zábava? No, je to zpět v Androidu 12, s obratem.

Kompletní stáj Android 12 vydání je hned za rohem a Google dokonce zveřejnil zdrojový kód do svého repo AOSP. Je tu mnoho novinek v Androidu 12, včetně dodatku k překryvům prostředků nazvaným Vyrobené překryvy. Co bylo myšleno jako API, které má pomoci systému spravovat dynamické změny používané v Materiál vás a monet se může proměnit v něco mnohem většího – alespoň do vydání Androidu 13.

Pozadí

Mishaal Rahman objevil toto nové API a upozornil mě na něj. Používal pro to příkaz shell k testování různých hodnot zdrojů v Androidu 12, aniž by to musel ručně zkompilovat překryvné soubory APK a myslel si, že by to mohl být zajímavý nápad na aplikaci pro rootovaná zařízení. Když mě na to upozornil, hodně jsem se podíval na zdrojový kód pro Android 12 a všiml jsem si něčeho, co jsem považoval za docela zajímavé. Testoval jsem, co jsem našel, a teď jsme tady -- jak se ukázalo, rozhraní Fabricated Overlay API lze použít k obnovení témat bez kořenů. Než se dostanu příliš daleko do toho, co se zde děje, vysvětlím, co to vlastně Fabricated Overlays jsou.

Co jsou to vyrobené překryvy?

Fabricated Overlays jsou novou funkcí zavedenou v Androidu 12. Podobají se klasickým překryvům běhových prostředků (RRO), které má Android již několik let. RRO i Fabricated Overlays mohou přepsat různé zdroje pro různé aplikace. Můžete změnit boolean z false na true (nebo naopak), nastavit, jak velký má být stavový řádek a tak dále.

Fabricated Overlays však mají určité výrazné rozdíly od RRO. Za prvé nemusíte generovat překryvný soubor APK a poté jej instalovat. Místo toho pouze sdělíte systému Android, které hodnoty chcete změnit pro kterou aplikaci, a on se postará o registraci vašich změn jako překryvnou vrstvu, kterou pak můžete povolit.

Jsou také o něco omezenější než RRO. Před Androidem 11 mohly RRO přepsat téměř jakýkoli zdroj: booleovské hodnoty, celá čísla, dimenze, atributy, rozvržení a dokonce i soubory nezpracovaných dat. Android 11 provedl určité změny ve způsobu fungování RRO, takže přepisování rozvržení již není ve skutečnosti proveditelné, i když díky tomu byly RRO celkově stabilnější.

Na druhou stranu, vyrobená překrytí mohou přepsat pouze hodnoty, které lze reprezentovat jako celá čísla. To zahrnuje celá čísla (duh), dimenze, booleovské hodnoty a barvy. Nemůžete je použít k přepsání zdrojů nezpracovaných dat, rozložení, řetězců nebo polí – alespoň ne snadno. Toto je poněkud svévolné omezení v rozhraní API: přijímá pouze celočíselné hodnoty a kategorie prostředků definované třídou TypedValue. TypedValue ano Podpěra, podpora řetězce a další typy zdrojů, ale pouze k odkazování na jejich zdroj, nikoli k uložení jejich skutečných dat.

Tato omezení však nejsou příliš velká pro zamýšlený účel Fabricated Overlays: Material You a monet efektů. Vytvořené překryvy usnadňují systému generování a aplikaci překryvných barev a rozměrů za chodu, aniž byste museli restartovat nebo čekat na kompilaci souboru APK.

Normálně by to bylo jen další úhledné API, které mohou využít lidé s rootovanými zařízeními. Pokud neexistuje mezera vytvořená výrobcem (jako ta, kterou Synergy využívá na zařízeních Samsung), mohou překryvy instalovat pouze třetí strany s přístupem root. To je však to nejlepší – Google zapomněl opravit díru v Androidu 12.

Vyrobené překryvy bez kořene

Android 8 představil nové rozhraní Overlay Manager Service (nebo OMS) API a lidé velmi rychle zjistili, že překryvné soubory APK lze nainstalovat jako normální aplikace a poté je povolit pomocí ADB. Google to bohužel opravil v Androidu 9 a od té doby lze dynamicky instalovat pouze překryvy podepsané stejným klíčem jako systém.

Jak se ukázalo, Fabricated Overlays systému Android 12 mají mezeru připomínající tu, která je v systému Android 8: nepotřebují přístup root ani oprávnění na úrovni podpisu. Potřebují jen něco, co běží jako uživatel shellu (tj. ADB), aby je zaregistrovalo.

Je celkem jasné, že Google zamýšlel, aby Fabricated Overlays byly přístupné pouze uživatelům root a systému. Pro jejich vytváření existuje implementace příkazu ADB, který se nespustí, pokud spouštějící uživatel není root. Mezera je v tom, že kontrola je pouze v příkazu, nikoli ve skutečném API, což znamená, že toho můžeme s trochou práce využít.

ADB na zařízení

Android má již dlouhou dobu bezdrátovou funkci ADB. To umožňuje počítači (nebo čemukoli s binárním a síťovým přístupem ADB) připojit se k zařízení bezdrátově. Je většinou určen pro zařízení Android, která nemají uživatelsky přístupná připojení USB, jako např chytré hodinky a televizory. Před Androidem 11 jste navíc k aktivaci potřebovali kabelové připojení ADB bezdrátový mód.

Android 11 je to, co oficiálně přineslo bezdrátové ADB do telefonů a tabletů. Je to trochu složitější než klasické bezdrátové ADB, s párovacími a ověřovacími kódy, ale může být aktivováno uživatelem zcela na zařízení, pokud je zařízení připojeno k WiFi. To znamená, že je možné se k vašemu zařízení připojit přes ADB z vašeho zařízení a vše, co potřebujete, je WiFi spojení.

Používání vylepšených rozhraní API v aplikaci

Existuje mnoho důvodů, proč byste mohli chtít ve své aplikaci používat omezená rozhraní API. Obvykle je to proto, že poskytují některé speciální funkce, které potřebujete. Dokud má rozhraní API, které potřebujete, implementaci příkazu shellu, je docela snadné jej používat z aplikace. Vše, co musíte udělat, je vytvořit proces shellu jako root (nebo ADB), spustit správný příkaz a analyzovat výsledek, pokud existuje.

Co když API nemá implementaci shellu nebo implementace shellu postrádá něco, co potřebujete? Pokud jste na rootovaném zařízení, můžete použít něco jako libRootJava. libRootJava vám umožňuje pracovat s rozhraními API rozhraní Android, jako by vaše aplikace běžela jako uživatel root. Je to pohodlnější a mnohem rychlejší než spouštění příkazů shellu, protože je to všechno ve stejném jazyce a nemusíte se starat o ruční analýzu řetězců. Má to určitá omezení, ale z velké části to funguje skvěle.

libRootJava API je docela flexibilní. Můžete jej upravit tak, aby běžel jako uživatel shellu namísto root. Naštěstí nemusíte, protože to už někdo vyrobil a říká se tomu Shizuku. Shizuku je skoro jako kombinace Magisk Manageru a libRootJava.

Aplikace Shizuku Manager vás provede nastavením procesu spuštěného jako uživatel prostředí, ke kterému má Shizuku přístup. Knihovnu Shizuku API lze implementovat do aplikací, které jim umožní přistupovat k systémovým rozhraním API, jako by byly uživatelem shellu. Je to mnohem centralizovanější proces než libRootJava, protože Shizuku je třeba nastavit pouze jednou, než jej bude moci používat každá aplikace implementující knihovnu API Shizuku. Pokud vás zajímá, jak Shizuku funguje a jak jej můžete integrovat do vaší aplikace, Mám na to tady návod.

Shizuku a vyrobené překryvy

Teď už asi vidíte, kam to směřuje. Můžeme použít službu, jako je Shizuku, pro přístup k Fabricated Overlays API jako uživatel prostředí a můžeme použít funkci bezdrátového ADB systému Android 11 k získání přístupu na úrovni shellu, vše na zařízení. Vzhledem k tomu, že omezení uživatele root je přítomno pouze v příkazu prostředí Fabricated Overlays a nikoli ve skutečném rozhraní API, stačí spuštění jako uživatel prostředí k jeho přímému použití.

Implementace: Knihovna a ukázková aplikace

A co detaily implementace? No, mám tě na to taky.

V rámci přípravy na to jsem udělal oba a knihovna a plně funkční ukázková aplikace pomocí té knihovny.

Knihovna samotná slouží především pro pohodlí. Zabaluje některá ze skrytých systémových API a poskytuje vám několik pohodlných metod pro manipulaci s oprávněními Shizuku. Je také flexibilní, takže můžete poskytnout svou vlastní instanci rozhraní IOverlayManager API, pokud máte jiný způsob, jak jej získat.

Ukázková aplikace ukazuje, jak byste mohli postupovat při implementaci knihovny pomocí Shizuku. Je to také plně funkční a užitečná aplikace. Na hlavní stránce se zobrazují aktuálně zaregistrované vytvořené překryvy, které byly vytvořeny prostřednictvím ní, seskupené podle cílové aplikace. Odtud je také můžete povolit, zakázat a odstranit.

Klepnutím na tlačítko „Přidat překrytí“ v dolní části se dostanete na seznam všech překryvných aplikací. Vyhledejte nebo posuňte se, abyste našli ten, který potřebujete, a klepněte na něj. Poté můžete stisknutím tlačítka „Přidat“ ve spodní části obrazovky zobrazit seznam zdrojů, které lze v dané aplikaci přepsat. Vyberte zdroj, nastavte jeho hodnotu a opakujte pro tolik hodnot, kolik chcete změnit. Stiskněte tlačítko „Uložit“, zadejte název, potvrďte a vrátíte se zpět na hlavní obrazovku, která nyní zobrazuje nové překrytí, připravené k aktivaci.

Zde jsou některé snímky obrazovky z aplikace, díky Mishaal Rahman.

Jako vedlejší poznámku mám také aplikaci pro správu obecných překryvů s názvem... Správce překrytí. Samotná předkompilovaná aplikace je k dispozici pouze na mém Patreonu, ale zdrojový kód je volně dostupný každému, kdo jej chce zkompilovat nebo upravit.

Závěr

Nové API Fabricated Overlays v Androidu 12 je docela skvělé, hlavně proto, že nepotřebuje root. Nemusí to být tak sofistikované jako full-on RRO APK, ale poskytuje vám mnohem větší flexibilitu bez přístupu root.

Podívejte se na aplikaci Fabricate Overlay na GitHubu

Pokud máte zařízení se systémem Android 12 a chcete to vyzkoušet, podívejte se na výše odkazované úložiště GitHub. Sekce Releases bude obsahovat soubor APK ke stažení a použití. Knihovnu by mělo být snadné zahrnout do vaší vlastní aplikace pomocí JitPack.

Samozřejmě byste neměli očekávat, že tato funkce zůstane dlouho. Google opravdu nemá rád překryvy třetích stran, takže to bude téměř určitě opraveno, až bude Android 13 uvolněn. Zatím si to ale užijte, dokud to jde!