Imagem: Configurar projeto
Especifique o nome e o nome do pacote do seu aplicativo. Mantenha a linguagem Java, se você estiver familiarizado com Kotlin, vá com isso – não haverá muitos códigos rígidos, pois isso é uma espécie de desenvolvimento de aplicativo / módulo ‘hello-world’. Estou mantendo a API mínima nível para 15. Em seguida, clique no botão Concluir.
ETAPA – 4: modifique seu build.gradle (app) & Adicione as dependências abaixo:
Em seguida, sincronize o projeto.
ETAPA – 5: Modifique seu arquivo manifest.xml:
Adicione as tags de meta-dados abaixo dentro da tag do aplicativo:
O nome deve ser xposedmodule
e o valor true
. Deixe o recurso vazio. Em seguida, repita o mesmo para xposedminversion
(a versão da API da etapa anterior) e xposeddescription
(uma breve descrição do seu módulo).
PASSO – 6: crie uma classe:
package com.myfirstxposedmodule; public class MyModule { }
Esta é nossa classe que modificaremos no futuro.
ETAPA – 7: crie e modifique o arquivo xposed_init:
Imagem: Visualização do projeto
Mude a visualização do diretório para a visualização do Projeto. Navegue para app > src > main. Clique com o botão direito em principal e selecione o novo diretório >. Nomeie-o: assets
Clique com o botão direito no diretório assets
criado recentemente, selecione o novo > arquivo. Nomeie-o: xposed_init
(selecione text
se solicitar o tipo de arquivo).
Dentro do arquivo xposed_init
, adicione o nome completo de nossa classe java. ou seja, em nosso caso, será como:
com.myfirstxposedmodule.MyModule
É assim que o framework Xposed identificará nosso módulo e o carregará na inicialização. Este arquivo dirá ao framework quais classes carregar, o que também veremos nos logs.
ETAPA – 8: Modifique a classe MyModule:
package com.myfirstxposedmodule; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.callbacks.XC_LoadPackage; import de.robv.android.xposed.XposedBridge; public class MyModule implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable { } }
Implemente IXposedHookLoadPackage
e implemente o método handleLoadPackage
conforme mostrado acima.
Agora, vamos experimentar colocando uma função de log dentro desse método handleLoadPackage
:
XposedBridge.log("Loaded app: " + lpparam.packageName);
Isso imprimirá os módulos carregados. Geralmente, esses logs são registrados dentro deste arquivo: /data/data/de.robv.android.exposed.installer/log/debug.log
(que pode ser facilmente acessado pelo instalador Xposed).
ETAPA – 9: execute o código:
Imagem: Erro ao executar ‘app’
Se você tentar diretamente execute-o no Android Studio, você obterá este erro. O que está ok porque não estamos tendo nenhuma atividade no momento.
De qualquer forma, não se preocupe, estou tendo uma solução. Basta editar a configuração de execução e alterar a opção de inicialização de atividade padrão para nada e selecionar OK.
Imagem: Alterar execução Configurações
Agora, tente executar novamente (Windows: Shift + F10).
Em uma execução bem-sucedida em seu dispositivo, você ‘ poderei ver este módulo na lista de módulos do aplicativo Xposed Installer. Conforme mostrado na imagem abaixo, você também pode ver o texto de descrição que inserimos no arquivo de manifesto.
Imagem: Lista de módulos Xposed
Basta ativar esse módulo marcando a caixa e reiniciando o dispositivo.Após reiniciar, abra o aplicativo Xposed Installer e abra os logs (você também pode abrir o arquivo de log que mencionei acima, é o caminho). Você verá linhas como esta:
Agora que você sabe como criar e executar o módulo Xposed, podemos ir mais fundo para olhar o código de barra de status e aplicar algumas de nossas próprias implementações.
PASSO – 10: Explorando o código da barra de status:
Agora, estamos interessados em obter o relógio (texto) da barra de status (que reside em com.android.systemui
pacote). Como você sabe, o Android é uma fonte operacional de código aberto, para que você possa ver o interior do código. Você pode baixar o código-fonte do Android neste link. Dependendo da sua versão do Android e da sua rom, pode haver algumas mudanças. Por enquanto, estamos interessados apenas em encontrar o código do nosso relógio. Há uma Clock.java
classe dentro de algum lugar no com.android.systemui
pacote e esta classe estende TextView
o que significa que você pode tratar isso de forma semelhante como um TextView. ESTE é o link para essa aula. Existe um método que atualiza a hora na barra de status cujo nome é updateClock()
. Veja o snippet abaixo:
Agora, o que queremos? Queremos executar nosso código sempre que esse método for executado. O que faremos na próxima etapa, também conhecida como enganchar um método.
ETAPA – 11: Enganchar o método:
O XposedHelper
é uma classe que fornece alguns métodos auxiliares. Um método auxiliar de que precisaremos é findAndHookMethod
, que recebe o nome completo da classe em String
, carregador de classe (podemos obtê-lo em XC_LoadPackage.LoadPackageParam
de handleLoadPackage
), o nome do método que queremos rastrear (updateClock
em nosso caso) em String
e XC_MethodHook
callback (que é simplesmente um callback). Abaixo estará nosso código
No código acima, você pode ver que existem dois métodos que implementei na classe anônima XC_MethodHook
que são beforeHookedMethod
e afterHookedMethod
. Como o nome sugere, primeiro um será executado antes do método hooked e o último será executado após o método hooked (updateClock
em nosso caso). Os parâmetros para argumentos e tipos de retorno são tratados pelo argumento MethodHookParam
. Mas, a partir de agora, queremos apenas mudar a cor do relógio da barra de status, simplesmente precisamos de afterHookedMethod
.
Precisamos de acesso a esse TextView
objeto, que podemos obter da param.thisObject
– será o mesmo que this
palavra-chave em Clock.java
classe. Em seguida, podemos lançá-lo para TextView
e então podemos simplesmente alterar a cor desse objeto TextView
e também modificar o texto como eu fiz :
ETAPA – 12: Execute o módulo:
Execute o código e reinicie o dispositivo novamente. Você poderá ver seu relógio em vermelho e o texto emoji que anexamos.
Imagem: Cor alterada de o relógio na barra de status
É isso aí !! Eu sei que reiniciar é uma droga! mas ei, você criou seu próprio módulo Xposed, não é ótimo ?? !!