Gerar biblioteca Android(AAR) utilizando modularização

Rodrigo Vianna Calixto de Oliveira
Comunidade XP
4 min readOct 13, 2020

--

Esse artigo é um complemento do Construindo um projeto Android com multi repositórios, onde explico os pontos que levaram a XP Investimentos a repensar seus fluxos e processos fazendo com que o time de Android adotasse uma abordagem diferente do “monoRepo”, e como iniciar a revisão dos nossos processos pelo pipeline CI / CD nos ajudou.

Para ficar mais fácil o entendimento nas próximas partes irei dar nomenclaturas para diferenciar os AAR que serão abordados:

AAR centralizador -> irá centralizar todos os outros AAR em um único.

AAR secundário -> irá ser gerado para depois ser adicionado no AAR centralizador.

Ao se criar um projeto Android como uma biblioteca, encontramos uma limitação de não poder modulariza-los, por conta do build.gradle de cada modulo do projeto virar a ser um AAR secundário individualmente. Para solucionar esse problema, foi criado um módulo centralizador que terá os outros módulos como dependências, já que o próprio AAR não possui nenhum tipo de arquivo de configuração que poderia indicar quais dependências ele precisa e nesse artigo irei explicar uma forma de fazer manualmente essa geração de AAR centralizador contendo mais do que um AAR secundário.

Existe uma abordagem que pode ajudar na maioria dos casos chamada FAT AAR, que consegue fazer com que seu AAR centralizador contenha mais do que um AAR secundário, não tendo a necessidade de importar muitas bibliotecas criando apenas uma que contém tudo o que precisamos. Porém, infelizmente houve diversos casos que não funcionou, por causa de conflitos de outras bibliotecas dentro do projeto.

Devido a esses problemas, resolvemos então criar a nossa solução:

Adicionar manualmente os arquivos no AAR central

O caminho foi adicionar manualmente outros AAR secundário dentro do arquivo pom.xml para ser gerado um AAR centralizador com todas as bibliotecas.Antes dessa geração precisamos fazer algumas coisas.

Nos módulos que possuem o "apply plugin: ‘com.android.library’" que serão os AAR secundário precisam construir e publicar individualmente sua bibliotecas para isso, adicione no seu build.gradle do root do projeto para que todos esses módulos tenham essas novas tasks (cleanLibsModule, buildLibsModule e publishLibsModule).

Como podemos ver, foi adicionado um publish.gradle esse .gradle local será explicado posteriormente ainda neste artigo.

E note que apenas o modulo app, e modulo core ( que será explicado depois) não terão essas tasks, justamente para ter um comando exclusivo de todos os módulos que serão gerados e publicados, facilitando o uso para pipelines, por exemplo.

Ainda dentro do arquivo build.gradle do root do projeto, precisamos ter uma lista dos módulos que serão publicados. Onde fará mais sentido na explicação depois do módulo core:

Centralizando tudo em um único modulo

Agora que conseguimos criar e publicar nossas bibliotecas de maneira individual, nós precisamos criar um novo modulo com o "apply plugin: ‘com.android.library" para podermos centralizar todos esses AAR secundário gerados. Com isso, foi criado um modulo novo chamado de core, esse modulo não tem nada apenas será utilizado para ser o nosso futuro AAR centralizador.

Após a criação do módulo core, é preciso agora juntar todas as bibliotecas e publicar um único AAR centralizador. Criei um publish.gradle para facilitar o uso, ele possui a task responsável por publicar todos os AAR mencionados.

Caso não seja um módulo core, será utilizado a task publishLibsModule e serão publicados individualmente cada AAR secundário de cada modulo. Quando cair dentro da condição e for o modulo core conforme mostra na linha 12, será montado o pom-default.xml manualmente pegando o GROUP_ID, a versão do seus módulos e através daquela declaração de módulos mostrado acima no arquivo allDependencies.gradle será adicionado cada artefatoID referente a cada modulo do gradle dentro do pom-default.xml.

Visão de como será gerado o pom-default.xml:

Uma visão geral do exemplo explicado:

Após isso, você poderá buscar diretamente no seu .gradle que for utilizar esses AAR uma única referencia.

E isso é tudo galera. Agradeço qualquer feedback, você pode colocar nos comentários abaixo ou entrar em contato comigo no LinkedIn.

--

--