Otimizando o uso de memória e cache do Gradle Daemon
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.
💻 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.
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.
Reinicie o seu Android Studio et voilá! 👌
🛑 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.
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 arquivo
gradle.properties
, adicione a linhaorg.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