API-ul Fabricated Overlay din Android 12 readuce temele fără rădăcini

Îți amintești cum Android 8 a făcut ușoară tematica dispozitivului tău? Îți amintești cât de distractiv a fost? Ei bine, a revenit în Android 12, cu o întorsătură.

Grajdul complet Android 12 lansarea este chiar după colț, iar Google are chiar a postat codul sursă la repo-ul său AOSP. Există o multe lucruri noi în Android 12, inclusiv o completare la suprapunerile de resurse numite Suprapuneri fabricate. Ce a fost menit ca API pentru a ajuta sistemul să gestioneze schimbările dinamice utilizate în Material tu iar banii se pot transforma în ceva mult mai mare -- cel puțin până la lansarea Android 13.

fundal

Mishaal Rahman a descoperit acest nou API și mi-a adus-o în atenție. El a folosit comanda shell pentru a testa diferite valori ale resurselor în Android 12 fără a avea pentru a compila manual APK-uri suprapuse și s-a gândit că ar putea fi o idee interesantă de aplicație pentru dispozitivele înrădăcinate. Când mi-a adus-o în atenție, am luat mult la codul sursă pentru Android 12 și am observat ceva ce mi s-a părut destul de interesant. Am testat ceea ce am găsit și acum suntem aici - după cum se dovedește, API-ul Fabricated Overlay poate fi folosit pentru a readuce temele fără rădăcini. Înainte de a ajunge prea departe în ceea ce se întâmplă aici, voi explica ce sunt de fapt suprapunerile fabricate.

Ce sunt suprapunerile fabricate?

Suprapunerile fabricate sunt o funcție nouă introdusă în Android 12. Sunt similare cu suprapunerile clasice de resurse de rulare (RRO) pe care Android le are de câțiva ani. Atât RRO-urile, cât și suprapunerile fabricate pot suprascrie resurse diferite pentru aplicații diferite. Puteți schimba un boolean din false în adevărat (sau invers), puteți stabili cât de mare doriți să fie bara de stare și așa mai departe.

Suprapunerile fabricate au unele diferențe notabile față de RRO, totuși. În primul rând, nu trebuie să generați un APK suprapus și apoi să îl instalați. În schimb, spuneți doar lui Android ce valori doriți să modificați pentru ce aplicație și se ocupă de înregistrarea modificărilor dvs. ca suprapunere pe care o puteți activa apoi.

De asemenea, sunt puțin mai limitate decât RRO. Înainte de Android 11, RRO-urile puteau suprascrie aproape orice resursă: boolean, numere întregi, dimensiuni, atribute, aspecte și chiar fișiere de date brute. Android 11 a adus unele modificări în modul în care funcționează RRO-urile, făcând ca layout-urile să nu mai fie cu adevărat fezabile, deși a făcut ca RRO-urile să fie mai stabile în general.

Suprapunerile fabricate, pe de altă parte, pot suprascrie numai valorile care pot fi reprezentate ca numere întregi. Aceasta include numere întregi (duh), dimensiuni, booleeni și culori. Nu le puteți folosi pentru a suprascrie resurse de date brute, machete, șiruri de caractere sau matrice - cel puțin nu ușor. Aceasta este oarecum o limitare arbitrară în API: acceptă numai valori întregi și categorii de resurse așa cum sunt definite de clasa TypedValue. TypedValue face a sustine șiruri de caractere și alte tipuri de resurse, dar numai pentru a face referire la resursa lor, nu a păstra datele lor reale.

Cu toate acestea, aceste limitări nu sunt o afacere prea mare pentru scopul propus de Suprapuneri fabricate: Materialul dvs. și efectele monetare. Suprapunerile fabricate facilitează ca sistemul să genereze și să aplice suprapuneri de culori și dimensiuni din mers, fără a fi nevoie să reporniți sau să așteptați ca un APK să fie compilat.

Acum, în mod normal, acesta ar fi doar un alt API ordonat de care să profite persoanele cu dispozitive înrădăcinate. Cu excepția cazului în care există o lacună creată de producător (cum ar fi cea de care profită Synergy pe dispozitivele Samsung), suprapunerile pot fi instalate numai de terțe părți cu acces root. Totuși, aceasta este cea mai bună parte - Google a uitat să corecteze o gaură în Android 12.

Suprapuneri fabricate fără rădăcină

Android 8 a introdus noul API Overlay Manager Service (sau OMS), iar oamenii au descoperit destul de repede că APK-urile suprapuse pot fi instalate ca aplicații normale și apoi activate folosind ADB. Din păcate, Google a corectat acest lucru în Android 9 și, de atunci, numai suprapunerile semnate cu aceeași cheie ca și sistemul pot fi instalate dinamic.

După cum se dovedește, suprapunerile fabricate ale Android 12 au o lacună care amintește de cea prezentă în Android 8: nu au nevoie de acces la rădăcină sau permisiuni la nivel de semnătură. Au nevoie doar de ceva care rulează ca utilizator shell (adică, ADB) pentru a-i înregistra.

Este destul de clar că Google a intenționat ca suprapunerile fabricate să fie accesibile numai utilizatorilor rădăcină și de sistem. Există o implementare de comandă ADB pentru crearea acestora și nu va rula dacă utilizatorul care execută nu este root. Lacuna este că verificarea este doar în comandă, nu în API-ul propriu-zis, ceea ce înseamnă că putem profita de ea cu puțină muncă.

ADB pe dispozitiv

De mult timp, Android are o funcție ADB wireless. Acest lucru permite unui computer (sau orice lucru cu un binar ADB și acces la rețea) să se conecteze la un dispozitiv fără fir. Este destinat în principal dispozitivelor Android care nu au conexiuni USB accesibile utilizatorului, cum ar fi ceasuri inteligente și televizoare. În plus, înainte de Android 11, aveai nevoie de o conexiune ADB prin cablu pentru a activa modul wireless.

Android 11 este cel care a adus oficial ADB wireless pe telefoane și tablete. Este puțin mai complicat decât clasicul ADB wireless, cu coduri de asociere și autentificare, dar poate fi activat de utilizator complet pe dispozitiv, atâta timp cât dispozitivul este conectat la WiFi. Aceasta înseamnă că este posibil să vă conectați la dispozitiv prin ADB de pe dispozitiv și tot ce aveți nevoie este un WiFi conexiune.

Utilizarea API-urilor ridicate într-o aplicație

Există o mulțime de motive pentru care ați putea dori să utilizați API-uri restricționate în aplicația dvs. De obicei, este pentru că oferă unele funcționalități speciale de care aveți nevoie. Atâta timp cât API-ul de care aveți nevoie are o implementare de comandă shell, este destul de ușor să îl utilizați dintr-o aplicație. Tot ce trebuie să faceți este să creați un proces shell ca root (sau ADB), să rulați comanda corectă și să analizați rezultatul, dacă există.

Ce se întâmplă dacă API-ului nu are o implementare shell sau implementării shell îi lipsește ceva de care aveți nevoie? Dacă sunteți pe un dispozitiv rootat, puteți utiliza ceva de genul libRootJava. libRootJava vă permite să interacționați cu API-urile cadru Android ca și cum aplicația dvs. rulează ca utilizator root. Acest lucru este mai convenabil și mult mai rapid decât rularea comenzilor shell, deoarece toate sunt în aceeași limbă și nu trebuie să vă faceți griji cu privire la analizarea manuală a șirurilor. Are unele limitări, dar, în cea mai mare parte, funcționează grozav.

API-ul libRootJava este destul de flexibil. L-ați putea adapta pentru a rula ca utilizator shell în loc de root. Din fericire, nu trebuie, pentru că cineva a făcut-o deja și se numește Shizuku. Shizuku este aproape ca o combinație de Magisk Manager și libRootJava.

Aplicația Shizuku Manager vă ghidează prin configurarea unui proces care rulează ca utilizator shell pe care Shizuku îl poate accesa. Biblioteca Shizuku API poate fi implementată în aplicații pentru a le permite să acceseze API-urile de sistem ca și cum ar fi utilizatorul shell. Este un proces mult mai centralizat decât libRootJava, deoarece Shizuku trebuie configurat o singură dată înainte ca fiecare aplicație care implementează biblioteca API Shizuku să o poată utiliza. Dacă sunteți interesat de modul în care funcționează Shizuku și cum îl puteți integra în aplicația dvs., Am un ghid pentru asta aici.

Shizuku și suprapuneri fabricate

Până acum, probabil că puteți vedea unde se duce asta. Putem folosi un serviciu precum Shizuku pentru a accesa API-ul Fabricated Overlays ca utilizator shell și putem folosi caracteristica ADB wireless a Android 11 pentru a obține acces la nivel de shell, totul pe dispozitiv. Deoarece restricția utilizatorului rădăcină este prezentă doar în comanda shell Fabricated Overlays și nu în API-ul real, rularea ca utilizator shell este suficientă pentru ao utiliza direct.

Implementare: Bibliotecă și aplicație de mostre

Dar detaliile de implementare? Ei bine, te-am acoperit și pentru asta.

În pregătirea pentru aceasta, am făcut atât a bibliotecă și o aplicație eșantion complet funcțională folosind acea bibliotecă.

Biblioteca în sine este în mare parte pentru comoditate. Acesta include unele dintre API-urile de sistem ascunse și vă oferă câteva metode convenabile pentru gestionarea permisiunilor Shizuku. De asemenea, este flexibil, astfel încât să puteți furniza propria instanță a API-ului IOverlayManager dacă aveți o altă modalitate de a o prelua.

Exemplul de aplicație arată cum puteți implementa biblioteca folosind Shizuku. Este, de asemenea, o aplicație complet funcțională și utilă. Pagina principală afișează suprapunerile fabricate înregistrate în prezent, care au fost create prin intermediul acesteia, grupate după aplicația țintă. Le puteți activa, dezactiva și șterge și de acolo.

Atingerea butonului „Adăugați suprapunere” din partea de jos vă duce la o listă cu toate aplicațiile care se pot suprapune. Căutați sau derulați pentru a găsi pe cel de care aveți nevoie și atingeți-l. Apoi puteți apăsa butonul „Adăugați” din partea de jos a ecranului pentru a vedea lista de resurse care pot fi înlocuite în aplicația respectivă. Selectați o resursă, setați-i valoarea și repetați pentru câte valori doriți să modificați. Apăsați butonul „Salvați”, introduceți un nume, confirmați și veți fi adus înapoi la ecranul principal, afișând acum noua suprapunere, gata pentru a fi activată.

Iată câteva capturi de ecran din aplicație, mulțumită lui Mishaal Rahman.

Ca o notă secundară, am și o aplicație generală de gestionare a suprapunerilor numită... Manager de suprapunere. Aplicația precompilată în sine este disponibil numai pe Patreon-ul meu, cu exceptia codul sursă este disponibil gratuit oricui dorește să îl compileze sau să îl modifice.

Concluzie

Noul API Fabricated Overlays din Android 12 este destul de grozav, mai ales pentru că nu are nevoie de root. Poate că nu este la fel de sofisticat ca un APK RRO complet, dar vă oferă mult mai multă flexibilitate fără acces la root.

Consultați aplicația Fabricate Overlay pe GitHub

Dacă aveți un dispozitiv care rulează Android 12 și doriți să încercați, consultați depozitul GitHub de mai sus. Secțiunea Lansări va avea un APK de descărcat și utilizat. Biblioteca ar trebui să fie ușor de inclus în propria aplicație folosind JitPack.

Desigur, nu ar trebui să vă așteptați ca această caracteristică să rămână mult timp. Google chiar nu-i plac suprapunerile de la terțe părți, așa că acest lucru va fi aproape sigur remediat când Android 13 va fi lansat. Între timp, însă, bucurați-vă de el cât durează!