La API Fabricated Overlay de Android 12 recupera los temas desarraigados

¿Recuerdas cómo Android 8 facilitó la creación de temas en tu dispositivo? ¿Recuerdas lo divertido que fue eso? Bueno, está de vuelta en Android 12, con un giro.

El establo completo androide 12 El lanzamiento está a la vuelta de la esquina y Google incluso ha publicado el código fuente a su repositorio AOSP. Hay una muchas novedades en Android 12, incluida una adición a las superposiciones de recursos denominadas superposiciones fabricadas. ¿Qué se entiende por API para ayudar al sistema a gestionar los cambios dinámicos utilizados en material usted y Monet puede convertirse en algo mucho más grande, al menos hasta el lanzamiento de Android 13.

Fondo

Mishaal Rahman descubrió esta nueva API y me la llamó la atención. Había estado usando el comando Shell para probar diferentes valores de recursos en Android 12 sin tener que compilar manualmente APK superpuestos, y pensó que podría ser una idea de aplicación interesante para dispositivos rooteados. Cuando me llamó la atención, examiné mucho el código fuente de Android 12 y noté algo que me pareció bastante interesante. Probé lo que encontré y ahora aquí estamos: resulta que la API Fabricated Overlay se puede utilizar para recuperar temas desarraigados. Antes de profundizar demasiado en lo que está sucediendo aquí, explicaré qué son realmente las superposiciones fabricadas.

¿Qué son las superposiciones fabricadas?

Las superposiciones fabricadas son una nueva característica introducida en Android 12. Son similares a las clásicas superposiciones de recursos en tiempo de ejecución (RRO) que Android tiene desde hace algunos años. Tanto los RRO como las superposiciones fabricadas pueden anular diferentes recursos para diferentes aplicaciones. Puede cambiar un valor booleano de falso a verdadero (o viceversa), establecer el tamaño que desea que tenga la barra de estado, etc.

Sin embargo, las superposiciones fabricadas tienen algunas diferencias notables con respecto a las RRO. Por un lado, no es necesario generar un APK superpuesto y luego instalarlo. En su lugar, simplemente le dice a Android qué valores desea cambiar para cada aplicación y él se encarga de registrar sus cambios como una superposición que luego puede habilitar.

También son un poco más limitados que los RRO. Antes de Android 11, los RRO podían anular prácticamente cualquier recurso: valores booleanos, enteros, dimensiones, atributos, diseños e incluso archivos de datos sin procesar. Android 11 realizó algunos cambios en el funcionamiento de los RRO, lo que hizo que ya no fuera factible anular los diseños, aunque sí hizo que los RRO fueran más estables en general.

Las superposiciones fabricadas, por otro lado, solo pueden anular valores que pueden representarse como números enteros. Eso incluye números enteros (duh), dimensiones, valores booleanos y colores. No puede usarlos para anular recursos de datos sin procesar, diseños, cadenas o matrices, al menos no fácilmente. Esta es una limitación algo arbitraria en la API: solo acepta valores enteros y categorías de recursos según lo definido por la clase TypedValue. TypedValue hace apoyo cadenas y otros tipos de recursos, pero solo para hacer referencia a su recurso, no para contener sus datos reales.

Sin embargo, esas limitaciones no son gran cosa para el propósito previsto de Fabricated Overlays: Material You y efectos monetarios. Las superposiciones fabricadas facilitan que el sistema genere y aplique superposiciones de colores y dimensiones sobre la marcha, sin tener que reiniciar ni esperar a que se compile un APK.

Ahora, normalmente, esta sería simplemente otra API interesante que podrían aprovechar las personas con dispositivos rooteados. A menos que exista una laguna jurídica creada por el fabricante (como la que aprovecha Synergy en los dispositivos Samsung), las superposiciones solo pueden ser instaladas por terceros con acceso de root. Sin embargo, esa es la mejor parte: Google se olvidó de reparar un agujero en Android 12.

Superposiciones fabricadas sin raíz

Android 8 introdujo la nueva API Overlay Manager Service (o OMS), y la gente descubrió rápidamente que los APK superpuestos se podían instalar como aplicaciones normales y luego habilitarse usando ADB. Lamentablemente, Google parchó esto en Android 9 y, desde entonces, solo se pueden instalar dinámicamente superposiciones firmadas con la misma clave que el sistema.

Resulta que las superposiciones fabricadas de Android 12 tienen una laguna que recuerda a la presente en Android 8: no necesitan acceso de root ni permisos a nivel de firma. Solo necesitan algo que se ejecute como usuario de shell (es decir, ADB) para registrarlos.

Está bastante claro que Google pretendía que las superposiciones fabricadas solo fueran accesibles para los usuarios raíz y del sistema. Existe una implementación de comando ADB para crearlos y no se ejecutará si el usuario que lo ejecuta no es root. La laguna es que la verificación está solo en el comando, no en la API real, lo que significa que podemos aprovecharla con un poco de trabajo.

ADB en el dispositivo

Desde hace mucho tiempo, Android tiene una función ADB inalámbrica. Esto permite que una computadora (o cualquier cosa con un binario ADB y acceso a la red) se conecte a un dispositivo de forma inalámbrica. Está destinado principalmente a dispositivos Android que no tienen conexiones USB accesibles para el usuario, como relojes inteligentes y televisores. Además, antes de Android 11, necesitaba una conexión ADB por cable para activar el Modo inalámbrico.

Android 11 es lo que llevó oficialmente el ADB inalámbrico a teléfonos y tabletas. Es un poco más complicado que el clásico ADB inalámbrico, con códigos de emparejamiento y autenticación, pero el usuario puede activarlo completamente en el dispositivo. siempre y cuando el dispositivo esté conectado a WiFi. Eso significa que es posible conectarse a su dispositivo a través de ADB desde su dispositivo, y todo lo que necesita es WiFi conexión.

Uso de API elevadas en una aplicación

Hay muchas razones por las que quizás quieras utilizar API restringidas en tu aplicación. Por lo general, es porque proporcionan alguna funcionalidad especial que necesitas. Siempre que la API que necesita tenga una implementación de comando de shell, es bastante fácil usarla desde una aplicación. Todo lo que necesita hacer es crear un proceso de shell como root (o ADB), ejecutar el comando correcto y analizar el resultado, si corresponde.

¿Qué pasa si la API no tiene una implementación de shell o si a la implementación de shell le falta algo que necesita? Si estás en un dispositivo rooteado, puedes usar algo como libRootJava. libRootJava le permite interactuar con las API del marco de Android como si su aplicación se ejecutara como usuario root. Esto es más conveniente y mucho más rápido que ejecutar comandos de shell, ya que todo está en el mismo idioma y no tiene que preocuparse por analizar cadenas manualmente. Tiene algunas limitaciones, pero en general funciona muy bien.

La API libRootJava es bastante flexible. Puede adaptarlo para que se ejecute como usuario de shell en lugar de root. Afortunadamente, no es necesario porque alguien ya lo hizo y se llama Shizuku. Shizuku es casi como una combinación de Magisk Manager y libRootJava.

La aplicación Shizuku Manager lo guía a través de la configuración de un proceso que se ejecuta como usuario de shell al que Shizuku puede acceder. La biblioteca API de Shizuku se puede implementar en aplicaciones para permitirles acceder a las API del sistema como si fueran el usuario del shell. Es un proceso mucho más centralizado que libRootJava, ya que Shizuku solo necesita configurarse una vez antes de que cada aplicación que implemente la biblioteca API de Shizuku pueda usarlo. Si estás interesado en cómo funciona Shizuku y cómo puedes integrarlo en tu aplicación, Tengo una guía para eso aquí..

Shizuku y superposiciones fabricadas

A estas alturas, probablemente puedas ver hacia dónde va esto. Podemos usar un servicio como Shizuku para acceder a la API Fabricated Overlays como usuario de shell, y podemos usar la función ADB inalámbrica de Android 11 para obtener acceso a nivel de shell, todo en el dispositivo. Dado que la restricción del usuario raíz solo está presente en el comando de shell Fabricated Overlays y no en la API real, ejecutarlo como usuario de shell es suficiente para usarlo directamente.

Implementación: biblioteca y aplicación de muestra

¿Qué pasa con los detalles de implementación? Bueno, también te cubro para eso.

Para prepararme para esto, hice tanto un biblioteca y una aplicación de muestra completamente funcional usando esa biblioteca.

La biblioteca en sí es principalmente por conveniencia. Incluye algunas de las API ocultas del sistema y le brinda algunos métodos convenientes para manejar los permisos de Shizuku. También es flexible, por lo que puede proporcionar su propia instancia de la API IOverlayManager si tiene otra forma de recuperarla.

La aplicación de muestra muestra cómo podría implementar la biblioteca usando Shizuku. También es una aplicación completamente funcional y útil. La página principal muestra las superposiciones fabricadas actualmente registradas que se crearon a través de ella, agrupadas por aplicación de destino. También puedes habilitarlos, deshabilitarlos y eliminarlos desde allí.

Al tocar el botón "Agregar superposición" en la parte inferior, accederá a una lista de todas las aplicaciones superpuestas. Busque o desplácese para encontrar el que necesita y tóquelo. Luego puede presionar el botón "Agregar" en la parte inferior de la pantalla para ver la lista de recursos que se pueden anular en esa aplicación. Seleccione un recurso, establezca su valor y repita para tantos valores como desee cambiar. Presione el botón "Guardar", ingrese un nombre, confirme y regresará a la pantalla principal, que ahora muestra la nueva superposición, lista para habilitarse.

Aquí hay algunas capturas de pantalla de la aplicación, gracias a Mishaal Rahman.

Como nota al margen, también tengo una aplicación de administrador de superposición general llamada... Administrador de superposición. La aplicación precompilada en sí es solo disponible en mi patreon, pero el El código fuente está disponible gratuitamente. a cualquiera que quiera compilarlo o modificarlo.

Conclusión

La nueva API Fabricated Overlays en Android 12 es bastante buena, principalmente porque no necesita root. Puede que no sea tan sofisticado como un APK RRO completo, pero le brinda mucha más flexibilidad sin acceso de root.

Consulte la aplicación Fabricate Overlay en GitHub

Si tienes un dispositivo con Android 12 y quieres probarlo, consulta el repositorio de GitHub vinculado anteriormente. La sección Lanzamientos tendrá un APK para descargar y usar. La biblioteca debería ser fácil de incluir en su propia aplicación utilizando JitPack.

Por supuesto, no deberías esperar que esta característica permanezca por mucho tiempo. A Google realmente no le gustan las superposiciones de terceros, por lo que es casi seguro que esto se solucionará cuando se lance Android 13. Mientras tanto, ¡disfrútalo mientras dure!