Otimizando o uso de memória e cache do Gradle Daemon

Rafa Araujo
Android Dev BR
Published in
4 min readJun 26, 2020

English version here

Quando buildamos nosso projeto com Gradle, seja por linha de comando ou pelo Android Studio, é utilizado um processo em segundo plano de longa duração que executa as compilações chamado Daemon.

O Daemon é usado não apenas para evitar o custo de inicialização da JVM para cada build, mas também para armazenar em cache informações sobre a estrutura do projeto, arquivos, tarefas e muito mais na memória. Isso torna as próximas compilações muito mais rápidas.

O Android Studio contém uma JVM própria, que vem instalada dentro dele e é utilizadas para suas builds dentro da IDE, logo, sua própria instancia do Daemon.
Até aí tudo bem… Certo? Mas caso você também utilize o Gradle por linha de comando, este não estará usando a instancia iniciada pela IDE, e sim uma nova pois o terminal estará usando a JVM de sua maquina.

O que isso significa? Que você terá duas instancias do Daemon com cache e tudo mais rodando em sua máquina e consuimindo mais memória.
E também que caso você modifique o sistema de arquivo presente em uma das builds, quando for utilizar a segunda ele irá buildar novamente pois não sabe das mudanças da primeira.

Como resolver isso? Use a mesma instancia do java em ambos os lugares.

Django Livre, ótimo filme!

💻 Configurando a variável de ambiente

No terminal, digite echo $JAVA_HOME para saber se a variável já foi configurada anteriormente. Caso afirmativo, pule este passo.

Neste passo você deverá identificar onde o seu Java está instalado e adicionar o caminho da sua instalação como variável de ambiente sob o nome de JAVA_HOME.

macOS

Provavelmente, o Java está localizado em /usr/libexec/java_home.

No arquivo ~/.bashrc se você usa bash, ou ~/.zshrc se você usa zsh, adicione a linha com o caminho entre aspas invertidas:

export JAVA_HOME=`/usr/libexec/java_home`

Reinicie o terminal, ou rode o comando source ~/.bashrc caso use bash, ousource ~/.zshrc caso use zsh, para recarregar o arquivo sem precisar reiniciá-lo.

Windows

Provavelmente, o Java está localizado em C:\Program Files\Java\jdk1.8.0_XX.

No seu terminal, digitesetx -m JAVA_HOME "C:\Program Files\Java\jdk1.8.0_XX".

Reinicie o terminal.

Linux

Provavelmente, o Java está localizado em /usr/lib/jvm/java-1.x.x-openjdk ouusr/bin/javac. Você também pode executar o comando update-alternatives — config java que lista as opcões de jdk instaladas e seus respectivos diretórios.

No arquivo /etc/profile, adicione a linha com o caminho encontrado:

export JAVA_HOME=usr/bin/javac

Reinicie o terminal.

Caso precise de ajuda, pode contar com este link direto do site do Java.

🤖 Configurando o Android Studio

Por segurança, para o Android Studio reconhecer o JAVA_HOME, reinicie sua IDE.

Com o seu projeto aberto, vá para File ➡️ Project Structure, conforme exibido abaixo.

Setup no Android Studio

Em JDK Location, selecione a opção do JAVA_HOME , que o Android Studio provavelmente já detectou que você tem essa variável de ambiente configurada.

Escolhendo o JAVA_HOME como JDK

Reinicie o seu Android Studio et voilá! 👌

Você conseguiu!

🛑 Encerrando todos Gradle Daemon

Caso após todos os passos você detecte que ainda há multiplas instâncias do Gradle Daemons rodando, você pode encerrar todos no seu terminal com o comando:

pkill -f '.*GradleDaemon.*'

💰Bônus: Deixe seu terminal “rico”

Quando executamos um comando por linha de comando, todo o log imprimido estará em texto puro, mas caso utilize a tag --console=rich depois de comando a ser executado, por exemplo ./gradlew clean --console=rich , podemos deixar o terminal mais “informtivo”. O que muda:

  • Agrupamento de logs.
  • Barra de progresso e o cronômetro que descrevem o status geral.
  • As linhas paralelas de tasks em andamento.
  • Cores e fontes serão usadas para destacar erros e resultados importantes.
Terminal rico

Para evitar o trabalho de sempre ter que adicionar a tag --console=rich no final de cada comando, você pode configurar por padrão utilizando um arquivo chamado gradle.properties direto no Gradle instalado em sua máquina.

  • Crie um arquivo chamado gradle.properties dentro da sua pasta ~/.gradle/ (na instalacão do Gradle na sua pasta “home”).
  • Dentro do arquivogradle.properties, adicione a linha org.gradle.console=rich.

Cada comando será executado automaticamente com --console=rich porque o novo gradle.properties será mesclado com o gradle.properties do seu projeto.

Se o gradle.properties do seu projeto contiver a mesma tag que o arquivo local, será usada a tag do arquivo do seu projeto, sobreescrendo a do arquivo local.

Case queira texto puro, use --console=plain ao invés de --console=rich.

Considerações finais

Nem todos os caminhos e versões provavelmente corresponderão à sua configuração, mas se você a configurar corretamente, poderá executar uma única instância do Daemon/Java no Android Studio e no terminal. Bom código!

Contatos

Você pode me encontrar pelo Twitter no@orafaaraujo.
Feedbacks são bem-vindos!

Comunidade Android

Participe do maior fórum sobre Android no Brasil no slack Android Dev BR.
Site: http://www.androiddevbr.org | Convite: http://slack.androiddevbr.org

Obrigado!

--

--