Automação com Makefile no Android
Facilitando o desenvolvimento com automações rápidas no terminal
Digamos que você esteja configurando uma pipeline para melhorar a entrega contínua da sua App. Durante essa configuração você precisa desabilitar as animações de um dispositivo para executar seus testes automatizados de Espresso. Você lembraria de cabeça qual o comando adb para desabilitar essas animações?
Bem… Eu mesmo não lembraria e nem gostaria de ter que pesquisar no Google toda vez que precisasse usar esses comandos:
Ao invés de ter que executar esses 3 comandos no terminal, não seria interessante se pudéssemos executá-los em um comando único? Como esse exemplo:
make disable-animations
Ainda melhor, e se pudéssemos:
- Desabilitar as animações do dispositivo
- Limpar os dados da app que está sendo testada
- Executar Espresso
Em um comando só? 👇
Dito isso, minha intenção com esse artigo é compartilhar uma forma interessante e fácil de automatizar o seu projeto Android utilizando Makefile!
Conhecendo o Make e Makefile
Para entender como fazer a automação proposta, vamos começar pela definição do comando Make, que nada mais é do que um comando utilitário do Unix que analisa e executa instruções de um arquivo chamado Makefile.
Por sua vez, esse arquivo Makefile contém um conjunto de regras específicas que devem ser seguidas através de uma linguagem declarativa. Nele podemos fazer uma combinação de instruções com intuito de facilitar a automação no nosso projeto.
As regras mais básicas para construção do Makefile são:
- Definir um comando finalizado com o caracter ':'
- Definir que comandos serão dependências do comando principal. Esses comandos que são dependências devem ser declarados depois do ':' e serão executados na ordem que foram descritos
- Criar conjunto de instruções identadas por (Tab ↹) para o comando criado. Atenção especial pois devemos obrigatoriamente identar com (Tab ↹) e não com espaços
Agora podemos construir nosso primeiro Makefile, que por sua vez possui um comando que desabilita animações e não tem dependência com outros comandos:
Com o arquivo acima, bastaria executar o comando make no terminal para ter suas animações desabilitadas no dispositivo em questão:
make disable-animations
Agora imaginemos que você queira executar seus testes de Espresso desabilitando as animações e começando com uma app sem dados guardados. Para isso, temos o seguinte Makefile:
Ao executar o comando make run-instrumented-tests no terminal você:
- Limpa todos os dados da App primeiro, já que o comando clear-app-data é a primeira dependência do comando run-instrumented-tests
- Desabilita todas as animações logo em seguida, já que o comando disable-animations é a segunda dependência do comando run-instrumented-tests
- Executa por último o comando do Gradle para iniciar os testes de Espresso
São praticamente 5 comandos em 1!
Vantagens de usar automação com Makefiles
- Diminuição da carga cognitiva da pessoa desenvolvedora ao utilizar comandos no terminal
- Conjunto de comandos utilitários em um arquivo único
- Arquivo versionado no projeto e compartilhado com toda a equipe
- Autocomplete muito eficiente quando utilizado em conjunto com OhMyZSH no terminal
Desvantagens
Uma desvantagem dessa estratégia é que você precisará fazer alguns passos adicionais caso seu sistema operacional seja Windows ou MacOs. O comando Make só existe nativamente em algumas distribuições do Linux.
Outro ponto de atenção é que para automações mais complexas, recomenda-se a criação de scripts shell (ou de outra linguagem de preferencia) combinados ao Makefile. O Makefile por si só não vai oferecer tantas opções quanto uma linguagem de script.
Makefile no Android Studio
No Android Studio é bem simples, basta colocar o arquivo Makefile dentro do diretório raiz do projeto e aproveitar os benefícios do controle de versão:
Ponto de atenção
Por padrão, o Make não suporta executar comandos que possuam o mesmo nome de arquivos (ou pastas) que estejam no seu diretório atual. Criar comandos com mesmo nome de arquivos é um erro comum nesse tipo de automação. Por exemplo, supondo que o Makefile tenha um comando chamado app:
make app
Não será possível executá-lo, já que existe uma pasta chamada app no nosso projeto Android. Normalmente recebemos o erro abaixo:
make: `app’ is up to date.
Felizmente uma configuração pode ser criada no Makefile para solucionar isso. Essa configuração se chama PHONY target. Ela define para o Make que o comando executado não corresponde a nenhum arquivo.
No final, para executar o comando app, o Makefile ficaria assim:
Para mais informação, checar a documentação do PHONY target.
Modelo real de Makefile para Android
Por fim, lhes deixo esse exemplo com vários comandos utilitários para que vocês possam utilizar no seu projeto. Também sintam-se livres para adicionar mais comandos que ajudem seu time.
Espero que tenham gostado desse artigo. Qualquer comentário ou dúvida, não deixem de comentar por aqui 👋