Automação com Makefile no Android

Facilitando o desenvolvimento com automações rápidas no terminal

Phellipe Silva
Android Dev BR
4 min readJan 11, 2020

--

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:

Comandos adb para desabilitar animações no dispositivo

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ó? 👇

Execução de um comando customizado para Android no terminal

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
Modelo para construção de um Makefile básico

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:

Exemplo de Makefile que define comando de desabilitar animações no dispositivo

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:

Exemplo de Makefile com um conjunto de comandos úteis

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!

Exemplo de execução do comando run-instrumented-tests no terminal agrupando outras 5 instruções

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:

Arquivo Makefile no projeto Android

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:

Exemplo de Makefile com PHONY target

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.

Makefile com vários comandos relacionados a Android

Espero que tenham gostado desse artigo. Qualquer comentário ou dúvida, não deixem de comentar por aqui 👋

--

--

Phellipe Silva
Android Dev BR

Android engineer and test automation enthusiast. Working @Wise and formerly @ThoughtWorks. Twitter profile: @phellipeafsilva