Edgêncio da Calista
GDG Maputo
Published in
3 min readJan 15, 2017

--

Melhore o Gradle Build Time do Projecto Android e Entenda mais sobre .dex Files

Viva pessoal, sejam todos bem vindos a bordo. Este é meu primeiro post no Medium e minhas publicações anteriores sobre o android encontram-se no meu blog nerdbegin. Hoje quero partilhar um pouco sobre Dalvik Exectable Format Files ou simplesmente .dex Files e também a influência que estes podem ter no Gradle Buid Time de um projecto android.

Dex Files! Mas o que vem a ser isto ?

Este é um conceito não muito frequente em publicações sobre o android e talvez por isso um pouco desconhecido por muitos desenvolvedores.

Pronto! creio que o parágrafo acima já agregou algum valor a esta publicação (heheheh).

Entenda que todo o código java do teu projecto android é compilado gerando ficheiros .class, ficheiros estes que a posterior sao convertidos pelo dex tool (dx) em ficheiros .dex tambem conhecidos por Dalvik Executable Format que por fim são empacotados em ficheiros .apk ! Mas é só isso? A resposta é nao! Isto é apenas o suficiente para despertar a curiosidade de ler mais sobre este assunto.

Mas então, e o Gradle Build Time?

Comecemos pelo Gradle, que como muitos já devem saber, nada mais é do que uma ferramenta de automação de builds que tem a peculiaridade de juntar o dinamismo e flexibilidade da biblioteca Ant com a gestão de dependências e as convenções do Maven e cujos arquivos de builds são scripts escritos na linguagem Groovy, por isso os arquivos do Gradle permitem que sejam feitas tarefas de programação no seu arquivo do configuração.

Assim, Gradle Build Time será o tempo que o Gradle leva para compilar o projecto até gerar o ficheiro .apk que vai ser executado num dispositivo que pode ser físico (Smartphone, Tablet, etc) ou virtual (android virtual device, genymotion emulator, etc).

A transposição ! O que uma coisa tem a ver com a outra?

Pois é, é exactamente este o ponto! aparentemente uma coisa não tem nada a ver com a outra. Porém não é bem assim que as coisas funcionam.

Como já referenciado antes nesta publicação, o Gradle para além da função de gestor de dependências, ele também é responsavel por fazer o build do projecto, e é aqui que há necessidade de se ter algum cuidado. Muitas vezes, adicionamos dependências de forma deliberada ao nosso projecto. Dependências estas que são geralmente recursos ou ficheiros contendo código que deverá ser tranformado numa fase intermediaria em ficheiros que devem ser executados pela maquina virtual Dalvik (.dex files).

O que acontece é que cada um destes ficheiros .dex tem um número limite de métodos a referenciar, ou seja, não pode passar de 64K, ou simplesmente 65536 métodos. Quando as dependencias adicionadas ao projecto fazem referência a um número de métodos superior a 64K, o Gradleerro ao fazer o Build do projecto:

A forma de resolver este erro, é habilitando o MultiDex, isto é, permitir que o Dex tool gere mais de um .dex file !

android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "mz.co.medium.post"
...

multiDexEnabled true
}

No entanto, isto faz com que o Gradle Build Time do projecto cresça exponencialmente, daí que há todo um cuidado a se observar quando vamos adicionar dependências ao nosso projecto.

Um conselho: Remova todas as referências desnecessárias do seu projecto e faça apenas importações de recursos que o seu projecto realmente precisa.

Consideremos que queira usar a API do Google Maps V2 em seu projecto:

Não recomendado:

dependencies {

compile 'com.android.support:multidex:1.0.1'
compile 'com.google.android.gms:play-services:10.0.1'
testCompile 'junit:junit:4.12'
}

Recomendado:

dependencies {

compile 'com.google.android.gms:play-services-maps:10.0.1'
testCompile 'junit:junit:4.12'
}

No lugar de importar toda a play services library, é mais sensato e correto apenas importar os recursos do google maps! Assim reduzimos a possibilidade de ter de habilitar o MultiDex e garantimos que o Build Time do nosso projecto não cresça.

Caso queira aprofundar mais sobre o este assunto, não deixe de conferir a documentação oficial do android. Por hoje é tudo, espero que tenham gostado desta dica. Para qualquer dúvida não hesite em deixar seu comentário!

Com os melhores cumprimentos,

Edgêncio da Calista !

--

--