Ricordi come Android 8 ha reso facile personalizzare il tuo dispositivo? Ricordi quanto è stato divertente? Bene, è tornato in Android 12, con una svolta.
La scuderia completa Androide 12 il rilascio è proprio dietro l'angolo e Google ha pareggiato pubblicato il codice sorgente al suo repository AOSP. C'è un molte novità in Android 12, inclusa un'aggiunta agli overlay delle risorse chiamati Fabricated Overlays. Ciò che doveva essere un'API per aiutare il sistema a gestire le modifiche dinamiche utilizzate in Materiale Tu e Monet potrebbe trasformarsi in qualcosa di molto più grande, almeno fino al rilascio di Android 13.
Sfondo
Mishaal Rahman ha scoperto questa nuova API e l'ha portata alla mia attenzione. Aveva utilizzato il comando Shell per testare diversi valori di risorse in Android 12 senza averlo fatto per compilare manualmente gli APK overlay e ha pensato che potesse rappresentare un'idea interessante per l'app per i dispositivi rooted. Quando l'ha portato alla mia attenzione, ho analizzato attentamente il codice sorgente di Android 12 e ho notato qualcosa che pensavo fosse piuttosto interessante. Ho testato ciò che ho trovato e ora eccoci qui: a quanto pare, l'API Fabricated Overlay può essere utilizzata per ripristinare temi senza root. Prima di addentrarmi troppo in ciò che sta accadendo qui, spiegherò cosa sono in realtà gli Overlay Fabbricati.
Cosa sono gli overlay fabbricati?
Gli overlay fabbricati sono una nuova funzionalità introdotta in Android 12. Sono simili ai classici Runtime Resource Overlays (RRO) che Android ha ormai da alcuni anni. Sia gli RRO che gli overlay fabbricati possono sovrascrivere risorse diverse per applicazioni diverse. Puoi cambiare un booleano da falso a vero (o viceversa), impostare quanto grande vuoi che sia la barra di stato e così via.
Tuttavia, gli overlay fabbricati presentano alcune differenze notevoli rispetto agli RRO. Innanzitutto, non è necessario generare un APK overlay e quindi installarlo. Invece, devi semplicemente dire ad Android quali valori vuoi modificare per quale applicazione e lui si occuperà di registrare le tue modifiche come overlay che puoi quindi abilitare.
Sono anche un po’ più limitati degli RRO. Prima di Android 11, gli RRO potevano sovrascrivere praticamente qualsiasi risorsa: booleani, numeri interi, dimensioni, attributi, layout e persino file di dati grezzi. Android 11 ha apportato alcune modifiche al funzionamento degli RRO, rendendo l'override dei layout non più fattibile, sebbene abbia reso gli RRO complessivamente più stabili.
Gli Overlay fabbricati, d'altra parte, possono sovrascrivere solo valori che possono essere rappresentati come numeri interi. Ciò include numeri interi (duh), dimensioni, valori booleani e colori. Non puoi usarli per sovrascrivere risorse di dati grezzi, layout, stringhe o array, almeno non facilmente. Questa è in qualche modo una limitazione arbitraria nell'API: accetta solo valori interi e categorie di risorse definite dalla classe TypedValue. TypedValue sì supporto stringhe e gli altri tipi di risorse, ma solo per fare riferimento alla relativa risorsa, non per conservare i dati effettivi.
Tuttavia, tali limitazioni non sono un grosso problema per lo scopo previsto di Fabricated Overlays: Material You ed effetti Monet. Gli overlay fabbricati semplificano la generazione e l'applicazione al volo di overlay di colori e dimensioni da parte del sistema, senza dover riavviare o attendere la compilazione di un APK.
Ora, normalmente, questa sarebbe solo un'altra API interessante da cui le persone con dispositivi rooted possono trarre vantaggio. A meno che non ci sia una scappatoia creata dal produttore (come quella di cui Synergy si avvale sui dispositivi Samsung), gli overlay possono essere installati solo da terze parti con accesso root. Questa è la parte migliore, però: Google ha dimenticato di correggere un buco in Android 12.
Sovrapposizioni fabbricate senza root
Android 8 ha introdotto la nuova API Overlay Manager Service (o OMS) e le persone hanno scoperto abbastanza rapidamente che gli APK overlay potevano essere installati come normali app e quindi abilitati utilizzando ADB. Purtroppo, Google ha risolto questo problema in Android 9 e da allora è possibile installare dinamicamente solo gli overlay firmati con la stessa chiave del sistema.
A quanto pare, i Fabricated Overlay di Android 12 hanno una scappatoia che ricorda quella presente in Android 8: non necessitano dell’accesso root o delle autorizzazioni a livello di firma. Hanno solo bisogno di qualcosa in esecuzione come utente shell (ad esempio ADB) per registrarli.
È abbastanza chiaro che Google intendeva che gli Overlay fabbricati fossero accessibili solo agli utenti root e di sistema. Esiste un'implementazione del comando ADB per crearli e non verrà eseguito se l'utente che lo esegue non è root. La scappatoia è che il controllo avviene solo nel comando, non nell'API vera e propria, il che significa che possiamo trarne vantaggio con un po' di lavoro.
ADB sul dispositivo
Da molto tempo Android dispone di una funzionalità ADB wireless. Ciò consente a un computer (o qualsiasi cosa con un binario ADB e accesso alla rete) di connettersi a un dispositivo in modalità wireless. È destinato principalmente ai dispositivi Android che non dispongono di connessioni USB accessibili all'utente, come smartwatch e TV. Inoltre, prima di Android 11, per attivare il file era necessaria una connessione ADB cablata modalità senza fili.
Android 11 è ciò che ha ufficialmente portato ADB wireless su telefoni e tablet. È un po’ più complicato del classico ADB wireless, con codici di accoppiamento e autenticazione, ma può essere attivato dall’utente completamente sul dispositivo, finché il dispositivo è connesso al WiFi. Ciò significa che è possibile connettersi al tuo dispositivo tramite ADB dal tuo dispositivo e tutto ciò di cui hai bisogno è un WiFi connessione.
Utilizzo di API elevate in un'app
Esistono molti motivi per cui potresti voler utilizzare API limitate nella tua app. Di solito è perché forniscono alcune funzionalità speciali di cui hai bisogno. Finché l'API di cui hai bisogno ha un'implementazione di comandi shell, è abbastanza facile usarla da un'app. Tutto quello che devi fare è creare un processo shell come root (o ADB), eseguire il comando corretto e analizzare il risultato, se presente.
Cosa succede se l'API non dispone di un'implementazione della shell o se all'implementazione della shell manca qualcosa di cui hai bisogno? Se utilizzi un dispositivo rooted, puoi utilizzare qualcosa di simile libRootJava. libRootJava ti consente di interagire con le API del framework Android come se la tua app fosse in esecuzione come utente root. Questo è più conveniente e molto più veloce dell'esecuzione dei comandi della shell, poiché è tutto nella stessa lingua e non devi preoccuparti di analizzare manualmente le stringhe. Ha alcune limitazioni, ma nella maggior parte dei casi funziona benissimo.
L'API libRootJava è piuttosto flessibile. Potresti adattarlo per funzionare come utente shell anziché come root. Per fortuna, non è necessario, perché qualcuno ce l'ha già fatta e si chiama Shizuku. Shizuku è quasi come una combinazione di Magisk Manager e libRootJava.
L'app Shizuku Manager ti guida attraverso la configurazione di un processo in esecuzione come utente shell a cui Shizuku può accedere. La libreria API Shizuku può essere implementata nelle app per consentire loro di accedere alle API di sistema come se fossero l'utente della shell. È un processo molto più centralizzato rispetto a libRootJava, poiché Shizuku deve essere configurato solo una volta prima che ogni app che implementa la libreria API Shizuku possa utilizzarlo. Se sei interessato a come funziona Shizuku e come puoi integrarlo nella tua app, Ho una guida per questo qui.
Shizuku e sovrapposizioni fabbricate
A questo punto, probabilmente puoi vedere dove sta andando. Possiamo utilizzare un servizio come Shizuku per accedere all'API Fabricated Overlays come utente shell e possiamo utilizzare la funzionalità ADB wireless di Android 11 per ottenere l'accesso a livello di shell, tutto sul dispositivo. Poiché la restrizione dell'utente root è presente solo nel comando shell Fabricated Overlays e non nell'API vera e propria, l'esecuzione come utente shell è sufficiente per utilizzarla direttamente.
Implementazione: libreria e app di esempio
E i dettagli di implementazione? Bene, ti ho coperto anche per quello.
In preparazione a questo, ho creato sia a libreria e un'app di esempio completamente funzionale utilizzando quella libreria.
La biblioteca stessa è principalmente per comodità. Comprende alcune delle API di sistema nascoste e offre alcuni metodi convenienti per gestire le autorizzazioni Shizuku. È anche flessibile, quindi puoi fornire la tua istanza dell'API IOverlayManager se hai un altro modo per recuperarla.
L'app di esempio mostra come potresti implementare la libreria utilizzando Shizuku. È anche un'app completamente funzionale e utile. La pagina principale visualizza gli overlay fabbricati attualmente registrati che sono stati creati tramite essa, raggruppati per app di destinazione. Puoi anche abilitarli, disabilitarli ed eliminarli da lì.
Toccando il pulsante "Aggiungi overlay" in basso si accede a un elenco di tutte le app sovrapponibili. Cerca o scorri per trovare quello che ti serve e toccalo. Quindi puoi premere il pulsante "Aggiungi" nella parte inferiore dello schermo per visualizzare l'elenco delle risorse che possono essere sovrascritte in quell'app. Seleziona una risorsa, impostane il valore e ripeti l'operazione per tutti i valori che desideri modificare. Premi il pulsante "Salva", inserisci un nome, conferma e verrai riportato alla schermata principale, che ora mostra il nuovo overlay, pronto per essere abilitato.
Ecco alcuni screenshot dell'app, grazie a Mishaal Rahman.
Come nota a margine, ho anche un'app generale per la gestione degli overlay chiamata... Gestore sovrapposizioni. L'app precompilata lo è disponibile solo sul mio Patreon, ma il il codice sorgente è disponibile gratuitamente a chiunque voglia compilarlo o modificarlo.
Conclusione
La nuova API Fabricated Overlays in Android 12 è davvero eccezionale, soprattutto perché non necessita di root. Potrebbe non essere sofisticato come un APK RRO completo, ma ti offre molta più flessibilità senza accesso root.
Dai un'occhiata all'app Fabricate Overlay su GitHub
Se hai un dispositivo con Android 12 e vuoi provarlo, controlla il repository GitHub collegato sopra. La sezione Versioni avrà un APK da scaricare e utilizzare. La libreria dovrebbe essere facile da includere nella tua applicazione utilizzando JitPack.
Naturalmente, non dovresti aspettarti che questa funzionalità duri a lungo. A Google non piacciono davvero gli overlay di terze parti, quindi questo problema verrà quasi sicuramente risolto quando verrà rilasciato Android 13. Nel frattempo, però, godiamocelo finché dura!