L'API Fabricated Overlay d'Android 12 ramène les thèmes sans racine

Rappelez-vous comment Android 8 a facilité la création d'un thème pour votre appareil? Tu te souviens à quel point c'était amusant? Eh bien, il est de retour dans Android 12, avec une touche d'originalité.

L'écurie complète Android 12 la sortie approche à grands pas, et Google a même posté le code source à son dépôt AOSP. Il y a un beaucoup de nouveautés dans Android 12, y compris un ajout aux superpositions de ressources appelé Fabricated Overlays. Ce qui était censé être une API pour aider le système à gérer les changements dynamiques utilisés dans Matériel Vous et Monet pourrait se transformer en quelque chose de beaucoup plus grand – du moins jusqu'à la sortie d'Android 13.

Arrière-plan

Mishaal Rahman a découvert cette nouvelle API et l'a portée à mon attention. Il utilisait la commande shell pour tester différentes valeurs de ressources dans Android 12 sans avoir à le faire. pour compiler manuellement les APK de superposition, et il a pensé que cela pourrait constituer une idée d'application intéressante pour les appareils rootés. Lorsqu’il l’a porté à mon attention, j’ai beaucoup étudié le code source d’Android 12 et j’ai remarqué quelque chose que j’ai trouvé assez intéressant. J'ai testé ce que j'ai trouvé, et maintenant nous y sommes: il s'avère que l'API Fabricated Overlay peut être utilisée pour ramener des thèmes sans racine. Avant d'aller trop loin dans ce qui se passe ici, je vais expliquer ce que sont réellement les superpositions fabriquées.

Que sont les superpositions fabriquées?

Les superpositions fabriquées sont une nouvelle fonctionnalité introduite dans Android 12. Ils sont similaires aux Runtime Resource Overlays (RRO) classiques qu’Android utilise depuis quelques années maintenant. Les RRO et les superpositions fabriquées peuvent remplacer différentes ressources pour différentes applications. Vous pouvez changer un booléen de faux à vrai (ou vice versa), définir la taille de la barre d'état, etc.

Les superpositions fabriquées présentent cependant des différences notables par rapport aux RRO. D’une part, vous n’avez pas besoin de générer un APK de superposition puis de l’installer. Au lieu de cela, vous indiquez simplement à Android quelles valeurs vous souhaitez modifier pour quelle application et il se charge d'enregistrer vos modifications sous forme de superposition que vous pouvez ensuite activer.

Ils sont également un peu plus limités que les RRO. Avant Android 11, les RRO pouvaient remplacer à peu près n'importe quelle ressource: booléens, entiers, dimensions, attributs, mises en page et même fichiers de données brutes. Android 11 a apporté quelques modifications au fonctionnement des RRO, rendant les mises en page de remplacement plus vraiment réalisables, même si cela a rendu les RRO plus stables dans l'ensemble.

En revanche, les superpositions fabriquées ne peuvent remplacer que les valeurs pouvant être représentées sous forme d'entiers. Cela inclut les entiers (duh), les dimensions, les booléens et les couleurs. Vous ne pouvez pas les utiliser pour remplacer des ressources de données brutes, des mises en page, des chaînes ou des tableaux – du moins pas facilement. Il s'agit d'une limitation quelque peu arbitraire de l'API: elle n'accepte que les valeurs entières et les catégories de ressources telles que définies par la classe TypedValue. TypedValue fait soutien les chaînes et les autres types de ressources, mais uniquement pour référencer leur ressource, et non pour contenir leurs données réelles.

Cependant, ces limitations ne sont pas trop importantes pour l’objectif prévu de Fabricated Overlays: Material You et les effets monétaires. Les superpositions fabriquées permettent au système de générer et d'appliquer facilement des superpositions de couleurs et de dimensions à la volée, sans avoir à redémarrer ou attendre qu'un APK soit compilé.

Maintenant, normalement, il ne s’agirait que d’une autre API intéressante dont les personnes disposant d’appareils rootés pourraient profiter. Sauf s'il existe une faille créée par le fabricant (comme celle dont Synergy profite sur les appareils Samsung), les superpositions ne peuvent être installées que par des tiers disposant d'un accès root. Mais c’est la meilleure partie: Google a oublié de corriger un trou dans Android 12.

Superpositions fabriquées sans racine

Android 8 a introduit la nouvelle API Overlay Manager Service (ou OMS), et les gens ont rapidement découvert que les APK de superposition pouvaient être installés comme des applications normales, puis activés à l'aide d'ADB. Malheureusement, Google a corrigé cela dans Android 9, et depuis, seules les superpositions signées avec la même clé que le système peuvent être installées dynamiquement.

Il s’avère que les superpositions fabriquées d’Android 12 présentent une faille qui rappelle celle présente dans Android 8: elles n’ont pas besoin d’un accès root ni d’autorisations au niveau de la signature. Ils ont juste besoin de quelque chose qui s'exécute en tant qu'utilisateur du shell (c'est-à-dire ADB) pour les enregistrer.

Il est assez clair que Google souhaitait que les superpositions fabriquées ne soient accessibles qu'aux utilisateurs root et système. Il existe une implémentation de commande ADB pour les créer, et elle ne s'exécutera pas si l'utilisateur exécutant n'est pas root. La faille est que la vérification concerne uniquement la commande, pas l'API elle-même, ce qui signifie que nous pouvons en profiter avec un peu de travail.

ADB sur l'appareil

Depuis longtemps maintenant, Android dispose d’une fonctionnalité ADB sans fil. Cela permet à un ordinateur (ou à tout objet doté d'un binaire ADB et d'un accès réseau) de se connecter à un appareil sans fil. Il est principalement destiné aux appareils Android qui ne disposent pas de connexions USB accessibles à l'utilisateur, comme montres intelligentes et téléviseurs. De plus, avant Android 11, vous aviez besoin d'une connexion ADB filaire pour activer le mode sans fil.

Android 11 est ce qui a officiellement introduit l'ADB sans fil sur les téléphones et les tablettes. C'est un peu plus compliqué que l'ADB sans fil classique, avec des codes d'appairage et d'authentification, mais il peut être activé par l'utilisateur entièrement sur l'appareil, tant que l'appareil est connecté au WiFi. Cela signifie qu'il est possible de se connecter à votre appareil via ADB depuis votre appareil, et tout ce dont vous avez besoin est un WiFi. connexion.

Utilisation d'API élevées dans une application

Il existe de nombreuses raisons pour lesquelles vous souhaiterez peut-être utiliser des API restreintes dans votre application. Habituellement, c'est parce qu'ils offrent des fonctionnalités spéciales dont vous avez besoin. Tant que l’API dont vous avez besoin dispose d’une implémentation de commande shell, il est assez facile de l’utiliser à partir d’une application. Tout ce que vous avez à faire est de créer un processus shell en tant que root (ou ADB), d'exécuter la bonne commande et d'analyser le résultat, le cas échéant.

Que se passe-t-il si l'API n'a pas d'implémentation shell, ou si l'implémentation shell manque quelque chose dont vous avez besoin? Si vous utilisez un appareil rooté, vous pouvez utiliser quelque chose comme libRootJava. libRootJava vous permet d'interagir avec les API du framework Android comme si votre application s'exécutait en tant qu'utilisateur root. C'est à la fois plus pratique et beaucoup plus rapide que l'exécution de commandes shell, car tout est dans le même langage et vous n'avez pas à vous soucier de l'analyse manuelle des chaînes. Il a certaines limites, mais pour la plupart, il fonctionne très bien.

L'API libRootJava est assez flexible. Vous pouvez l'adapter pour qu'il s'exécute en tant qu'utilisateur du shell au lieu de root. Heureusement, vous n'êtes pas obligé de le faire, car quelqu'un l'a déjà fait, et ça s'appelle Shizuku. Shizuku est presque comme une combinaison de Magisk Manager et de libRootJava.

L'application Shizuku Manager vous guide dans la configuration d'un processus exécuté en tant qu'utilisateur shell auquel Shizuku peut accéder. La bibliothèque API Shizuku peut être implémentée dans des applications pour leur permettre d'accéder aux API système comme s'ils étaient l'utilisateur du shell. Il s'agit d'un processus beaucoup plus centralisé que libRootJava, puisque Shizuku ne doit être configuré qu'une seule fois avant que chaque application implémentant la bibliothèque API Shizuku puisse l'utiliser. Si vous êtes intéressé par le fonctionnement de Shizuku et par la manière dont vous pouvez l'intégrer dans votre application, J'ai un guide pour ça ici.

Shizuku et superpositions fabriquées

À présent, vous pouvez probablement voir où cela nous mène. Nous pouvons utiliser un service comme Shizuku pour accéder à l'API Fabricated Overlays en tant qu'utilisateur du shell, et nous pouvons utiliser la fonctionnalité ADB sans fil d'Android 11 pour obtenir un accès au niveau du shell, le tout sur l'appareil. Étant donné que la restriction de l'utilisateur root n'est présente que dans la commande shell Fabricated Overlays et non dans l'API réelle, l'exécution en tant qu'utilisateur shell suffit pour l'utiliser directement.

Implémentation: bibliothèque et exemple d'application

Qu’en est-il des détails de mise en œuvre? Eh bien, je vous couvre aussi pour cela.

En préparation pour cela, j'ai fait à la fois un bibliothèque et un exemple d'application entièrement fonctionnel en utilisant cette bibliothèque.

La bibliothèque elle-même est principalement destinée à la commodité. Il regroupe certaines des API système cachées et vous propose quelques méthodes pratiques pour gérer les autorisations Shizuku. Il est également flexible, vous pouvez donc fournir votre propre instance de l'API IOverlayManager si vous disposez d'un autre moyen de la récupérer.

L'exemple d'application montre comment vous pouvez implémenter la bibliothèque à l'aide de Shizuku. C’est également une application entièrement fonctionnelle et utile. La page principale affiche les superpositions fabriquées actuellement enregistrées qui ont été créées via elle, regroupées par application cible. Vous pouvez également les activer, les désactiver et les supprimer à partir de là.

En appuyant sur le bouton « Ajouter une superposition » en bas, vous accédez à une liste de toutes les applications superposables. Recherchez ou faites défiler pour trouver celui dont vous avez besoin et appuyez dessus. Ensuite, vous pouvez appuyer sur le bouton « Ajouter » en bas de l'écran pour afficher la liste des ressources qui peuvent être remplacées dans cette application. Sélectionnez une ressource, définissez sa valeur et répétez l'opération pour autant de valeurs que vous souhaitez modifier. Appuyez sur le bouton « Enregistrer », entrez un nom, confirmez et vous serez ramené à l'écran principal, affichant maintenant la nouvelle superposition, prête à être activée.

Voici quelques captures d'écran de l'application, grâce à Mishaal Rahman.

En remarque, j'ai également une application générale de gestion de superposition appelée... Gestionnaire de superposition. L'application précompilée elle-même est disponible uniquement sur mon Patreon, mais le le code source est disponible gratuitement à toute personne souhaitant le compiler ou le modifier.

Conclusion

La nouvelle API Fabricated Overlays dans Android 12 est plutôt géniale, principalement parce qu’elle n’a pas besoin de root. Il n'est peut-être pas aussi sophistiqué qu'un APK RRO complet, mais il vous offre beaucoup plus de flexibilité sans accès root.

Découvrez l'application Fabricate Overlay sur GitHub

Si vous possédez un appareil fonctionnant sous Android 12 et que vous souhaitez essayer, consultez le référentiel GitHub lié ci-dessus. La section Releases aura un APK à télécharger et à utiliser. La bibliothèque doit être facile à inclure dans votre propre application à l'aide de JitPack.

Bien sûr, vous ne devriez pas vous attendre à ce que cette fonctionnalité perdure longtemps. Google n’aime vraiment pas les superpositions tierces, donc cela sera presque certainement corrigé lors de la sortie d’Android 13. En attendant, profitez-en tant que ça dure !