Compilar el proyecto de Android desde la línea de comandos es lento

Estoy compilando mi (bastante simple, sólo 5 archivos con cientos de cientos LOC) de la aplicación de línea de comandos en OSX utilizando:

ant debug

Funciona. Pero funciona lentamente:

BUILD SUCCESSFUL Total time:

26 seconds

¿Porqué es eso? Toma mucho tiempo incluso si cambio sólo una línea en un archivo java. La mayor parte de este tiempo se gasta en la etapa dex (unos 20 segundos), que es AFAIK creando bytecode Dalvik. Pero mi amigo que también trabaja en el mismo proyecto en Windows usando Eclipse dice que la compilación toma sólo un segundo o dos en su máquina. ¿Hay algo que pueda hacer para acelerar este proceso?

Finalmente encontré una solución para esto! Es un poco un hack, pero funciona.

En primer lugar, vaya a su ANDROID-SDK / plataforma de herramientas de directorio, a continuación, cambie el nombre de la aplicación dx a otra cosa, como dextool , y finalmente crear nuevo archivo dx con contenido:

 #!/bin/sh shift dextool --dex --incremental --no-optimize $@ 

Reemplace "dextool" con el nombre que eligió antes. Esto prepend (indocumentado) – atributo incremental a cada invocación dex, que disminuirá masivamente los tiempos de construcción dexando sólo las clases que han cambiado entre las compilaciones. Ahora se ve así:

[dx] Merged dex A (1 defs/11,3KiB) with dex B (359 defs/1253,2KiB). Result is 359 defs/1519,3KiB. Took 0,5s

0.5s en lugar de 20s es una gran diferencia!

Editar – pocas observaciones:

  • Usted tiene que compilar su proyecto por lo menos una vez antes de usar esto, porque utiliza el archivo anterior de classes.dex
  • Puede tener problemas al usar otros toolchains de Android que hormigas

ACTUALIZAR:

Google lanzó SDK Tools 21.0, que hace que los ajustes anteriores sean abolidos, ya que soporta la predexicación. ¡Finalmente!

Incluso en 21.1.1 con el --incremental --no-optimize agregado en el dex.bat original es lento, así que me fui a calcular algo, el resultado es: si pides los archivos .jar pasados ​​a dex por Tamaño que obtiene un mejor rendimiento.

Vea https://code.google.com/p/android/issues/detail?id=79166 para actualizaciones, espero que estén de acuerdo y esto entra en vNext.

 #!/usr/bin/perl use strict; use warnings; #use Data::Dump qw(dump); use List::Util qw(first), qw(sum); # size of the argument, -s for files, -s on **/*.class for folders sub size { if (-d $_) { # directory size is sum of all class files in the dir recursively # account for pre-dexing and compression with a 25% decrease return sum(map { size($_) * 0.25 } <$_/*.class>) || 0; } return -s $_; # use built-in size operator } my $dx_args_with_args = qr/^--(output|positions|(no-)?optimize-list|dump-(to|width|method)|num-threads|main-dex-list|input-list)$/; my $nArgs = $#ARGV; # last argument like --blah, those are for dx my $lastArg = $nArgs - first { $ARGV[$nArgs - $_] =~ /^--/ } 0..$nArgs; if ($lastArg != -1 && $ARGV[$lastArg] =~ /$dx_args_with_args/) { $lastArg += 1; } my @inputs = map { $_->[1] } sort { $a->[0] <=> $b->[0] } map { [size(), $_] } @ARGV[$lastArg + 1 .. $nArgs]; print join(" ", @ARGV[0..$lastArg], @inputs); exit 0; 

Uso

  • Tener Perl en tu camino
  • Copie el script perl anterior a ANDROID-SDK / build-tools / vvv / dx.pl
  • Renombrar dx en ANDROID-SDK / build-tools / vvv /
    Unix: renombrar dx a dx-orig
    Windows: renombrar dx.bat a dx-orig.bat
  • Agregue un nuevo reemplazo dx que llame a través de:

Windows: dx.bat

 @echo off setlocal set args=%* for /f "delims=" %%i in ('perl "%~dp0dx.pl" %args%') do set args=%%i call "%~dp0dx-orig.bat" %args% endlocal 

Unix: dx

 #!/bin/sh dx-orig `perl dx.pl $@` 
  • Android sqlite / problema de rendimiento BLOB
  • Impacto de 'instanceof' en el código Java de Android
  • Cómo dibujar una imagen de fondo grande con libgdx - las mejores prácticas?
  • Android ViewPager y TabLayout no funcionan rápido
  • Archivo JSON VS SQLite android
  • Android: acelerómetro de lectura sin asignación de memoria?
  • Cómo configurar el color de fondo para Textview de forma programática para otro archivo xml?
  • Android: dibujar fondo sin GPU OverDraw como WhatsApp
  • Cómo reducir el tamaño de WebView dinámicamente de acuerdo a su contenido?
  • Android Ver animación - bajo rendimiento en pantallas grandes
  • Malo rendimiento al dibujar continuamente en CustomView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.