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
- Para la eficiencia de bucle
- HttpClient ejecución de HttpPost significativamente más lento en Android 3.2 que 2.3.3
- Cómo mejorar el rendimiento de ViewFlipper / ViewAnimator
- Cómo ocultar la barra inferior del sistema en la tableta android
- ¿Por qué Google utiliza Canvas en la vista de la lista de conversaciones de aplicaciones de Gmail?
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?
- ¿Las bibliotecas externas hacen las aplicaciones más lentas?
- Modificar el comportamiento de carga de Cordova Plugin para acelerar el tiempo de carga
- ArrayAdapter de Listview Arregla () redibujo muy lento de notificydatasetchanged
- Está llamando libgdx SpriteBatch método de inicio y fin varias veces caro?
- Child Views Tomando demasiado tiempo para dibujar en la pantalla
- Utilizando el SDK de Android en un Mac, Eclipse es muy lento. ¿Cómo puedo acelerarlo?
- Cómo maximizar la eficiencia en este complejo escenario de transferencia de datos
- Hex to String en Java El rendimiento es demasiado lento
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: renombrardx
adx-orig
Windows: renombrardx.bat
adx-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 $@`
- Ocultación de la tostada para la prensa larga en la acción
- Google analytics no muestra al usuario activo en la vista general en tiempo real