Desmitificando a utilização de módulos de features dinâmicas-O Guia prático

Rodrigo Vianna Calixto de Oliveira
CodandoTV
Published in
6 min readJun 20, 2024
https://www.youtube.com/watch?v=httqEshs_Bk

Configurar Módulos Dinâmicos é um dos grandes objetivos de todo desenvolvedor Android, basicamente essa é aquela funcionalidade que o Google nos fornece e pensamos.

"Pooo Eu quero colocar no projeto"

E devido as expectativas das entregas com o time de produto e até um pouco de ser um assunto meio místico, as vezes nunca vemos uma oportunidade real para isso, ou quando começar a colocar em um projeto de grande escala passamos por dificuldades, pois dependendo do tamanho do projeto pode demorar para fazer essa configuração devido a algumas peculiaridades de como funciona e conflitos de bibliotecas.

Devido a isso a ideia desse artigo é trazer um pouco a minha experiência e explicar de maneira resumida o que é um Dynamic Feature usando um Setup Wizard até porque já existem ótimos artigos que eu mesmo usei como referência também ( vou deixar abaixo nas referências), porém o foco principal será desmistificar o assunto dando algumas dicas, como utilizar de maneira genérica em um projeto real e o mais importante como testar de maneira eficiente.

Para dar um contexto para irmos logo para a prática vou explicar em um tweet sobre o Dynamic Feature.

Basicamente ele se aproveita do uso do Android App Bundle que tem como finalidade criar vários pacotes de recursos do seu projeto e ao disponibilizar para o usuário ele apenas faz o download para o usuário o que da fato vai usar seja diferença de processadores / resolução de imagens, e ai que entra o Dynamic Feature que é mais um pacote que fica separado lá na google play esperando ser baixado.

Setup Wizard

Antes de começar a mostrar a estrutura que criei para se utilizar um Dynamic Feature, eu vou mostrar uma forma muito fácil de fazer um sample junto com você, para que você ganhe mais confiança e ajude a desmitificar um pouco esse assunto.

Dentro do proprio Android Studio, vai na opção New module lá vai ter um template de Dynamic Feature

Adicione um titulo, no entanto é apenas visível para o usuário não sendo utilizado no desenvolvimento, e aproveita e inclui a opção Fusing , caso você deseja que seu módulo esteja disponível para dispositivos com Android 4.4 (API de nível 20) e inferior e incluído no multi-APK

Após isso, vamos entender o que o Android Studio criou de graça para você.

  1. Adicionou no settings.gradle seu modulo dinâmico para poder copilar
settings.gradle

2. Associou no build.gradle do app o seu Dynamic Feature, aproveita e adiciona a lib da linha 16 que será utilizado mais para frente.

3. E criou o modulo Dynamic Feature

E aqui já vai a primeira dica, caso tenha reparado eu coloquei um underscore no nome do meu modulo, e isso é necessário se você quiser fazer um modulo com nome composto e não quiser deixar tudo junto, pois o -(traço/dash) da um problema na hora de você copilar seu dynamic feature com o projeto.

The following feature module names contain invalid characters. Feature module names can only contain letters, digits and underscores.

4. Dentro desse modulo criou nosso AndroidManifest com algumas peculiaridades:

Deixei no arquivo o que cada linha criada pode te interessar, porém se quiser ver mais parâmetros esta no Developer Android da Google.

Foi adicionado um monte de coisa de graça pra gente, agora precisamos ainda configurar algumas coisas.

Dentro do build.gradle deste modulo adicione a lib do appCompat e a feautre-deliveryque é uma das libs da Google Play Core para criarmos nossa Activity.

E adicione o SplitCompat.installActivity(this) ele é super importante na hora quando você baixar seu modulo ele estar "pronto" para executar e achar os resources, ou você pode no seu applicationherdar por um SplitCompatApplication ou colocar no AndroidManifest esse "split", independente da maneira que você escolha adicione, caso contrário irá aparecer esse erro:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dynamicfeatureexample/br.com.rviannaoliveira.dynamic_feature.MyTestDynamicFeature}: android.content.res.Resources$NotFoundException: Resource ID #0x7e010000

E caso já tenha reparado o dynamic_feature associado no modulo app com a opção do dynamic_feature, mas não nas dependências, e no modulo do dynamic_feature você está vendo ele dependendo do modulo app.

Sim! parece confuso, mas vai ser bem pertinente na hora de você pensar como buildar em projetos reais!

Uma dica que vou dar agora é qualquer modulo criado como Dynamic Feature ele obedece as suas dependências e não é ele que dita as regras de como será sua configuração.

Nem tudo é feito tão automaticamente você ainda vai precisar configurar sua Activity do modulo app para chamar seu Dynamic Feature, mas não se preocupe o objetivo desse artigo é fazer você fazer primeiro funcionar para você entender a mecânica.

PS: o xml tem apenas um botão e um texto, então vou desconsiderar de colocar aqui.

Explicação de cada parte esta como comentário

Apenas copie por agora e da o Run ou se quiser utilizar o repositorio todo o código estará aqui.

Conseguiu rodar?

Porém nem tudo é o que parece, você pode ter executado e rodado, mas em tese você está apenas rodando o apk que já tem tudo dentro em tempo de compilação, mas não está fazendo o download da funcionalidade do modulo dynamic_feature.

Para isso funcionar você tem que executar como se tivesse instalando um bundle.

Tem duas formas de fazer isso aonde, neste artigo explico com detalhes XXXXXXX como você pode testar seu Dynamic Feature, porém recomendo fortemente você ir para o caminho do BundleTool.

bundletool é a ferramenta que o Android Studio, o Plug-in do Android para Gradle e o Google Play usam para criar um Android App Bundle. bundletool pode converter um pacote de app para vários APKs que serão implantados em dispositivos.

de maneira breve, você precisa instalar ele, no meu caso eu fiz pelo brew , então clique aqui para fazer essa configuração.

após isso você executa esse comando que basicamente é rodar o bundle + pegar o arquivo aab e transformar em uma "splits de apk" para poder ser instalado dentro do seu próprio dispositivo simulando o que seria com a loja.

./gradlew clean bundleDebug && bundletool build-apks --overwrite --local-testing --bundle  ${PATH_REPO}/app/build/outputs/bundle/debug/app-debug.aab  --output ${PATH_REPO}/apkset.apks && bundletool install-apks --apks ${PATH_REPO}/apkset.apks
300x650

Agora sim! Estamos fazendo nosso Dynamic Feature funcionar mesmo!!!

E para esse artigo é isso! A ideia era tentar te dar mais segurança para usar, e no próximo artigo iremos subir de nível e deixar de uma maneira genérica para poder usar em um modulo separado para poder baixar qualquer modulo pesando em projeto de grande escala, ficou interessado? Nos vemos la! _o/

Referências:

About Dynamic Delivery

On Demand Modules Codelab

Configure on demand delivery

Utilizando Módulos Dinâmicos no seu app Android

App Bundles and Dynamic feature modules

UX best practices for on demand delivery

me ajudou com algumas problemas de "Didnt find class"

--

--