Lembra como o Android 8 facilitou a criação de temas para o seu dispositivo? Lembra como isso foi divertido? Bem, está de volta ao Android 12, com uma diferença.
O estábulo completo Andróide 12 o lançamento está chegando, e o Google ainda postei o código fonte ao seu repositório AOSP. Há um muitas novidades no Android 12, incluindo uma adição às sobreposições de recursos chamada Sobreposições Fabricadas. O que era uma API para ajudar o sistema a gerenciar as mudanças dinâmicas usadas no Material você e o monet pode se transformar em algo muito maior – pelo menos até o lançamento do Android 13.
Fundo
Mishaal Rahman descobriu esta nova API e chamou minha atenção para ela. Ele estava usando o comando shell para testar diferentes valores de recursos no Android 12 sem ter para compilar manualmente APKs de sobreposição, e ele achou que isso poderia ser uma ideia interessante de aplicativo para dispositivos com acesso root. Quando ele me chamou a atenção, observei bastante o código-fonte do Android 12 e percebi algo que achei muito interessante. Testei o que encontrei e agora aqui estamos – como descobri, a API Fabricated Overlay pode ser usada para trazer de volta temas sem raiz. Antes de me aprofundar no que está acontecendo aqui, explicarei o que realmente são as sobreposições fabricadas.
O que são sobreposições fabricadas?
Sobreposições fabricadas são um novo recurso introduzido no Android 12. Eles são semelhantes aos clássicos Runtime Resource Overlays (RROs) que o Android tem há alguns anos. Tanto os RROs quanto as sobreposições fabricadas podem substituir recursos diferentes para aplicações diferentes. Você pode alterar um booleano de falso para verdadeiro (ou vice-versa), definir o tamanho que deseja que a barra de status tenha e assim por diante.
No entanto, as sobreposições fabricadas têm algumas diferenças notáveis em relação aos RROs. Por um lado, você não precisa gerar um APK de sobreposição e depois instalá-lo. Em vez disso, basta informar ao Android quais valores deseja alterar para qual aplicativo e ele se encarrega de registrar suas alterações como uma sobreposição que você pode ativar.
Eles também são um pouco mais limitados que os RROs. Antes do Android 11, os RROs podiam substituir praticamente qualquer recurso: booleanos, números inteiros, dimensões, atributos, layouts e até arquivos de dados brutos. O Android 11 fez algumas mudanças na forma como os RROs funcionam, tornando a substituição de layouts não mais viável, embora tenha tornado os RROs mais estáveis em geral.
As sobreposições fabricadas, por outro lado, só podem substituir valores que podem ser representados como números inteiros. Isso inclui números inteiros (duh), dimensões, booleanos e cores. Você não pode usá-los para substituir recursos de dados brutos, layouts, strings ou arrays – pelo menos não facilmente. Esta é uma limitação um tanto arbitrária na API: ela aceita apenas valores inteiros e categorias de recursos conforme definido pela classe TypedValue. TypedValue faz apoiar strings e outros tipos de recursos, mas apenas para fazer referência a seus recursos, e não para armazenar seus dados reais.
No entanto, essas limitações não são um grande problema para o propósito pretendido de Fabricated Overlays: Material You e efeitos monetários. As sobreposições fabricadas facilitam para o sistema gerar e aplicar sobreposições de cores e dimensões dinamicamente, sem a necessidade de reiniciar ou esperar que um APK seja compilado.
Agora, normalmente, esta seria apenas mais uma API interessante para pessoas com dispositivos rooteados aproveitarem. A menos que haja uma brecha criada pelo fabricante (como aquela que o Synergy aproveita em dispositivos Samsung), as sobreposições só podem ser instaladas por terceiros com acesso root. Essa é a melhor parte: o Google esqueceu de consertar uma falha no Android 12.
Sobreposições fabricadas sem raiz
O Android 8 introduziu a nova API Overlay Manager Service (ou OMS), e as pessoas descobriram rapidamente que os APKs de sobreposição podiam ser instalados como aplicativos normais e depois ativados usando ADB. Infelizmente, o Google corrigiu isso no Android 9 e, desde então, apenas sobreposições assinadas com a mesma chave do sistema podem ser instaladas dinamicamente.
Acontece que as sobreposições fabricadas do Android 12 têm uma lacuna que lembra aquela presente no Android 8: elas não precisam de acesso root ou permissões de nível de assinatura. Eles só precisam de algo rodando como usuário shell (ou seja, ADB) para registrá-los.
Está bastante claro que o Google pretendia que as sobreposições fabricadas fossem acessíveis apenas aos usuários root e do sistema. Existe uma implementação de comando ADB para criá-los e não será executado se o usuário que executa não for root. A lacuna é que a verificação está apenas no comando, não na API real, o que significa que podemos tirar vantagem disso com um pouco de trabalho.
ADB no dispositivo
Há muito tempo, o Android tem um recurso ADB sem fio. Isso permite que um computador (ou qualquer coisa com acesso binário e de rede ADB) se conecte a um dispositivo sem fio. Destina-se principalmente a dispositivos Android que não possuem conexões USB acessíveis ao usuário, como smartwatches e TVs. Além disso, antes do Android 11, você precisava de uma conexão ADB com fio para ativar o modo sem-fio.
O Android 11 é o que trouxe oficialmente o ADB sem fio para telefones e tablets. É um pouco mais complicado que o clássico ADB sem fio, com códigos de emparelhamento e autenticação, mas pode ser ativado pelo usuário totalmente no dispositivo, contanto que o dispositivo esteja conectado ao WiFi. Isso significa que é possível conectar-se ao seu dispositivo através do ADB do seu dispositivo, e tudo que você precisa é de um WiFi conexão.
Usando APIs elevadas em um aplicativo
Há vários motivos pelos quais você pode querer usar APIs restritas em seu aplicativo. Normalmente, é porque eles fornecem alguma funcionalidade especial de que você precisa. Contanto que a API necessária tenha uma implementação de comando shell, é muito fácil usá-la em um aplicativo. Tudo que você precisa fazer é criar um processo shell como root (ou ADB), executar o comando correto e analisar o resultado, se houver.
E se a API não tiver uma implementação de shell ou se faltar algo que você precisa na implementação de shell? Se você estiver em um dispositivo com acesso root, poderá usar algo como libRootJava. libRootJava permite interagir com as APIs da estrutura Android como se seu aplicativo estivesse sendo executado como usuário root. Isso é mais conveniente e muito mais rápido do que executar comandos shell, já que está tudo na mesma linguagem e você não precisa se preocupar em analisar strings manualmente. Ele tem algumas limitações, mas na maioria das vezes funciona muito bem.
A API libRootJava é bastante flexível. Você pode adaptá-lo para rodar como usuário shell em vez de root. Felizmente, você não precisa, porque alguém já fez isso e se chama Shizuku. Shizuku é quase como uma combinação de Magisk Manager e libRootJava.
O aplicativo Shizuku Manager orienta você na configuração de um processo executado como o usuário shell que Shizuku pode acessar. A biblioteca de API Shizuku pode ser implementada em aplicativos para permitir que eles acessem APIs do sistema como se fossem o usuário shell. É um processo muito mais centralizado do que o libRootJava, já que o Shizuku só precisa ser configurado uma vez antes que cada aplicativo que implemente a biblioteca da API Shizuku possa usá-lo. Se você estiver interessado em como o Shizuku funciona e como integrá-lo ao seu aplicativo, Eu tenho um guia para isso aqui.
Shizuku e sobreposições fabricadas
Agora, você provavelmente já pode ver onde isso vai dar. Podemos usar um serviço como o Shizuku para acessar a API Fabricated Overlays como usuário shell, e podemos usar o recurso ADB sem fio do Android 11 para obter acesso em nível de shell, tudo no dispositivo. Como a restrição do usuário root está presente apenas no comando shell Fabricated Overlays e não na API real, executar como usuário shell é suficiente para usá-lo diretamente.
Implementação: Biblioteca e Aplicativo de Amostra
E os detalhes da implementação? Bem, eu também cuido de você para isso.
Em preparação para isso, fiz um biblioteca e um aplicativo de amostra totalmente funcional usando essa biblioteca.
A biblioteca em si é principalmente por conveniência. Ele envolve algumas das APIs ocultas do sistema e fornece alguns métodos convenientes para lidar com as permissões do Shizuku. Também é flexível, então você pode fornecer sua própria instância da API IOverlayManager se tiver outra maneira de recuperá-la.
O aplicativo de exemplo mostra como você pode implementar a biblioteca usando Shizuku. Também é um aplicativo totalmente funcional e útil. A página principal exibe as Sobreposições Fabricadas atualmente registradas que foram criadas por meio dela, agrupadas por aplicativo de destino. Você também pode ativá-los, desativá-los e excluí-los de lá.
Tocar no botão “Adicionar sobreposição” na parte inferior leva você a uma lista de todos os aplicativos sobrepostos. Pesquise ou role para encontrar o que você precisa e toque nele. Em seguida, você pode pressionar o botão “Adicionar” na parte inferior da tela para visualizar a lista de recursos que podem ser substituídos naquele aplicativo. Selecione um recurso, defina seu valor e repita para quantos valores desejar alterar. Clique no botão “Salvar”, digite um nome, confirme e você retornará à tela principal, mostrando agora a nova sobreposição, pronta para ser habilitada.
Aqui estão algumas capturas de tela do aplicativo, graças a Mishaal Rahman.
Como observação, também tenho um aplicativo gerenciador de sobreposição geral chamado... Gerenciador de sobreposições. O próprio aplicativo pré-compilado é disponível apenas no meu Patreon, mas o o código-fonte está disponível gratuitamente para qualquer pessoa que queira compilá-lo ou modificá-lo.
Conclusão
A nova API Fabricated Overlays no Android 12 é muito boa, principalmente porque não precisa de root. Pode não ser tão sofisticado quanto um APK RRO completo, mas oferece muito mais flexibilidade sem acesso root.
Confira o aplicativo Fabricate Overlay no GitHub
Se você possui um dispositivo com Android 12 e deseja experimentar, verifique o repositório GitHub com link acima. A seção Releases terá um APK para baixar e usar. A biblioteca deve ser fácil de incluir em seu próprio aplicativo usando JitPack.
Claro, você não deve esperar que esse recurso dure muito tempo. O Google realmente não gosta de sobreposições de terceiros, então isso quase definitivamente será corrigido quando o Android 13 for lançado. Enquanto isso, aproveite enquanto dura!