Como gerenciar dependências e versões com buildSrc? (Dependency Management Android)
Entenda como e quando criar o diretório buildSrc em projetos multi-módulos, para melhor gerenciar suas dependências e versões no Android Studio.
Como visualizar dependências?
Visualizar depencências em um projeto multi-módulos exige uma certa experiência, maturidade e nem sempre é trivial. Temos que nos atentar conscientemente a elas, do contrário isso pode se tornar um verdadeiro pesadelo 🤢, quando o projeto já ganhou um tamanho considerável e se encontra em produção. Nos exemplos a seguir, veremos de forma super didática e de facil compreenção, como visualiza-las, mas antes disso, vamos entender quando devemos nos preocupar com isso.
Projeto Android Multi-Módulo
Quando criar um módulo de dependência?
Falando de maneira geral, gerenciamento de versões e dependências só se torna um problema, quando estamos falando de um projeto modular (com mais de um módulo e muitas dependências) Portanto não há necessidade de fazer isso para app simples composto por apenas um módulo. No final deste post eu explico com um vídeo prático, o que e como você deve fazer, para criar um módulo de dependências usando buildSrc no seu projeto multi-módulo.
Projeto Uber
Pré-Condição
Partindo do presuposto que você esta trabalhando em um projeto multi-módulo ou esta prestas a criar um, podemos agora dar continuidade. Imagine que você esta desenvolvendo um projeto similar ao do Uber, onde você terá uma aplicativo (app) para os usuários, outro app para os motoristas e alguns módulos biblioteca (A e B) que serão usados por ambos os apps.
Build.gradle
Como podemos ver (Imagem A), em cada módulo existe um arquivo chamado build.gradle. Este arquivo é responsável em especificar as dependências de cada módulo. Colocando assim de modo visual, logo percebemos que os módulos referenciam as mesmas bibliotecas em suas respectivas versões. Para melhorar anda mais o entendimento, vamos dar um zoom ainda maior nas dependências.
Visualizando Dependências
Expandindo os módulos
Na prática, o que acontece é algo como nesta imagem abaixo. Imagine agora que temos que alterar a versão do biblioteca A:V1.0.0 para A:V1.0.1.
O que isso significaria na prática?
Você consegue enxergar os problemas que isso acarrete, se não gerenciamos as versões em um ponto central?
Evite alterações manuais
Na prática isso significa que teriamos que alterar em todos os lugares manualmente. 😭 Isso rapidamente se torna um pesadelo e seria muito suscetível a erros, como podemos ver na imagem a seguir. Você teria que conhecer todo os projeto e sair alterando em todos os lugares. Imagine agora um colaborador novo alterando a versão A:V1.0.1 apenas no AppUsuário? (Isso daria 💩 ne? 😂😂😂)
Introduzindo buildSrc
Gerenciando versões e dependências um um único lugar
O módulo buildSrc é o lugar onde iremos centralizar as dependências e versões. Uma outra vantagem do módulo é que ele nos permite usar Kotlin-dsl (domain specific language) nos habilitando autocomplete de variáveis, navegação entre as definições e refactoring. A imagem inicial com as dependências poria então ser simplificada para isso aqui. O que já nos resolveria o problema do versionamento. Perceba agora que temos que alterar a versão apenas em um único lugar agora.
Você consegue enxergar o próximo problema nesse gráfico (Imagem D)? Vou te ajudar e marcar o que poderia ser melhorado. Tente descobrir!
Dependências transitivas
O que são dependências transitivas?
São dependências referenciadas multiplas vezes indiretamente. Isso acontece quando referenciamos um módulo no qual dependemos (como é o caso do AppUsuário que aponta para o módulo_A, que por sua vez também necessecita das mesmas ou mais dependências do módulo AppUsuário.
Para enxergar melhor essa situaço, vamos re-exibir a imagem antes das criação do módulo buildSrc. Com isso entenderemos melhor o contexto geral. Com o gráfico a seguir (Imagem F) fica evidente que modulo_A, ao especificar suas dependências, já cobre todas as dependências necessárias para o módulo AppUsuário e do módulo AppMotorista. Sendo assim, já que AppUsuário e AppMotorista já apontam para módulo_A, não precisamos mais especificar as mesmas dependências nos respectivos build.gradle de cada módulo. O novo gráfico ficaria ainda mais simples, como podemos ver na Imagem G.
Dependências Simplificadas 1° Passo
No gráfico abaixo (Imagem G) conseguimos remover as dependências transitivas dos módulos AppUsuário e AppMotorista. Já ficou bem mais limpo e menos suscetível a erros. Mas ainda tem algo no gráfico acima (Imagem F) que nos encomoda.
Você consegue enxergar o que é?
Será que ainda tem potencial para melhorias?
Vamos olhar o lado dos módulos A e B agora. Para isso vamos exibir novamente a imagem antes das melhorias e ver quais dependências esses módulos tem em comum. Vamos marca-las com setas e tick’s verde. Logo percebemos que eles tem muitas dependências em comum. Vide gráfico a seguir (Imagem H)
Dependências Simplificadas 2° Passo
Removendo redundâncias
Com o 2° passo introduzimos um módulo de dependências comuns (módulo_common_deps), onde reunimos essas dependências e apontamos para o buildSrc. Os módulos A e B apontam para este novo módulo e apenas módulo_A vai agora solicitar sua dependência extra, que exige para funcionar corretamente. Vide gráfico a seguir (Imagem I)
Em Resumo
Em projetos multi-módulos o gerenciamento de dependências se torna rapidamente algo muito importante e indispensável. Deve-se pensar nisso, sempre que possível e evidente, logo no inicio do projeto.
Como criar buildSrc?
Vejá na prática como se faz!
Agora que você já sabe porque isso é importante, veja como criar e especificar versões e dependências usando o módulo buildSrc em um projeto real Android. Neste vídeo super didático, te explico todo o passo a passo:
Quer mais conteúdo assim?
Me siga, se você gosta desse tipo de conteúdo técnico didático e feito com muito carinho. ❤️
Você me encontra no 🐦twitter, 🦑 Github ou no 📺 Youtube onde tenho um curso gratuito “Do zero ao certificado Android”, outro chamado “Resoluções a problemas comuns Android” e Android Jetpack Compose disponíveis 0800 para você.
Para não perder nenhum conteúdo, inscreva-se nesse techblog clicando aqui: