segunda-feira, 13 de fevereiro de 2012

Reduzindo o tamanho do executável do Delphi


Prezados,

Bem com nova versão do Delphi o XE2 estou vendo muita gente migrar para ele. É realmente uma versão surpreendente. É fantástica. Muito vêem do 2007, ate do Delphi 7. Bem, mas nem como tudo são flores, acontece que você migrou para o Delphi XE2 compilou seu projeto e poxa vida... Como o executável ficou grande. =/ Bem vamos dar uma solução para isso, se é que você já não conheça.

UPX para compactar seu executável
Apresento a vocês o UPX. Ele vai comprimir seu executável como um ZIP, mas não perder as características de ser um executável, e  ainda consegue dar alguma proteção para engenharia reversa. O contra é que ele ainda não funciona para compilações com 64 bits.

Baixando o UPX
Se você estiver utilizando o Windows. Caso seu sistema operacional seja Linux vá ate o site: http://upx.sourceforge.net/ e baixe a versão mais adequada.

Instalando o UPX
Para instalar basta você descompactar o arquivo em uma pasta de sua preferência. E observar a existência de um arquivo UPX.exe
É este arquivo que vamos executar com alguns parâmetros para reduzir nosso executável.

Executando
Eu normalmente crio um arquivo “UPX.txt” com o seguinte
"C:\Nelson\ProjetoTeste\Win32\Debug\upx308w\upx.exe" -9 Project1.exe
Em seguida mudo o nome para “UPX .bat”
Bem você pode observar que o UPX aceita mais parâmetros,   -9 indica maior compressão já -1 indica mais velocidade e menos compressão. Assim por diante, há outras opções como visto na tela a seguir:


Conclusão
No meu aplicativo exemplo houve uma redução considerável, a casos que isso não acontece, alem disso você pode testar outros parâmetros para ver se obtêm melhores resultados. Para os curiosos de plantão meu arquivo tinha quase 12 MB ficou com 3,3MB.  E a razão por o Delphi ter arquivos tão grandes agora???? Boa parte se deve ao fato dele implementar compatibilidade com o Unicode.

Espero que tenha sido útil. Ate a próxima valeu. Duvidas, criticas, sugestões e correções vide comentários. =)

9 comentários:

  1. Legal Nelson .. vou experimentar ...

    Tenho que testar se não interfere no HardLock ...

    Vlw

    Abçs
    João Carlos

    ResponderExcluir
    Respostas
    1. Blz João Carlos, teste mesmo, e coloque aqui os resultados se deu certo ou não. Não esqueça de fazer o bakcup =)

      Abraços

      Excluir
  2. Utilizo-o ha anos mas tem limitações o seu artigo. Existem muitas maneiras de se diminuir o tamanho de um executável feito no Delphi e sinceramente, não era esta a fórmula maior que busco.
    ass: Dataprime

    ResponderExcluir
    Respostas
    1. Sem dúvidas existem muitas maneiras, essa é uma maneira simples e fácil de implementar. Podemos sugerir outras maneira, quais os seus requisitos???

      Excluir
  3. Para maior compressão, utilizo os seguintes parâmetros:
    upx --best --lzma [arquivo]

    ResponderExcluir
  4. Só vamos deixar claro que isso só diminui o espaço em disco usado e a transmissão na rede do .EXE, porém o consumo de memória RAM necessário para rodar é o mesmo ou até maior.

    ResponderExcluir
    Respostas
    1. Diminui o espaço físico no disco, o que ajuda a carregar na memoria RAM mais rapidamente. Porem demora um pouco mais para executar pois ao carregar ele vai descompactar.

      Excluir
  5. Para diminuir drasticamente o tamanho do executável usando o XE2, o melhor é proceder da seguinte forma:

    Project > Modify Skin Options. Desabilita o "Enable skin suport", pois por padrão vem habilitado essa opção, e com isso carrega todas as skins em todos os forms que são adicionados ao projeto.

    ResponderExcluir
  6. Grande Lincoln, eu acredito que essa opção é quando se usa o DevExpress...não? Na realidade essa engorda do Delphi ocorreu pela por vários motivos mas o principal é a implementação nativa do UNICODE que transforma todo char em 2 bytes. Como Delphi por conceito trata toda string como um novo endereço de moria ele acaba consumindo muito espaço. Algumas linguagens e IDE implementam uma lista de Strings onde vc coloca todas as string da lista e vai so indexando para onde quer usar. É uma saída mas não sei se os programadores Delphi se acostumarão com essa ideia. Se eu estiver enganado por favor me corrijam. Esse blog é pra isso mesmo, troca de informações dicas e aprendizagem continua.

    ResponderExcluir